* [dpdk-dev] [PATCH 0/2] add pipe event for optimizing negotiating @ 2018-03-28 5:49 xiangxia.m.yue 2018-03-28 5:49 ` [dpdk-dev] [PATCH 1/2] vhost: move stdbool header file to vhost.h xiangxia.m.yue ` (2 more replies) 0 siblings, 3 replies; 10+ messages in thread From: xiangxia.m.yue @ 2018-03-28 5:49 UTC (permalink / raw) To: jianfeng.tan; +Cc: dev, Tonghao Zhang From: Tonghao Zhang <xiangxia.m.yue@gmail.com> These patches depend on previous patches. 1. http://dpdk.org/dev/patchwork/patch/36440/ 2. http://dpdk.org/dev/patchwork/patch/36441/ Tonghao Zhang (2): vhost: move stdbool header file to vhost.h vhost: add pipe event for optimizing negotiating lib/librte_vhost/fd_man.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++ lib/librte_vhost/fd_man.h | 16 ++++++++++++++++ lib/librte_vhost/socket.c | 15 ++++++++++++++- lib/librte_vhost/vhost.h | 1 + 4 files changed, 80 insertions(+), 1 deletion(-) -- 1.8.3.1 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [dpdk-dev] [PATCH 1/2] vhost: move stdbool header file to vhost.h 2018-03-28 5:49 [dpdk-dev] [PATCH 0/2] add pipe event for optimizing negotiating xiangxia.m.yue @ 2018-03-28 5:49 ` xiangxia.m.yue 2018-03-30 8:09 ` Maxime Coquelin 2018-03-28 5:49 ` [dpdk-dev] [PATCH 2/2] vhost: add pipe event for optimizing negotiating xiangxia.m.yue 2018-03-30 8:17 ` [dpdk-dev] [PATCH 0/2] " Maxime Coquelin 2 siblings, 1 reply; 10+ messages in thread From: xiangxia.m.yue @ 2018-03-28 5:49 UTC (permalink / raw) To: jianfeng.tan; +Cc: dev, Tonghao Zhang From: Tonghao Zhang <xiangxia.m.yue@gmail.com> The vhost.h file uses bool type, but not include stdbool header file. If other c files include vhost.h directly, there will be a compile error. This patch will be used in the next patch. Signed-off-by: Tonghao Zhang <xiangxia.m.yue@gmail.com> --- lib/librte_vhost/socket.c | 1 - lib/librte_vhost/vhost.h | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c index 1352339..95bed78 100644 --- a/lib/librte_vhost/socket.c +++ b/lib/librte_vhost/socket.c @@ -4,7 +4,6 @@ #include <stdint.h> #include <stdio.h> -#include <stdbool.h> #include <limits.h> #include <stdlib.h> #include <unistd.h> diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h index d947bc9..37edb48 100644 --- a/lib/librte_vhost/vhost.h +++ b/lib/librte_vhost/vhost.h @@ -6,6 +6,7 @@ #define _VHOST_NET_CDEV_H_ #include <stdint.h> #include <stdio.h> +#include <stdbool.h> #include <sys/types.h> #include <sys/queue.h> #include <unistd.h> -- 1.8.3.1 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [dpdk-dev] [PATCH 1/2] vhost: move stdbool header file to vhost.h 2018-03-28 5:49 ` [dpdk-dev] [PATCH 1/2] vhost: move stdbool header file to vhost.h xiangxia.m.yue @ 2018-03-30 8:09 ` Maxime Coquelin 0 siblings, 0 replies; 10+ messages in thread From: Maxime Coquelin @ 2018-03-30 8:09 UTC (permalink / raw) To: xiangxia.m.yue, jianfeng.tan; +Cc: dev On 03/28/2018 07:49 AM, xiangxia.m.yue@gmail.com wrote: > From: Tonghao Zhang <xiangxia.m.yue@gmail.com> > > The vhost.h file uses bool type, but not include stdbool > header file. If other c files include vhost.h directly, > there will be a compile error. > > This patch will be used in the next patch. > > Signed-off-by: Tonghao Zhang <xiangxia.m.yue@gmail.com> > --- > lib/librte_vhost/socket.c | 1 - > lib/librte_vhost/vhost.h | 1 + > 2 files changed, 1 insertion(+), 1 deletion(-) Reviewed-by: Maxime Cqouelin <maxime.coquelin@redhat.com> Thanks, Maxime ^ permalink raw reply [flat|nested] 10+ messages in thread
* [dpdk-dev] [PATCH 2/2] vhost: add pipe event for optimizing negotiating 2018-03-28 5:49 [dpdk-dev] [PATCH 0/2] add pipe event for optimizing negotiating xiangxia.m.yue 2018-03-28 5:49 ` [dpdk-dev] [PATCH 1/2] vhost: move stdbool header file to vhost.h xiangxia.m.yue @ 2018-03-28 5:49 ` xiangxia.m.yue 2018-03-29 7:32 ` Tan, Jianfeng 2018-03-30 8:17 ` [dpdk-dev] [PATCH 0/2] " Maxime Coquelin 2 siblings, 1 reply; 10+ messages in thread From: xiangxia.m.yue @ 2018-03-28 5:49 UTC (permalink / raw) To: jianfeng.tan; +Cc: dev, Tonghao Zhang From: Tonghao Zhang <xiangxia.m.yue@gmail.com> When vhost—user connects qemu successfully, dpdk will call the vhost_user_add_connection to add unix socket fd to poll. And fdset_add only set the socket fd to a fdentry while poll may sleep now. In a general case, this is no problem. But if we use hot update for vhost-user, most downtime of VMs network is 750+ms. This patch adds pipe event, so after connections are ok, dpdk rebuild the poll immediately. With this patch, the most downtime is 20~30ms. Signed-off-by: Tonghao Zhang <xiangxia.m.yue@gmail.com> --- lib/librte_vhost/fd_man.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++ lib/librte_vhost/fd_man.h | 16 ++++++++++++++++ lib/librte_vhost/socket.c | 14 ++++++++++++++ 3 files changed, 79 insertions(+) diff --git a/lib/librte_vhost/fd_man.c b/lib/librte_vhost/fd_man.c index 181711c..7716757 100644 --- a/lib/librte_vhost/fd_man.c +++ b/lib/librte_vhost/fd_man.c @@ -15,6 +15,7 @@ #include <rte_log.h> #include "fd_man.h" +#include "vhost.h" #define FDPOLLERR (POLLERR | POLLHUP | POLLNVAL) @@ -272,3 +273,51 @@ return NULL; } + +static void +fdset_pipe_read_cb(int readfd, void *dat __rte_unused, + int *remove __rte_unused) +{ + char charbuf[16]; + read(readfd, charbuf, sizeof(charbuf)); +} + +void +fdset_pipe_uninit(struct fdset *fdset) +{ + fdset_del(fdset, fdset->u.readfd); + close(fdset->u.readfd); + close(fdset->u.writefd); +} + +int +fdset_pipe_init(struct fdset *fdset) +{ + int ret; + + if (pipe(fdset->u.pipefd) < 0) { + RTE_LOG(ERR, VHOST_CONFIG, + "failed to create pipe for vhost fdset\n"); + return -1; + } + + ret = fdset_add(fdset, fdset->u.readfd, + fdset_pipe_read_cb, NULL, NULL); + + if (ret < 0) { + RTE_LOG(ERR, VHOST_CONFIG, + "failed to add pipe readfd %d into vhost server fdset\n", + fdset->u.readfd); + + fdset_pipe_uninit(fdset); + return -1; + } + + return 0; +} + +void +fdset_pipe_notify(struct fdset *fdset) +{ + write(fdset->u.writefd, "1", 1); +} diff --git a/lib/librte_vhost/fd_man.h b/lib/librte_vhost/fd_man.h index 3a9276c..76a42fb 100644 --- a/lib/librte_vhost/fd_man.h +++ b/lib/librte_vhost/fd_man.h @@ -25,6 +25,16 @@ struct fdset { struct fdentry fd[MAX_FDS]; pthread_mutex_t fd_mutex; int num; /* current fd number of this fdset */ + + union pipefds { + struct { + int pipefd[2]; + }; + struct { + int readfd; + int writefd; + }; + } u; }; @@ -37,4 +47,10 @@ int fdset_add(struct fdset *pfdset, int fd, void *fdset_event_dispatch(void *arg); +int fdset_pipe_init(struct fdset *fdset); + +void fdset_pipe_uninit(struct fdset *fdset); + +void fdset_pipe_notify(struct fdset *fdset); + #endif diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c index 95bed78..795239c 100644 --- a/lib/librte_vhost/socket.c +++ b/lib/librte_vhost/socket.c @@ -231,6 +231,8 @@ struct vhost_user { pthread_mutex_lock(&vsocket->conn_mutex); TAILQ_INSERT_TAIL(&vsocket->conn_list, conn, next); pthread_mutex_unlock(&vsocket->conn_mutex); + + fdset_pipe_notify(&vhost_user.fdset); return; err: @@ -829,11 +831,23 @@ struct vhost_device_ops const * return -1; if (fdset_tid == 0) { + /** + * create a pipe which will be waited by poll and notified to + * rebuild the wait list of poll. + */ + if (fdset_pipe_init(&vhost_user.fdset) < 0) { + RTE_LOG(ERR, VHOST_CONFIG, + "failed to create pipe for vhost fdset\n"); + return -1; + } + int ret = pthread_create(&fdset_tid, NULL, fdset_event_dispatch, &vhost_user.fdset); if (ret != 0) { RTE_LOG(ERR, VHOST_CONFIG, "failed to create fdset handling thread"); + + fdset_pipe_uninit(&vhost_user.fdset); return -1; } else { snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, -- 1.8.3.1 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [dpdk-dev] [PATCH 2/2] vhost: add pipe event for optimizing negotiating 2018-03-28 5:49 ` [dpdk-dev] [PATCH 2/2] vhost: add pipe event for optimizing negotiating xiangxia.m.yue @ 2018-03-29 7:32 ` Tan, Jianfeng 2018-03-29 11:24 ` Tonghao Zhang 0 siblings, 1 reply; 10+ messages in thread From: Tan, Jianfeng @ 2018-03-29 7:32 UTC (permalink / raw) To: xiangxia.m.yue; +Cc: dev Hi Xiangxia, > -----Original Message----- > From: xiangxia.m.yue@gmail.com [mailto:xiangxia.m.yue@gmail.com] > Sent: Wednesday, March 28, 2018 1:49 PM > To: Tan, Jianfeng > Cc: dev@dpdk.org; Tonghao Zhang > Subject: [PATCH 2/2] vhost: add pipe event for optimizing negotiating > > From: Tonghao Zhang <xiangxia.m.yue@gmail.com> > > When vhost—user connects qemu successfully, dpdk will call Typo: "-" > the vhost_user_add_connection to add unix socket fd to poll. > And fdset_add only set the socket fd to a fdentry while poll > may sleep now. In a general case, this is no problem. But if > we use hot update for vhost-user, most downtime of VMs network > is 750+ms. This patch adds pipe event, so after connections are > ok, dpdk rebuild the poll immediately. With this patch, the > most downtime is 20~30ms. > > Signed-off-by: Tonghao Zhang <xiangxia.m.yue@gmail.com> > --- > lib/librte_vhost/fd_man.c | 49 > +++++++++++++++++++++++++++++++++++++++++++++++ > lib/librte_vhost/fd_man.h | 16 ++++++++++++++++ > lib/librte_vhost/socket.c | 14 ++++++++++++++ > 3 files changed, 79 insertions(+) > > diff --git a/lib/librte_vhost/fd_man.c b/lib/librte_vhost/fd_man.c > index 181711c..7716757 100644 > --- a/lib/librte_vhost/fd_man.c > +++ b/lib/librte_vhost/fd_man.c > @@ -15,6 +15,7 @@ > #include <rte_log.h> > > #include "fd_man.h" > +#include "vhost.h" This is a nice finding and solution, however, I don't think we shall include vhost header file in fd related files. Actually, I did not find out why you need to include this header file. Thanks, Jianfeng > > #define FDPOLLERR (POLLERR | POLLHUP | POLLNVAL) > > @@ -272,3 +273,51 @@ > > return NULL; > } > + > +static void > +fdset_pipe_read_cb(int readfd, void *dat __rte_unused, > + int *remove __rte_unused) > +{ > + char charbuf[16]; > + read(readfd, charbuf, sizeof(charbuf)); > +} > + > +void > +fdset_pipe_uninit(struct fdset *fdset) > +{ > + fdset_del(fdset, fdset->u.readfd); > + close(fdset->u.readfd); > + close(fdset->u.writefd); > +} > + > +int > +fdset_pipe_init(struct fdset *fdset) > +{ > + int ret; > + > + if (pipe(fdset->u.pipefd) < 0) { > + RTE_LOG(ERR, VHOST_CONFIG, > + "failed to create pipe for vhost fdset\n"); > + return -1; > + } > + > + ret = fdset_add(fdset, fdset->u.readfd, > + fdset_pipe_read_cb, NULL, NULL); > + > + if (ret < 0) { > + RTE_LOG(ERR, VHOST_CONFIG, > + "failed to add pipe readfd %d into vhost server > fdset\n", > + fdset->u.readfd); > + > + fdset_pipe_uninit(fdset); > + return -1; > + } > + > + return 0; > +} > + > +void > +fdset_pipe_notify(struct fdset *fdset) > +{ > + write(fdset->u.writefd, "1", 1); > +} > diff --git a/lib/librte_vhost/fd_man.h b/lib/librte_vhost/fd_man.h > index 3a9276c..76a42fb 100644 > --- a/lib/librte_vhost/fd_man.h > +++ b/lib/librte_vhost/fd_man.h > @@ -25,6 +25,16 @@ struct fdset { > struct fdentry fd[MAX_FDS]; > pthread_mutex_t fd_mutex; > int num; /* current fd number of this fdset */ > + > + union pipefds { > + struct { > + int pipefd[2]; > + }; > + struct { > + int readfd; > + int writefd; > + }; > + } u; > }; > > > @@ -37,4 +47,10 @@ int fdset_add(struct fdset *pfdset, int fd, > > void *fdset_event_dispatch(void *arg); > > +int fdset_pipe_init(struct fdset *fdset); > + > +void fdset_pipe_uninit(struct fdset *fdset); > + > +void fdset_pipe_notify(struct fdset *fdset); > + > #endif > diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c > index 95bed78..795239c 100644 > --- a/lib/librte_vhost/socket.c > +++ b/lib/librte_vhost/socket.c > @@ -231,6 +231,8 @@ struct vhost_user { > pthread_mutex_lock(&vsocket->conn_mutex); > TAILQ_INSERT_TAIL(&vsocket->conn_list, conn, next); > pthread_mutex_unlock(&vsocket->conn_mutex); > + > + fdset_pipe_notify(&vhost_user.fdset); > return; > > err: > @@ -829,11 +831,23 @@ struct vhost_device_ops const * > return -1; > > if (fdset_tid == 0) { > + /** > + * create a pipe which will be waited by poll and notified to > + * rebuild the wait list of poll. > + */ > + if (fdset_pipe_init(&vhost_user.fdset) < 0) { > + RTE_LOG(ERR, VHOST_CONFIG, > + "failed to create pipe for vhost fdset\n"); > + return -1; > + } > + > int ret = pthread_create(&fdset_tid, NULL, fdset_event_dispatch, > &vhost_user.fdset); > if (ret != 0) { > RTE_LOG(ERR, VHOST_CONFIG, > "failed to create fdset handling thread"); > + > + fdset_pipe_uninit(&vhost_user.fdset); > return -1; > } else { > snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, > -- > 1.8.3.1 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [dpdk-dev] [PATCH 2/2] vhost: add pipe event for optimizing negotiating 2018-03-29 7:32 ` Tan, Jianfeng @ 2018-03-29 11:24 ` Tonghao Zhang 2018-03-30 7:57 ` Maxime Coquelin 0 siblings, 1 reply; 10+ messages in thread From: Tonghao Zhang @ 2018-03-29 11:24 UTC (permalink / raw) To: Tan, Jianfeng; +Cc: dev On Thu, Mar 29, 2018 at 3:32 PM, Tan, Jianfeng <jianfeng.tan@intel.com> wrote: > Hi Xiangxia, > >> -----Original Message----- >> From: xiangxia.m.yue@gmail.com [mailto:xiangxia.m.yue@gmail.com] >> Sent: Wednesday, March 28, 2018 1:49 PM >> To: Tan, Jianfeng >> Cc: dev@dpdk.org; Tonghao Zhang >> Subject: [PATCH 2/2] vhost: add pipe event for optimizing negotiating >> >> From: Tonghao Zhang <xiangxia.m.yue@gmail.com> >> >> When vhost—user connects qemu successfully, dpdk will call > > Typo: "-" v2 will update it. :) >> the vhost_user_add_connection to add unix socket fd to poll. >> And fdset_add only set the socket fd to a fdentry while poll >> may sleep now. In a general case, this is no problem. But if >> we use hot update for vhost-user, most downtime of VMs network >> is 750+ms. This patch adds pipe event, so after connections are >> ok, dpdk rebuild the poll immediately. With this patch, the >> most downtime is 20~30ms. >> >> Signed-off-by: Tonghao Zhang <xiangxia.m.yue@gmail.com> >> --- >> lib/librte_vhost/fd_man.c | 49 >> +++++++++++++++++++++++++++++++++++++++++++++++ >> lib/librte_vhost/fd_man.h | 16 ++++++++++++++++ >> lib/librte_vhost/socket.c | 14 ++++++++++++++ >> 3 files changed, 79 insertions(+) >> >> diff --git a/lib/librte_vhost/fd_man.c b/lib/librte_vhost/fd_man.c >> index 181711c..7716757 100644 >> --- a/lib/librte_vhost/fd_man.c >> +++ b/lib/librte_vhost/fd_man.c >> @@ -15,6 +15,7 @@ >> #include <rte_log.h> >> >> #include "fd_man.h" >> +#include "vhost.h" > > This is a nice finding and solution, however, I don't think we shall include vhost header file in fd related files. Actually, I did not find out why you need to include this header file. Hi Jianfeng, thanks for your review. In the fdset_pipe_init function, I call the RTE_LOG with VHOST_CONFIG, when init pipe not successfully. So I included the vhost header file. > Thanks, > Jianfeng > >> >> #define FDPOLLERR (POLLERR | POLLHUP | POLLNVAL) >> >> @@ -272,3 +273,51 @@ >> >> return NULL; >> } >> + >> +static void >> +fdset_pipe_read_cb(int readfd, void *dat __rte_unused, >> + int *remove __rte_unused) >> +{ >> + char charbuf[16]; >> + read(readfd, charbuf, sizeof(charbuf)); >> +} >> + >> +void >> +fdset_pipe_uninit(struct fdset *fdset) >> +{ >> + fdset_del(fdset, fdset->u.readfd); >> + close(fdset->u.readfd); >> + close(fdset->u.writefd); >> +} >> + >> +int >> +fdset_pipe_init(struct fdset *fdset) >> +{ >> + int ret; >> + >> + if (pipe(fdset->u.pipefd) < 0) { >> + RTE_LOG(ERR, VHOST_CONFIG, >> + "failed to create pipe for vhost fdset\n"); >> + return -1; >> + } >> + >> + ret = fdset_add(fdset, fdset->u.readfd, >> + fdset_pipe_read_cb, NULL, NULL); >> + >> + if (ret < 0) { >> + RTE_LOG(ERR, VHOST_CONFIG, >> + "failed to add pipe readfd %d into vhost server >> fdset\n", >> + fdset->u.readfd); >> + >> + fdset_pipe_uninit(fdset); >> + return -1; >> + } >> + >> + return 0; >> +} >> + >> +void >> +fdset_pipe_notify(struct fdset *fdset) >> +{ >> + write(fdset->u.writefd, "1", 1); >> +} >> diff --git a/lib/librte_vhost/fd_man.h b/lib/librte_vhost/fd_man.h >> index 3a9276c..76a42fb 100644 >> --- a/lib/librte_vhost/fd_man.h >> +++ b/lib/librte_vhost/fd_man.h >> @@ -25,6 +25,16 @@ struct fdset { >> struct fdentry fd[MAX_FDS]; >> pthread_mutex_t fd_mutex; >> int num; /* current fd number of this fdset */ >> + >> + union pipefds { >> + struct { >> + int pipefd[2]; >> + }; >> + struct { >> + int readfd; >> + int writefd; >> + }; >> + } u; >> }; >> >> >> @@ -37,4 +47,10 @@ int fdset_add(struct fdset *pfdset, int fd, >> >> void *fdset_event_dispatch(void *arg); >> >> +int fdset_pipe_init(struct fdset *fdset); >> + >> +void fdset_pipe_uninit(struct fdset *fdset); >> + >> +void fdset_pipe_notify(struct fdset *fdset); >> + >> #endif >> diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c >> index 95bed78..795239c 100644 >> --- a/lib/librte_vhost/socket.c >> +++ b/lib/librte_vhost/socket.c >> @@ -231,6 +231,8 @@ struct vhost_user { >> pthread_mutex_lock(&vsocket->conn_mutex); >> TAILQ_INSERT_TAIL(&vsocket->conn_list, conn, next); >> pthread_mutex_unlock(&vsocket->conn_mutex); >> + >> + fdset_pipe_notify(&vhost_user.fdset); >> return; >> >> err: >> @@ -829,11 +831,23 @@ struct vhost_device_ops const * >> return -1; >> >> if (fdset_tid == 0) { >> + /** >> + * create a pipe which will be waited by poll and notified to >> + * rebuild the wait list of poll. >> + */ >> + if (fdset_pipe_init(&vhost_user.fdset) < 0) { >> + RTE_LOG(ERR, VHOST_CONFIG, >> + "failed to create pipe for vhost fdset\n"); >> + return -1; >> + } >> + >> int ret = pthread_create(&fdset_tid, NULL, fdset_event_dispatch, >> &vhost_user.fdset); >> if (ret != 0) { >> RTE_LOG(ERR, VHOST_CONFIG, >> "failed to create fdset handling thread"); >> + >> + fdset_pipe_uninit(&vhost_user.fdset); >> return -1; >> } else { >> snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, >> -- >> 1.8.3.1 > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [dpdk-dev] [PATCH 2/2] vhost: add pipe event for optimizing negotiating 2018-03-29 11:24 ` Tonghao Zhang @ 2018-03-30 7:57 ` Maxime Coquelin 2018-03-30 8:07 ` Tonghao Zhang 0 siblings, 1 reply; 10+ messages in thread From: Maxime Coquelin @ 2018-03-30 7:57 UTC (permalink / raw) To: Tonghao Zhang, Tan, Jianfeng; +Cc: dev Hi Xiangxia, On 03/29/2018 01:24 PM, Tonghao Zhang wrote: > On Thu, Mar 29, 2018 at 3:32 PM, Tan, Jianfeng <jianfeng.tan@intel.com> wrote: >> Hi Xiangxia, >> >>> -----Original Message----- >>> From: xiangxia.m.yue@gmail.com [mailto:xiangxia.m.yue@gmail.com] >>> Sent: Wednesday, March 28, 2018 1:49 PM >>> To: Tan, Jianfeng >>> Cc: dev@dpdk.org; Tonghao Zhang >>> Subject: [PATCH 2/2] vhost: add pipe event for optimizing negotiating >>> >>> From: Tonghao Zhang <xiangxia.m.yue@gmail.com> >>> >>> When vhost—user connects qemu successfully, dpdk will call >> >> Typo: "-" > v2 will update it. :) > >>> the vhost_user_add_connection to add unix socket fd to poll. >>> And fdset_add only set the socket fd to a fdentry while poll >>> may sleep now. In a general case, this is no problem. But if >>> we use hot update for vhost-user, most downtime of VMs network >>> is 750+ms. This patch adds pipe event, so after connections are >>> ok, dpdk rebuild the poll immediately. With this patch, the >>> most downtime is 20~30ms. >>> >>> Signed-off-by: Tonghao Zhang <xiangxia.m.yue@gmail.com> >>> --- >>> lib/librte_vhost/fd_man.c | 49 >>> +++++++++++++++++++++++++++++++++++++++++++++++ >>> lib/librte_vhost/fd_man.h | 16 ++++++++++++++++ >>> lib/librte_vhost/socket.c | 14 ++++++++++++++ >>> 3 files changed, 79 insertions(+) >>> >>> diff --git a/lib/librte_vhost/fd_man.c b/lib/librte_vhost/fd_man.c >>> index 181711c..7716757 100644 >>> --- a/lib/librte_vhost/fd_man.c >>> +++ b/lib/librte_vhost/fd_man.c >>> @@ -15,6 +15,7 @@ >>> #include <rte_log.h> >>> >>> #include "fd_man.h" >>> +#include "vhost.h" >> >> This is a nice finding and solution, however, I don't think we shall include vhost header file in fd related files. Actually, I did not find out why you need to include this header file. > > Hi Jianfeng, thanks for your review. In the fdset_pipe_init function, > I call the RTE_LOG with VHOST_CONFIG, when init pipe not successfully. > So I included the vhost header file. Maybe better to create VHOST_SOCKET in socket.c, than including vhost.h that creates a layer violation: #define RTE_LOGTYPE_VHOST_SOCKET RTE_LOGTYPE_USER1 Is it Ok for you? I so no need to resend, I can handle the change when applying. Thanks, Maxime > > >> Thanks, >> Jianfeng >> >>> >>> #define FDPOLLERR (POLLERR | POLLHUP | POLLNVAL) >>> >>> @@ -272,3 +273,51 @@ >>> >>> return NULL; >>> } >>> + >>> +static void >>> +fdset_pipe_read_cb(int readfd, void *dat __rte_unused, >>> + int *remove __rte_unused) >>> +{ >>> + char charbuf[16]; >>> + read(readfd, charbuf, sizeof(charbuf)); >>> +} >>> + >>> +void >>> +fdset_pipe_uninit(struct fdset *fdset) >>> +{ >>> + fdset_del(fdset, fdset->u.readfd); >>> + close(fdset->u.readfd); >>> + close(fdset->u.writefd); >>> +} >>> + >>> +int >>> +fdset_pipe_init(struct fdset *fdset) >>> +{ >>> + int ret; >>> + >>> + if (pipe(fdset->u.pipefd) < 0) { >>> + RTE_LOG(ERR, VHOST_CONFIG, >>> + "failed to create pipe for vhost fdset\n"); >>> + return -1; >>> + } >>> + >>> + ret = fdset_add(fdset, fdset->u.readfd, >>> + fdset_pipe_read_cb, NULL, NULL); >>> + >>> + if (ret < 0) { >>> + RTE_LOG(ERR, VHOST_CONFIG, >>> + "failed to add pipe readfd %d into vhost server >>> fdset\n", >>> + fdset->u.readfd); >>> + >>> + fdset_pipe_uninit(fdset); >>> + return -1; >>> + } >>> + >>> + return 0; >>> +} >>> + >>> +void >>> +fdset_pipe_notify(struct fdset *fdset) >>> +{ >>> + write(fdset->u.writefd, "1", 1); >>> +} >>> diff --git a/lib/librte_vhost/fd_man.h b/lib/librte_vhost/fd_man.h >>> index 3a9276c..76a42fb 100644 >>> --- a/lib/librte_vhost/fd_man.h >>> +++ b/lib/librte_vhost/fd_man.h >>> @@ -25,6 +25,16 @@ struct fdset { >>> struct fdentry fd[MAX_FDS]; >>> pthread_mutex_t fd_mutex; >>> int num; /* current fd number of this fdset */ >>> + >>> + union pipefds { >>> + struct { >>> + int pipefd[2]; >>> + }; >>> + struct { >>> + int readfd; >>> + int writefd; >>> + }; >>> + } u; >>> }; >>> >>> >>> @@ -37,4 +47,10 @@ int fdset_add(struct fdset *pfdset, int fd, >>> >>> void *fdset_event_dispatch(void *arg); >>> >>> +int fdset_pipe_init(struct fdset *fdset); >>> + >>> +void fdset_pipe_uninit(struct fdset *fdset); >>> + >>> +void fdset_pipe_notify(struct fdset *fdset); >>> + >>> #endif >>> diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c >>> index 95bed78..795239c 100644 >>> --- a/lib/librte_vhost/socket.c >>> +++ b/lib/librte_vhost/socket.c >>> @@ -231,6 +231,8 @@ struct vhost_user { >>> pthread_mutex_lock(&vsocket->conn_mutex); >>> TAILQ_INSERT_TAIL(&vsocket->conn_list, conn, next); >>> pthread_mutex_unlock(&vsocket->conn_mutex); >>> + >>> + fdset_pipe_notify(&vhost_user.fdset); >>> return; >>> >>> err: >>> @@ -829,11 +831,23 @@ struct vhost_device_ops const * >>> return -1; >>> >>> if (fdset_tid == 0) { >>> + /** >>> + * create a pipe which will be waited by poll and notified to >>> + * rebuild the wait list of poll. >>> + */ >>> + if (fdset_pipe_init(&vhost_user.fdset) < 0) { >>> + RTE_LOG(ERR, VHOST_CONFIG, >>> + "failed to create pipe for vhost fdset\n"); >>> + return -1; >>> + } >>> + >>> int ret = pthread_create(&fdset_tid, NULL, fdset_event_dispatch, >>> &vhost_user.fdset); >>> if (ret != 0) { >>> RTE_LOG(ERR, VHOST_CONFIG, >>> "failed to create fdset handling thread"); >>> + >>> + fdset_pipe_uninit(&vhost_user.fdset); >>> return -1; >>> } else { >>> snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, >>> -- >>> 1.8.3.1 >> ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [dpdk-dev] [PATCH 2/2] vhost: add pipe event for optimizing negotiating 2018-03-30 7:57 ` Maxime Coquelin @ 2018-03-30 8:07 ` Tonghao Zhang 2018-03-30 8:09 ` Maxime Coquelin 0 siblings, 1 reply; 10+ messages in thread From: Tonghao Zhang @ 2018-03-30 8:07 UTC (permalink / raw) To: Maxime Coquelin; +Cc: Tan, Jianfeng, dev On Fri, Mar 30, 2018 at 3:57 PM, Maxime Coquelin <maxime.coquelin@redhat.com> wrote: > Hi Xiangxia, > > > On 03/29/2018 01:24 PM, Tonghao Zhang wrote: >> >> On Thu, Mar 29, 2018 at 3:32 PM, Tan, Jianfeng <jianfeng.tan@intel.com> >> wrote: >>> >>> Hi Xiangxia, >>> >>>> -----Original Message----- >>>> From: xiangxia.m.yue@gmail.com [mailto:xiangxia.m.yue@gmail.com] >>>> Sent: Wednesday, March 28, 2018 1:49 PM >>>> To: Tan, Jianfeng >>>> Cc: dev@dpdk.org; Tonghao Zhang >>>> Subject: [PATCH 2/2] vhost: add pipe event for optimizing negotiating >>>> >>>> From: Tonghao Zhang <xiangxia.m.yue@gmail.com> >>>> >>>> When vhost—user connects qemu successfully, dpdk will call >>> >>> >>> Typo: "-" >> >> v2 will update it. :) >> >>>> the vhost_user_add_connection to add unix socket fd to poll. >>>> And fdset_add only set the socket fd to a fdentry while poll >>>> may sleep now. In a general case, this is no problem. But if >>>> we use hot update for vhost-user, most downtime of VMs network >>>> is 750+ms. This patch adds pipe event, so after connections are >>>> ok, dpdk rebuild the poll immediately. With this patch, the >>>> most downtime is 20~30ms. >>>> >>>> Signed-off-by: Tonghao Zhang <xiangxia.m.yue@gmail.com> >>>> --- >>>> lib/librte_vhost/fd_man.c | 49 >>>> +++++++++++++++++++++++++++++++++++++++++++++++ >>>> lib/librte_vhost/fd_man.h | 16 ++++++++++++++++ >>>> lib/librte_vhost/socket.c | 14 ++++++++++++++ >>>> 3 files changed, 79 insertions(+) >>>> >>>> diff --git a/lib/librte_vhost/fd_man.c b/lib/librte_vhost/fd_man.c >>>> index 181711c..7716757 100644 >>>> --- a/lib/librte_vhost/fd_man.c >>>> +++ b/lib/librte_vhost/fd_man.c >>>> @@ -15,6 +15,7 @@ >>>> #include <rte_log.h> >>>> >>>> #include "fd_man.h" >>>> +#include "vhost.h" >>> >>> >>> This is a nice finding and solution, however, I don't think we shall >>> include vhost header file in fd related files. Actually, I did not find out >>> why you need to include this header file. >> >> >> Hi Jianfeng, thanks for your review. In the fdset_pipe_init function, >> I call the RTE_LOG with VHOST_CONFIG, when init pipe not successfully. >> So I included the vhost header file. > > > Maybe better to create VHOST_SOCKET in socket.c, than including vhost.h that > creates a layer violation: > > #define RTE_LOGTYPE_VHOST_SOCKET RTE_LOGTYPE_USER1 > > Is it Ok for you? I so no need to resend, I can handle the change when > applying. yes, thanks. > > Thanks, > Maxime > >> >> >>> Thanks, >>> Jianfeng >>> >>>> >>>> #define FDPOLLERR (POLLERR | POLLHUP | POLLNVAL) >>>> >>>> @@ -272,3 +273,51 @@ >>>> >>>> return NULL; >>>> } >>>> + >>>> +static void >>>> +fdset_pipe_read_cb(int readfd, void *dat __rte_unused, >>>> + int *remove __rte_unused) >>>> +{ >>>> + char charbuf[16]; >>>> + read(readfd, charbuf, sizeof(charbuf)); >>>> +} >>>> + >>>> +void >>>> +fdset_pipe_uninit(struct fdset *fdset) >>>> +{ >>>> + fdset_del(fdset, fdset->u.readfd); >>>> + close(fdset->u.readfd); >>>> + close(fdset->u.writefd); >>>> +} >>>> + >>>> +int >>>> +fdset_pipe_init(struct fdset *fdset) >>>> +{ >>>> + int ret; >>>> + >>>> + if (pipe(fdset->u.pipefd) < 0) { >>>> + RTE_LOG(ERR, VHOST_CONFIG, >>>> + "failed to create pipe for vhost fdset\n"); >>>> + return -1; >>>> + } >>>> + >>>> + ret = fdset_add(fdset, fdset->u.readfd, >>>> + fdset_pipe_read_cb, NULL, NULL); >>>> + >>>> + if (ret < 0) { >>>> + RTE_LOG(ERR, VHOST_CONFIG, >>>> + "failed to add pipe readfd %d into vhost server >>>> fdset\n", >>>> + fdset->u.readfd); >>>> + >>>> + fdset_pipe_uninit(fdset); >>>> + return -1; >>>> + } >>>> + >>>> + return 0; >>>> +} >>>> + >>>> +void >>>> +fdset_pipe_notify(struct fdset *fdset) >>>> +{ >>>> + write(fdset->u.writefd, "1", 1); >>>> +} >>>> diff --git a/lib/librte_vhost/fd_man.h b/lib/librte_vhost/fd_man.h >>>> index 3a9276c..76a42fb 100644 >>>> --- a/lib/librte_vhost/fd_man.h >>>> +++ b/lib/librte_vhost/fd_man.h >>>> @@ -25,6 +25,16 @@ struct fdset { >>>> struct fdentry fd[MAX_FDS]; >>>> pthread_mutex_t fd_mutex; >>>> int num; /* current fd number of this fdset */ >>>> + >>>> + union pipefds { >>>> + struct { >>>> + int pipefd[2]; >>>> + }; >>>> + struct { >>>> + int readfd; >>>> + int writefd; >>>> + }; >>>> + } u; >>>> }; >>>> >>>> >>>> @@ -37,4 +47,10 @@ int fdset_add(struct fdset *pfdset, int fd, >>>> >>>> void *fdset_event_dispatch(void *arg); >>>> >>>> +int fdset_pipe_init(struct fdset *fdset); >>>> + >>>> +void fdset_pipe_uninit(struct fdset *fdset); >>>> + >>>> +void fdset_pipe_notify(struct fdset *fdset); >>>> + >>>> #endif >>>> diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c >>>> index 95bed78..795239c 100644 >>>> --- a/lib/librte_vhost/socket.c >>>> +++ b/lib/librte_vhost/socket.c >>>> @@ -231,6 +231,8 @@ struct vhost_user { >>>> pthread_mutex_lock(&vsocket->conn_mutex); >>>> TAILQ_INSERT_TAIL(&vsocket->conn_list, conn, next); >>>> pthread_mutex_unlock(&vsocket->conn_mutex); >>>> + >>>> + fdset_pipe_notify(&vhost_user.fdset); >>>> return; >>>> >>>> err: >>>> @@ -829,11 +831,23 @@ struct vhost_device_ops const * >>>> return -1; >>>> >>>> if (fdset_tid == 0) { >>>> + /** >>>> + * create a pipe which will be waited by poll and notified >>>> to >>>> + * rebuild the wait list of poll. >>>> + */ >>>> + if (fdset_pipe_init(&vhost_user.fdset) < 0) { >>>> + RTE_LOG(ERR, VHOST_CONFIG, >>>> + "failed to create pipe for vhost >>>> fdset\n"); >>>> + return -1; >>>> + } >>>> + >>>> int ret = pthread_create(&fdset_tid, NULL, >>>> fdset_event_dispatch, >>>> &vhost_user.fdset); >>>> if (ret != 0) { >>>> RTE_LOG(ERR, VHOST_CONFIG, >>>> "failed to create fdset handling >>>> thread"); >>>> + >>>> + fdset_pipe_uninit(&vhost_user.fdset); >>>> return -1; >>>> } else { >>>> snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, >>>> -- >>>> 1.8.3.1 >>> >>> > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [dpdk-dev] [PATCH 2/2] vhost: add pipe event for optimizing negotiating 2018-03-30 8:07 ` Tonghao Zhang @ 2018-03-30 8:09 ` Maxime Coquelin 0 siblings, 0 replies; 10+ messages in thread From: Maxime Coquelin @ 2018-03-30 8:09 UTC (permalink / raw) To: Tonghao Zhang; +Cc: Tan, Jianfeng, dev On 03/30/2018 10:07 AM, Tonghao Zhang wrote: > On Fri, Mar 30, 2018 at 3:57 PM, Maxime Coquelin > <maxime.coquelin@redhat.com> wrote: >> Hi Xiangxia, >> >> >> On 03/29/2018 01:24 PM, Tonghao Zhang wrote: >>> >>> On Thu, Mar 29, 2018 at 3:32 PM, Tan, Jianfeng <jianfeng.tan@intel.com> >>> wrote: >>>> >>>> Hi Xiangxia, >>>> >>>>> -----Original Message----- >>>>> From: xiangxia.m.yue@gmail.com [mailto:xiangxia.m.yue@gmail.com] >>>>> Sent: Wednesday, March 28, 2018 1:49 PM >>>>> To: Tan, Jianfeng >>>>> Cc: dev@dpdk.org; Tonghao Zhang >>>>> Subject: [PATCH 2/2] vhost: add pipe event for optimizing negotiating >>>>> >>>>> From: Tonghao Zhang <xiangxia.m.yue@gmail.com> >>>>> >>>>> When vhost—user connects qemu successfully, dpdk will call >>>> >>>> >>>> Typo: "-" >>> >>> v2 will update it. :) >>> >>>>> the vhost_user_add_connection to add unix socket fd to poll. >>>>> And fdset_add only set the socket fd to a fdentry while poll >>>>> may sleep now. In a general case, this is no problem. But if >>>>> we use hot update for vhost-user, most downtime of VMs network >>>>> is 750+ms. This patch adds pipe event, so after connections are >>>>> ok, dpdk rebuild the poll immediately. With this patch, the >>>>> most downtime is 20~30ms. >>>>> >>>>> Signed-off-by: Tonghao Zhang <xiangxia.m.yue@gmail.com> >>>>> --- >>>>> lib/librte_vhost/fd_man.c | 49 >>>>> +++++++++++++++++++++++++++++++++++++++++++++++ >>>>> lib/librte_vhost/fd_man.h | 16 ++++++++++++++++ >>>>> lib/librte_vhost/socket.c | 14 ++++++++++++++ >>>>> 3 files changed, 79 insertions(+) >>>>> >>>>> diff --git a/lib/librte_vhost/fd_man.c b/lib/librte_vhost/fd_man.c >>>>> index 181711c..7716757 100644 >>>>> --- a/lib/librte_vhost/fd_man.c >>>>> +++ b/lib/librte_vhost/fd_man.c >>>>> @@ -15,6 +15,7 @@ >>>>> #include <rte_log.h> >>>>> >>>>> #include "fd_man.h" >>>>> +#include "vhost.h" >>>> >>>> >>>> This is a nice finding and solution, however, I don't think we shall >>>> include vhost header file in fd related files. Actually, I did not find out >>>> why you need to include this header file. >>> >>> >>> Hi Jianfeng, thanks for your review. In the fdset_pipe_init function, >>> I call the RTE_LOG with VHOST_CONFIG, when init pipe not successfully. >>> So I included the vhost header file. >> >> >> Maybe better to create VHOST_SOCKET in socket.c, than including vhost.h that >> creates a layer violation: >> >> #define RTE_LOGTYPE_VHOST_SOCKET RTE_LOGTYPE_USER1 >> >> Is it Ok for you? I so no need to resend, I can handle the change when >> applying. > yes, thanks. Great, so with above change: Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com> Thanks, Maxime >> >> Thanks, >> Maxime >> >>> >>> >>>> Thanks, >>>> Jianfeng >>>> >>>>> >>>>> #define FDPOLLERR (POLLERR | POLLHUP | POLLNVAL) >>>>> >>>>> @@ -272,3 +273,51 @@ >>>>> >>>>> return NULL; >>>>> } >>>>> + >>>>> +static void >>>>> +fdset_pipe_read_cb(int readfd, void *dat __rte_unused, >>>>> + int *remove __rte_unused) >>>>> +{ >>>>> + char charbuf[16]; >>>>> + read(readfd, charbuf, sizeof(charbuf)); >>>>> +} >>>>> + >>>>> +void >>>>> +fdset_pipe_uninit(struct fdset *fdset) >>>>> +{ >>>>> + fdset_del(fdset, fdset->u.readfd); >>>>> + close(fdset->u.readfd); >>>>> + close(fdset->u.writefd); >>>>> +} >>>>> + >>>>> +int >>>>> +fdset_pipe_init(struct fdset *fdset) >>>>> +{ >>>>> + int ret; >>>>> + >>>>> + if (pipe(fdset->u.pipefd) < 0) { >>>>> + RTE_LOG(ERR, VHOST_CONFIG, >>>>> + "failed to create pipe for vhost fdset\n"); >>>>> + return -1; >>>>> + } >>>>> + >>>>> + ret = fdset_add(fdset, fdset->u.readfd, >>>>> + fdset_pipe_read_cb, NULL, NULL); >>>>> + >>>>> + if (ret < 0) { >>>>> + RTE_LOG(ERR, VHOST_CONFIG, >>>>> + "failed to add pipe readfd %d into vhost server >>>>> fdset\n", >>>>> + fdset->u.readfd); >>>>> + >>>>> + fdset_pipe_uninit(fdset); >>>>> + return -1; >>>>> + } >>>>> + >>>>> + return 0; >>>>> +} >>>>> + >>>>> +void >>>>> +fdset_pipe_notify(struct fdset *fdset) >>>>> +{ >>>>> + write(fdset->u.writefd, "1", 1); >>>>> +} >>>>> diff --git a/lib/librte_vhost/fd_man.h b/lib/librte_vhost/fd_man.h >>>>> index 3a9276c..76a42fb 100644 >>>>> --- a/lib/librte_vhost/fd_man.h >>>>> +++ b/lib/librte_vhost/fd_man.h >>>>> @@ -25,6 +25,16 @@ struct fdset { >>>>> struct fdentry fd[MAX_FDS]; >>>>> pthread_mutex_t fd_mutex; >>>>> int num; /* current fd number of this fdset */ >>>>> + >>>>> + union pipefds { >>>>> + struct { >>>>> + int pipefd[2]; >>>>> + }; >>>>> + struct { >>>>> + int readfd; >>>>> + int writefd; >>>>> + }; >>>>> + } u; >>>>> }; >>>>> >>>>> >>>>> @@ -37,4 +47,10 @@ int fdset_add(struct fdset *pfdset, int fd, >>>>> >>>>> void *fdset_event_dispatch(void *arg); >>>>> >>>>> +int fdset_pipe_init(struct fdset *fdset); >>>>> + >>>>> +void fdset_pipe_uninit(struct fdset *fdset); >>>>> + >>>>> +void fdset_pipe_notify(struct fdset *fdset); >>>>> + >>>>> #endif >>>>> diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c >>>>> index 95bed78..795239c 100644 >>>>> --- a/lib/librte_vhost/socket.c >>>>> +++ b/lib/librte_vhost/socket.c >>>>> @@ -231,6 +231,8 @@ struct vhost_user { >>>>> pthread_mutex_lock(&vsocket->conn_mutex); >>>>> TAILQ_INSERT_TAIL(&vsocket->conn_list, conn, next); >>>>> pthread_mutex_unlock(&vsocket->conn_mutex); >>>>> + >>>>> + fdset_pipe_notify(&vhost_user.fdset); >>>>> return; >>>>> >>>>> err: >>>>> @@ -829,11 +831,23 @@ struct vhost_device_ops const * >>>>> return -1; >>>>> >>>>> if (fdset_tid == 0) { >>>>> + /** >>>>> + * create a pipe which will be waited by poll and notified >>>>> to >>>>> + * rebuild the wait list of poll. >>>>> + */ >>>>> + if (fdset_pipe_init(&vhost_user.fdset) < 0) { >>>>> + RTE_LOG(ERR, VHOST_CONFIG, >>>>> + "failed to create pipe for vhost >>>>> fdset\n"); >>>>> + return -1; >>>>> + } >>>>> + >>>>> int ret = pthread_create(&fdset_tid, NULL, >>>>> fdset_event_dispatch, >>>>> &vhost_user.fdset); >>>>> if (ret != 0) { >>>>> RTE_LOG(ERR, VHOST_CONFIG, >>>>> "failed to create fdset handling >>>>> thread"); >>>>> + >>>>> + fdset_pipe_uninit(&vhost_user.fdset); >>>>> return -1; >>>>> } else { >>>>> snprintf(thread_name, RTE_MAX_THREAD_NAME_LEN, >>>>> -- >>>>> 1.8.3.1 >>>> >>>> >> ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [dpdk-dev] [PATCH 0/2] add pipe event for optimizing negotiating 2018-03-28 5:49 [dpdk-dev] [PATCH 0/2] add pipe event for optimizing negotiating xiangxia.m.yue 2018-03-28 5:49 ` [dpdk-dev] [PATCH 1/2] vhost: move stdbool header file to vhost.h xiangxia.m.yue 2018-03-28 5:49 ` [dpdk-dev] [PATCH 2/2] vhost: add pipe event for optimizing negotiating xiangxia.m.yue @ 2018-03-30 8:17 ` Maxime Coquelin 2 siblings, 0 replies; 10+ messages in thread From: Maxime Coquelin @ 2018-03-30 8:17 UTC (permalink / raw) To: xiangxia.m.yue, jianfeng.tan; +Cc: dev On 03/28/2018 07:49 AM, xiangxia.m.yue@gmail.com wrote: > From: Tonghao Zhang <xiangxia.m.yue@gmail.com> > > These patches depend on previous patches. > 1. http://dpdk.org/dev/patchwork/patch/36440/ > 2. http://dpdk.org/dev/patchwork/patch/36441/ > > Tonghao Zhang (2): > vhost: move stdbool header file to vhost.h > vhost: add pipe event for optimizing negotiating > > lib/librte_vhost/fd_man.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++ > lib/librte_vhost/fd_man.h | 16 ++++++++++++++++ > lib/librte_vhost/socket.c | 15 ++++++++++++++- > lib/librte_vhost/vhost.h | 1 + > 4 files changed, 80 insertions(+), 1 deletion(-) > Series applied to dpdk-next-virtio/master with suggested changes. Thanks, Maxime ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2018-03-30 8:17 UTC | newest] Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2018-03-28 5:49 [dpdk-dev] [PATCH 0/2] add pipe event for optimizing negotiating xiangxia.m.yue 2018-03-28 5:49 ` [dpdk-dev] [PATCH 1/2] vhost: move stdbool header file to vhost.h xiangxia.m.yue 2018-03-30 8:09 ` Maxime Coquelin 2018-03-28 5:49 ` [dpdk-dev] [PATCH 2/2] vhost: add pipe event for optimizing negotiating xiangxia.m.yue 2018-03-29 7:32 ` Tan, Jianfeng 2018-03-29 11:24 ` Tonghao Zhang 2018-03-30 7:57 ` Maxime Coquelin 2018-03-30 8:07 ` Tonghao Zhang 2018-03-30 8:09 ` Maxime Coquelin 2018-03-30 8:17 ` [dpdk-dev] [PATCH 0/2] " Maxime Coquelin
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).