[dpdk-dev] [PATCH 2/6] vhost: add vhost-user client mode
On Mon, May 09, 2016 at 01:33:08PM -0700, Yuanhan Liu wrote: > On Mon, May 09, 2016 at 06:33:45AM -0400, Victor Kaplansky wrote: > > Adding a flag for a future extension seems fine to me. > > Could we manage without adding a flag? > > For example, could we always try a client mode for a while at first, > > and if unsuccessful, then come up with server mode? > > It's hard to define "how long is for a while". And I don't think > there is a way to switch it back to client mode from server mode > if you do so. > > So, assume you create a vhost-user port (as client), and you > start QEMU (as server) later, after the gap you mentioned of > auto-turn into server, it simply doesn't work then. > > --yliu I think I agree - I don't know of other software doing such an automatic switch. Correctly setting server/client mode seems easy enough. > > - Original Message - > > > From: "Yuanhan Liu" > > > To: dev at dpdk.org > > > Cc: "huawei xie" , "Yuanhan Liu" > > linux.intel.com> > > > Sent: Saturday, May 7, 2016 9:40:20 AM > > > Subject: [dpdk-dev] [PATCH 2/6] vhost: add vhost-user client mode > > > > > > Add a new paramter (flags) to rte_vhost_driver_register(). DPDK > > > vhost-user acts as client mode when RTE_VHOST_USER_CLIENT flag > > > is set. > > > > > > The flags would also allow future extensions without breaking the > > > API (again). > > > > > > The rest is straingfoward then: allocate a unix socket, and > > > bind/listen for server, connect for client. > > > > > > Signed-off-by: Yuanhan Liu > > > --- > > > drivers/net/vhost/rte_eth_vhost.c| 2 +- > > > examples/vhost/main.c| 2 +- > > > lib/librte_vhost/rte_virtio_net.h| 11 +- > > > lib/librte_vhost/vhost_user/vhost-net-user.c | 215 > > > --- > > > 4 files changed, 142 insertions(+), 88 deletions(-) > > > > > > diff --git a/drivers/net/vhost/rte_eth_vhost.c > > > b/drivers/net/vhost/rte_eth_vhost.c > > > index a9dada5..36697cf 100644 > > > --- a/drivers/net/vhost/rte_eth_vhost.c > > > +++ b/drivers/net/vhost/rte_eth_vhost.c > > > @@ -456,7 +456,7 @@ eth_dev_start(struct rte_eth_dev *dev) > > > int ret = 0; > > > > > > if (rte_atomic16_cmpset(>once, 0, 1)) { > > > - ret = rte_vhost_driver_register(internal->iface_name); > > > + ret = rte_vhost_driver_register(internal->iface_name, 0); > > > if (ret) > > > return ret; > > > } > > > diff --git a/examples/vhost/main.c b/examples/vhost/main.c > > > index bbf0d28..6899189 100644 > > > --- a/examples/vhost/main.c > > > +++ b/examples/vhost/main.c > > > @@ -1499,7 +1499,7 @@ main(int argc, char *argv[]) > > > rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_MRG_RXBUF); > > > > > > /* Register vhost(cuse or user) driver to handle vhost messages. */ > > > - ret = rte_vhost_driver_register((char *)_basename); > > > + ret = rte_vhost_driver_register(dev_basename, 0); > > > if (ret != 0) > > > rte_exit(EXIT_FAILURE, "vhost driver register failure.\n"); > > > > > > diff --git a/lib/librte_vhost/rte_virtio_net.h > > > b/lib/librte_vhost/rte_virtio_net.h > > > index 4e50425..c84e7ab 100644 > > > --- a/lib/librte_vhost/rte_virtio_net.h > > > +++ b/lib/librte_vhost/rte_virtio_net.h > > > @@ -51,6 +51,8 @@ > > > #include > > > #include > > > > > > +#define RTE_VHOST_USER_CLIENT(1ULL << 0) > > > + > > > struct rte_mbuf; > > > > > > #define VHOST_MEMORY_MAX_NREGIONS 8 > > > @@ -96,11 +98,14 @@ uint64_t rte_vhost_feature_get(void); > > > > > > int rte_vhost_enable_guest_notification(int vid, uint16_t queue_id, int > > > enable); > > > > > > -/* Register vhost driver. dev_name could be different for multiple > > > instance > > > support. */ > > > -int rte_vhost_driver_register(const char *dev_name); > > > +/** > > > + * Register vhost driver. path could be different for multiple > > > + * instance support. > > > + */ > > > +int rte_vhost_driver_register(const char *path, uint64_t flags); > > > > > > /* Unregister vhost driver. This is only meaningfu
[dpdk-dev] [PATCH 2/6] vhost: add vhost-user client mode
On Mon, May 09, 2016 at 06:33:45AM -0400, Victor Kaplansky wrote: > Adding a flag for a future extension seems fine to me. > Could we manage without adding a flag? > For example, could we always try a client mode for a while at first, > and if unsuccessful, then come up with server mode? It's hard to define "how long is for a while". And I don't think there is a way to switch it back to client mode from server mode if you do so. So, assume you create a vhost-user port (as client), and you start QEMU (as server) later, after the gap you mentioned of auto-turn into server, it simply doesn't work then. --yliu > - Original Message - > > From: "Yuanhan Liu" > > To: dev at dpdk.org > > Cc: "huawei xie" , "Yuanhan Liu" > linux.intel.com> > > Sent: Saturday, May 7, 2016 9:40:20 AM > > Subject: [dpdk-dev] [PATCH 2/6] vhost: add vhost-user client mode > > > > Add a new paramter (flags) to rte_vhost_driver_register(). DPDK > > vhost-user acts as client mode when RTE_VHOST_USER_CLIENT flag > > is set. > > > > The flags would also allow future extensions without breaking the > > API (again). > > > > The rest is straingfoward then: allocate a unix socket, and > > bind/listen for server, connect for client. > > > > Signed-off-by: Yuanhan Liu > > --- > > drivers/net/vhost/rte_eth_vhost.c| 2 +- > > examples/vhost/main.c| 2 +- > > lib/librte_vhost/rte_virtio_net.h| 11 +- > > lib/librte_vhost/vhost_user/vhost-net-user.c | 215 > > --- > > 4 files changed, 142 insertions(+), 88 deletions(-) > > > > diff --git a/drivers/net/vhost/rte_eth_vhost.c > > b/drivers/net/vhost/rte_eth_vhost.c > > index a9dada5..36697cf 100644 > > --- a/drivers/net/vhost/rte_eth_vhost.c > > +++ b/drivers/net/vhost/rte_eth_vhost.c > > @@ -456,7 +456,7 @@ eth_dev_start(struct rte_eth_dev *dev) > > int ret = 0; > > > > if (rte_atomic16_cmpset(>once, 0, 1)) { > > - ret = rte_vhost_driver_register(internal->iface_name); > > + ret = rte_vhost_driver_register(internal->iface_name, 0); > > if (ret) > > return ret; > > } > > diff --git a/examples/vhost/main.c b/examples/vhost/main.c > > index bbf0d28..6899189 100644 > > --- a/examples/vhost/main.c > > +++ b/examples/vhost/main.c > > @@ -1499,7 +1499,7 @@ main(int argc, char *argv[]) > > rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_MRG_RXBUF); > > > > /* Register vhost(cuse or user) driver to handle vhost messages. */ > > - ret = rte_vhost_driver_register((char *)_basename); > > + ret = rte_vhost_driver_register(dev_basename, 0); > > if (ret != 0) > > rte_exit(EXIT_FAILURE, "vhost driver register failure.\n"); > > > > diff --git a/lib/librte_vhost/rte_virtio_net.h > > b/lib/librte_vhost/rte_virtio_net.h > > index 4e50425..c84e7ab 100644 > > --- a/lib/librte_vhost/rte_virtio_net.h > > +++ b/lib/librte_vhost/rte_virtio_net.h > > @@ -51,6 +51,8 @@ > > #include > > #include > > > > +#define RTE_VHOST_USER_CLIENT (1ULL << 0) > > + > > struct rte_mbuf; > > > > #define VHOST_MEMORY_MAX_NREGIONS 8 > > @@ -96,11 +98,14 @@ uint64_t rte_vhost_feature_get(void); > > > > int rte_vhost_enable_guest_notification(int vid, uint16_t queue_id, int > > enable); > > > > -/* Register vhost driver. dev_name could be different for multiple instance > > support. */ > > -int rte_vhost_driver_register(const char *dev_name); > > +/** > > + * Register vhost driver. path could be different for multiple > > + * instance support. > > + */ > > +int rte_vhost_driver_register(const char *path, uint64_t flags); > > > > /* Unregister vhost driver. This is only meaningful to vhost user. */ > > -int rte_vhost_driver_unregister(const char *dev_name); > > +int rte_vhost_driver_unregister(const char *path); > > > > /* Register callbacks. */ > > int rte_vhost_driver_callback_register(struct virtio_net_device_ops const * > > const); > > diff --git a/lib/librte_vhost/vhost_user/vhost-net-user.c > > b/lib/librte_vhost/vhost_user/vhost-net-user.c > > index f485a3b..aa98717 100644 > > --- a/lib/librte_vhost/vhost_user/vhost-net-user.c > > +++ b/lib/librte_vhost/vhost_user/vhost-net-user.c > > @@ -58,6 +58,7 @@ > > struct vhost_user_socket { > > char *
[dpdk-dev] [PATCH 2/6] vhost: add vhost-user client mode
Adding a flag for a future extension seems fine to me. Could we manage without adding a flag? For example, could we always try a client mode for a while at first, and if unsuccessful, then come up with server mode? -- Victor - Original Message - > From: "Yuanhan Liu" > To: dev at dpdk.org > Cc: "huawei xie" , "Yuanhan Liu" linux.intel.com> > Sent: Saturday, May 7, 2016 9:40:20 AM > Subject: [dpdk-dev] [PATCH 2/6] vhost: add vhost-user client mode > > Add a new paramter (flags) to rte_vhost_driver_register(). DPDK > vhost-user acts as client mode when RTE_VHOST_USER_CLIENT flag > is set. > > The flags would also allow future extensions without breaking the > API (again). > > The rest is straingfoward then: allocate a unix socket, and > bind/listen for server, connect for client. > > Signed-off-by: Yuanhan Liu > --- > drivers/net/vhost/rte_eth_vhost.c| 2 +- > examples/vhost/main.c| 2 +- > lib/librte_vhost/rte_virtio_net.h| 11 +- > lib/librte_vhost/vhost_user/vhost-net-user.c | 215 > --- > 4 files changed, 142 insertions(+), 88 deletions(-) > > diff --git a/drivers/net/vhost/rte_eth_vhost.c > b/drivers/net/vhost/rte_eth_vhost.c > index a9dada5..36697cf 100644 > --- a/drivers/net/vhost/rte_eth_vhost.c > +++ b/drivers/net/vhost/rte_eth_vhost.c > @@ -456,7 +456,7 @@ eth_dev_start(struct rte_eth_dev *dev) > int ret = 0; > > if (rte_atomic16_cmpset(>once, 0, 1)) { > - ret = rte_vhost_driver_register(internal->iface_name); > + ret = rte_vhost_driver_register(internal->iface_name, 0); > if (ret) > return ret; > } > diff --git a/examples/vhost/main.c b/examples/vhost/main.c > index bbf0d28..6899189 100644 > --- a/examples/vhost/main.c > +++ b/examples/vhost/main.c > @@ -1499,7 +1499,7 @@ main(int argc, char *argv[]) > rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_MRG_RXBUF); > > /* Register vhost(cuse or user) driver to handle vhost messages. */ > - ret = rte_vhost_driver_register((char *)_basename); > + ret = rte_vhost_driver_register(dev_basename, 0); > if (ret != 0) > rte_exit(EXIT_FAILURE, "vhost driver register failure.\n"); > > diff --git a/lib/librte_vhost/rte_virtio_net.h > b/lib/librte_vhost/rte_virtio_net.h > index 4e50425..c84e7ab 100644 > --- a/lib/librte_vhost/rte_virtio_net.h > +++ b/lib/librte_vhost/rte_virtio_net.h > @@ -51,6 +51,8 @@ > #include > #include > > +#define RTE_VHOST_USER_CLIENT(1ULL << 0) > + > struct rte_mbuf; > > #define VHOST_MEMORY_MAX_NREGIONS 8 > @@ -96,11 +98,14 @@ uint64_t rte_vhost_feature_get(void); > > int rte_vhost_enable_guest_notification(int vid, uint16_t queue_id, int > enable); > > -/* Register vhost driver. dev_name could be different for multiple instance > support. */ > -int rte_vhost_driver_register(const char *dev_name); > +/** > + * Register vhost driver. path could be different for multiple > + * instance support. > + */ > +int rte_vhost_driver_register(const char *path, uint64_t flags); > > /* Unregister vhost driver. This is only meaningful to vhost user. */ > -int rte_vhost_driver_unregister(const char *dev_name); > +int rte_vhost_driver_unregister(const char *path); > > /* Register callbacks. */ > int rte_vhost_driver_callback_register(struct virtio_net_device_ops const * > const); > diff --git a/lib/librte_vhost/vhost_user/vhost-net-user.c > b/lib/librte_vhost/vhost_user/vhost-net-user.c > index f485a3b..aa98717 100644 > --- a/lib/librte_vhost/vhost_user/vhost-net-user.c > +++ b/lib/librte_vhost/vhost_user/vhost-net-user.c > @@ -58,6 +58,7 @@ > struct vhost_user_socket { > char *path; > int listenfd; > + int is_server; > }; > > struct vhost_user_connection { > @@ -75,7 +76,7 @@ struct vhost_user { > > #define MAX_VIRTIO_BACKLOG 128 > > -static void vhost_user_new_connection(int fd, void *data, int *remove); > +static void vhost_user_server_new_connection(int fd, void *data, int > *remove); > static void vhost_user_msg_handler(int fd, void *dat, int *remove); > > static struct vhost_user vhost_user = { > @@ -111,48 +112,6 @@ static const char *vhost_message_str[VHOST_USER_MAX] = { > [VHOST_USER_SEND_RARP] = "VHOST_USER_SEND_RARP", > }; > > -/** > - * Create a unix domain socket, bind to path and listen for connection. > - * @return > - * socket fd or -1 on failure > - */ > -static int > -uds_socket(const char *path) &
[dpdk-dev] [PATCH 2/6] vhost: add vhost-user client mode
Add a new paramter (flags) to rte_vhost_driver_register(). DPDK vhost-user acts as client mode when RTE_VHOST_USER_CLIENT flag is set. The flags would also allow future extensions without breaking the API (again). The rest is straingfoward then: allocate a unix socket, and bind/listen for server, connect for client. Signed-off-by: Yuanhan Liu --- drivers/net/vhost/rte_eth_vhost.c| 2 +- examples/vhost/main.c| 2 +- lib/librte_vhost/rte_virtio_net.h| 11 +- lib/librte_vhost/vhost_user/vhost-net-user.c | 215 --- 4 files changed, 142 insertions(+), 88 deletions(-) diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c index a9dada5..36697cf 100644 --- a/drivers/net/vhost/rte_eth_vhost.c +++ b/drivers/net/vhost/rte_eth_vhost.c @@ -456,7 +456,7 @@ eth_dev_start(struct rte_eth_dev *dev) int ret = 0; if (rte_atomic16_cmpset(>once, 0, 1)) { - ret = rte_vhost_driver_register(internal->iface_name); + ret = rte_vhost_driver_register(internal->iface_name, 0); if (ret) return ret; } diff --git a/examples/vhost/main.c b/examples/vhost/main.c index bbf0d28..6899189 100644 --- a/examples/vhost/main.c +++ b/examples/vhost/main.c @@ -1499,7 +1499,7 @@ main(int argc, char *argv[]) rte_vhost_feature_disable(1ULL << VIRTIO_NET_F_MRG_RXBUF); /* Register vhost(cuse or user) driver to handle vhost messages. */ - ret = rte_vhost_driver_register((char *)_basename); + ret = rte_vhost_driver_register(dev_basename, 0); if (ret != 0) rte_exit(EXIT_FAILURE, "vhost driver register failure.\n"); diff --git a/lib/librte_vhost/rte_virtio_net.h b/lib/librte_vhost/rte_virtio_net.h index 4e50425..c84e7ab 100644 --- a/lib/librte_vhost/rte_virtio_net.h +++ b/lib/librte_vhost/rte_virtio_net.h @@ -51,6 +51,8 @@ #include #include +#define RTE_VHOST_USER_CLIENT (1ULL << 0) + struct rte_mbuf; #define VHOST_MEMORY_MAX_NREGIONS 8 @@ -96,11 +98,14 @@ uint64_t rte_vhost_feature_get(void); int rte_vhost_enable_guest_notification(int vid, uint16_t queue_id, int enable); -/* Register vhost driver. dev_name could be different for multiple instance support. */ -int rte_vhost_driver_register(const char *dev_name); +/** + * Register vhost driver. path could be different for multiple + * instance support. + */ +int rte_vhost_driver_register(const char *path, uint64_t flags); /* Unregister vhost driver. This is only meaningful to vhost user. */ -int rte_vhost_driver_unregister(const char *dev_name); +int rte_vhost_driver_unregister(const char *path); /* Register callbacks. */ int rte_vhost_driver_callback_register(struct virtio_net_device_ops const * const); diff --git a/lib/librte_vhost/vhost_user/vhost-net-user.c b/lib/librte_vhost/vhost_user/vhost-net-user.c index f485a3b..aa98717 100644 --- a/lib/librte_vhost/vhost_user/vhost-net-user.c +++ b/lib/librte_vhost/vhost_user/vhost-net-user.c @@ -58,6 +58,7 @@ struct vhost_user_socket { char *path; int listenfd; + int is_server; }; struct vhost_user_connection { @@ -75,7 +76,7 @@ struct vhost_user { #define MAX_VIRTIO_BACKLOG 128 -static void vhost_user_new_connection(int fd, void *data, int *remove); +static void vhost_user_server_new_connection(int fd, void *data, int *remove); static void vhost_user_msg_handler(int fd, void *dat, int *remove); static struct vhost_user vhost_user = { @@ -111,48 +112,6 @@ static const char *vhost_message_str[VHOST_USER_MAX] = { [VHOST_USER_SEND_RARP] = "VHOST_USER_SEND_RARP", }; -/** - * Create a unix domain socket, bind to path and listen for connection. - * @return - * socket fd or -1 on failure - */ -static int -uds_socket(const char *path) -{ - struct sockaddr_un un; - int sockfd; - int ret; - - if (path == NULL) - return -1; - - sockfd = socket(AF_UNIX, SOCK_STREAM, 0); - if (sockfd < 0) - return -1; - RTE_LOG(INFO, VHOST_CONFIG, "socket created, fd:%d\n", sockfd); - - memset(, 0, sizeof(un)); - un.sun_family = AF_UNIX; - snprintf(un.sun_path, sizeof(un.sun_path), "%s", path); - ret = bind(sockfd, (struct sockaddr *), sizeof(un)); - if (ret == -1) { - RTE_LOG(ERR, VHOST_CONFIG, "fail to bind fd:%d, remove file:%s and try again.\n", - sockfd, path); - goto err; - } - RTE_LOG(INFO, VHOST_CONFIG, "bind to %s\n", path); - - ret = listen(sockfd, MAX_VIRTIO_BACKLOG); - if (ret == -1) - goto err; - - return sockfd; - -err: - close(sockfd); - return -1; -} - /* return bytes# of read on success or negative val on failure. */ static int read_fd_message(int sockfd, char *buf, int buflen, int *fds, int fd_num) @@ -287,32 +246,24 @@