From: "Michael S. Tsirkin" <mst@redhat.com>
To: Antonios Motakis <a.motakis@virtualopensystems.com>
Cc: snabb-devel@googlegroups.com,
Anthony Liguori <aliguori@amazon.com>,
Jason Wang <jasowang@redhat.com>,
qemu-devel@nongnu.org, n.nikolaev@virtualopensystems.com,
Stefan Hajnoczi <stefanha@redhat.com>,
lukego@gmail.com, Paolo Bonzini <pbonzini@redhat.com>,
tech@virtualopensystems.com
Subject: Re: [Qemu-devel] [PATCH v6 4/8] Add vhost-user skeleton
Date: Tue, 14 Jan 2014 13:17:52 +0200 [thread overview]
Message-ID: <20140114111752.GD27922@redhat.com> (raw)
In-Reply-To: <1389623119-15863-5-git-send-email-a.motakis@virtualopensystems.com>
On Mon, Jan 13, 2014 at 03:25:15PM +0100, Antonios Motakis wrote:
> Add empty vhost_call, init and cleanup for the vhost-user backend.
>
> Signed-off-by: Antonios Motakis <a.motakis@virtualopensystems.com>
> Signed-off-by: Nikolay Nikolaev <n.nikolaev@virtualopensystems.com>
I think the refactoring of VhostNetOptions should be in a separate
patch.
> ---
> hw/net/vhost_net.c | 57 ++++++++++++++++++++++-----------------
> hw/virtio/vhost-backend.c | 35 ++++++++++++++++++++++++
> include/hw/virtio/vhost-backend.h | 3 ++-
> include/net/vhost_net.h | 13 ++++++++-
> net/tap.c | 16 ++++++-----
> 5 files changed, 91 insertions(+), 33 deletions(-)
>
> diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
> index 4aaf0b4..3614e6c 100644
> --- a/hw/net/vhost_net.c
> +++ b/hw/net/vhost_net.c
> @@ -91,43 +91,51 @@ static int vhost_net_get_fd(NetClientState *backend)
> }
> }
>
> -struct vhost_net *vhost_net_init(NetClientState *backend, int devfd,
> - bool force)
> +struct vhost_net *vhost_net_init(VhostNetOptions *options)
> {
> - int r;
> + int r = -1;
> struct vhost_net *net = g_malloc(sizeof *net);
> - if (!backend) {
> - fprintf(stderr, "vhost-net requires backend to be setup\n");
> +
> + if (!options->net_backend) {
> + fprintf(stderr, "vhost-net requires net backend to be setup\n");
> goto fail;
> }
> - r = vhost_net_get_fd(backend);
> - if (r < 0) {
> - goto fail;
> +
> + if (options->backend_type == VHOST_BACKEND_TYPE_KERNEL) {
> + r = vhost_net_get_fd(options->net_backend);
> + if (r < 0) {
> + goto fail;
> + }
> +
> + net->dev.backend_features =
> + tap_has_vnet_hdr(options->net_backend) ? 0 :
> + (1 << VHOST_NET_F_VIRTIO_NET_HDR);
> }
> - net->nc = backend;
> - net->dev.backend_features = tap_has_vnet_hdr(backend) ? 0 :
> - (1 << VHOST_NET_F_VIRTIO_NET_HDR);
> +
> + net->nc = options->net_backend;
> net->backend = r;
>
> net->dev.nvqs = 2;
> net->dev.vqs = net->vqs;
>
> - r = vhost_dev_init(&net->dev, devfd, "/dev/vhost-net",
> - VHOST_BACKEND_TYPE_KERNEL, force);
> + r = vhost_dev_init(&net->dev, options->devfd, options->devpath,
> + options->backend_type, options->force);
> if (r < 0) {
> goto fail;
> }
> - if (!tap_has_vnet_hdr_len(backend,
> - sizeof(struct virtio_net_hdr_mrg_rxbuf))) {
> - net->dev.features &= ~(1 << VIRTIO_NET_F_MRG_RXBUF);
> - }
> - if (~net->dev.features & net->dev.backend_features) {
> - fprintf(stderr, "vhost lacks feature mask %" PRIu64 " for backend\n",
> - (uint64_t)(~net->dev.features & net->dev.backend_features));
> - vhost_dev_cleanup(&net->dev);
> - goto fail;
> + if (options->backend_type == VHOST_BACKEND_TYPE_KERNEL) {
> + if (!tap_has_vnet_hdr_len(options->net_backend,
> + sizeof(struct virtio_net_hdr_mrg_rxbuf))) {
> + net->dev.features &= ~(1 << VIRTIO_NET_F_MRG_RXBUF);
> + }
> + if (~net->dev.features & net->dev.backend_features) {
> + fprintf(stderr, "vhost lacks feature mask %" PRIu64
> + " for backend\n",
> + (uint64_t)(~net->dev.features & net->dev.backend_features));
> + vhost_dev_cleanup(&net->dev);
> + goto fail;
> + }
> }
> -
> /* Set sane init value. Override when guest acks. */
> vhost_net_ack_features(net, 0);
> return net;
> @@ -286,8 +294,7 @@ void vhost_net_virtqueue_mask(VHostNetState *net, VirtIODevice *dev,
> vhost_virtqueue_mask(&net->dev, dev, idx, mask);
> }
> #else
> -struct vhost_net *vhost_net_init(NetClientState *backend, int devfd,
> - bool force)
> +struct vhost_net *vhost_net_init(VhostNetOptions *options)
> {
> error_report("vhost-net support is not compiled in");
> return NULL;
> diff --git a/hw/virtio/vhost-backend.c b/hw/virtio/vhost-backend.c
> index c0f11e4..1d83e1d 100644
> --- a/hw/virtio/vhost-backend.c
> +++ b/hw/virtio/vhost-backend.c
> @@ -16,6 +16,38 @@
> #include <unistd.h>
> #include <sys/ioctl.h>
>
> +static int vhost_user_call(struct vhost_dev *dev, unsigned long int request,
> + void *arg)
> +{
> + assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_USER);
> + error_report("vhost_user_call not implemented\n");
> +
> + return -1;
> +}
> +
> +static int vhost_user_init(struct vhost_dev *dev, const char *devpath)
> +{
> + assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_USER);
> + error_report("vhost_user_init not implemented\n");
> +
> + return -1;
> +}
> +
> +static int vhost_user_cleanup(struct vhost_dev *dev)
> +{
> + assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_USER);
> + error_report("vhost_user_cleanup not implemented\n");
> +
> + return -1;
> +}
> +
> +static const VhostOps user_ops = {
> + .backend_type = VHOST_BACKEND_TYPE_USER,
> + .vhost_call = vhost_user_call,
> + .vhost_backend_init = vhost_user_init,
> + .vhost_backend_cleanup = vhost_user_cleanup
> +};
> +
> static int vhost_kernel_call(struct vhost_dev *dev, unsigned long int request,
> void *arg)
> {
> @@ -56,6 +88,9 @@ int vhost_set_backend_type(struct vhost_dev *dev, VhostBackendType backend_type)
> case VHOST_BACKEND_TYPE_KERNEL:
> dev->vhost_ops = &kernel_ops;
> break;
> + case VHOST_BACKEND_TYPE_USER:
> + dev->vhost_ops = &user_ops;
> + break;
> default:
> error_report("Unknown vhost backend type\n");
> r = -1;
> diff --git a/include/hw/virtio/vhost-backend.h b/include/hw/virtio/vhost-backend.h
> index 93fc55b..ef87ffa 100644
> --- a/include/hw/virtio/vhost-backend.h
> +++ b/include/hw/virtio/vhost-backend.h
> @@ -14,7 +14,8 @@
> typedef enum VhostBackendType {
> VHOST_BACKEND_TYPE_NONE = 0,
> VHOST_BACKEND_TYPE_KERNEL = 1,
> - VHOST_BACKEND_TYPE_MAX = 2,
> + VHOST_BACKEND_TYPE_USER = 2,
> + VHOST_BACKEND_TYPE_MAX = 3,
> } VhostBackendType;
>
> struct vhost_dev;
> diff --git a/include/net/vhost_net.h b/include/net/vhost_net.h
> index 2d936bb..1169562 100644
> --- a/include/net/vhost_net.h
> +++ b/include/net/vhost_net.h
> @@ -2,11 +2,22 @@
> #define VHOST_NET_H
>
> #include "net/net.h"
> +#include "hw/virtio/vhost-backend.h"
> +
> +#define VHOST_NET_DEFAULT_PATH "/dev/vhost-net"
>
> struct vhost_net;
> typedef struct vhost_net VHostNetState;
>
> -VHostNetState *vhost_net_init(NetClientState *backend, int devfd, bool force);
> +typedef struct VhostNetOptions {
> + VhostBackendType backend_type;
> + NetClientState *net_backend;
> + const char *devpath;
> + int devfd;
> + bool force;
> +} VhostNetOptions;
> +
> +struct vhost_net *vhost_net_init(VhostNetOptions *options);
>
> bool vhost_net_query(VHostNetState *net, VirtIODevice *dev);
> int vhost_net_start(VirtIODevice *dev, NetClientState *ncs, int total_queues);
> diff --git a/net/tap.c b/net/tap.c
> index 39c1cda..776dbc4 100644
> --- a/net/tap.c
> +++ b/net/tap.c
> @@ -621,19 +621,23 @@ static int net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer,
>
> if (tap->has_vhost ? tap->vhost :
> vhostfdname || (tap->has_vhostforce && tap->vhostforce)) {
> - int vhostfd;
> + VhostNetOptions options;
> +
> + options.backend_type = VHOST_BACKEND_TYPE_KERNEL;
> + options.net_backend = &s->nc;
> + options.devpath = VHOST_NET_DEFAULT_PATH;
> + options.force = tap->has_vhostforce && tap->vhostforce;
>
> if (tap->has_vhostfd || tap->has_vhostfds) {
> - vhostfd = monitor_handle_fd_param(cur_mon, vhostfdname);
> - if (vhostfd == -1) {
> + options.devfd = monitor_handle_fd_param(cur_mon, vhostfdname);
> + if (options.devfd == -1) {
> return -1;
> }
> } else {
> - vhostfd = -1;
> + options.devfd = -1;
> }
>
> - s->vhost_net = vhost_net_init(&s->nc, vhostfd,
> - tap->has_vhostforce && tap->vhostforce);
> + s->vhost_net = vhost_net_init(&options);
> if (!s->vhost_net) {
> error_report("vhost-net requested but could not be initialized");
> return -1;
> --
> 1.8.3.2
>
next prev parent reply other threads:[~2014-01-14 11:18 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-13 14:25 [Qemu-devel] [PATCH v6 0/8] Vhost and vhost-net support for userspace based backends Antonios Motakis
2014-01-13 14:25 ` [Qemu-devel] [PATCH v6 1/8] Convert -mem-path to QemuOpts and add prealloc and share properties Antonios Motakis
2014-01-13 14:25 ` [Qemu-devel] [PATCH v6 2/8] New -mem-path option - unlink Antonios Motakis
2014-01-14 11:16 ` Michael S. Tsirkin
2014-01-14 18:13 ` Antonios Motakis
2014-01-13 14:25 ` [Qemu-devel] [PATCH v6 3/8] Decouple vhost from kernel interface Antonios Motakis
2014-01-13 14:25 ` [Qemu-devel] [PATCH v6 4/8] Add vhost-user skeleton Antonios Motakis
2014-01-14 11:17 ` Michael S. Tsirkin [this message]
2014-01-13 14:25 ` [Qemu-devel] [PATCH v6 5/8] Add domain socket communication for vhost-user backend Antonios Motakis
2014-01-14 11:10 ` Michael S. Tsirkin
2014-01-14 18:14 ` Antonios Motakis
2014-01-15 9:13 ` Michael S. Tsirkin
2014-01-13 14:25 ` [Qemu-devel] [PATCH v6 6/8] Add vhost-user calls implementation Antonios Motakis
2014-01-14 11:21 ` Michael S. Tsirkin
2014-01-14 18:14 ` Antonios Motakis
2014-01-15 9:14 ` Michael S. Tsirkin
2014-01-15 10:08 ` Michael S. Tsirkin
2014-01-13 14:25 ` [Qemu-devel] [PATCH v6 7/8] Add new vhost-user netdev backend Antonios Motakis
2014-01-13 14:25 ` [Qemu-devel] [PATCH v6 8/8] Add vhost-user reconnection Antonios Motakis
2014-01-14 11:14 ` [Qemu-devel] [PATCH v6 0/8] Vhost and vhost-net support for userspace based backends Michael S. Tsirkin
2014-01-14 18:13 ` Antonios Motakis
2014-01-15 8:54 ` Michael S. Tsirkin
2014-01-14 11:33 ` Michael S. Tsirkin
2014-01-14 18:13 ` Antonios Motakis
2014-01-15 9:07 ` Michael S. Tsirkin
2014-01-15 12:50 ` Antonios Motakis
2014-01-15 14:49 ` Michael S. Tsirkin
2014-01-16 12:35 ` Antonios Motakis
2014-01-27 16:37 ` Antonios Motakis
2014-01-27 16:49 ` Michael S. Tsirkin
2014-01-29 12:04 ` Antonios Motakis
2014-01-29 14:10 ` Michael S. Tsirkin
2014-01-21 13:32 ` Antonios Motakis
2014-01-15 10:05 ` Michael S. Tsirkin
2014-01-21 13:32 ` Antonios Motakis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140114111752.GD27922@redhat.com \
--to=mst@redhat.com \
--cc=a.motakis@virtualopensystems.com \
--cc=aliguori@amazon.com \
--cc=jasowang@redhat.com \
--cc=lukego@gmail.com \
--cc=n.nikolaev@virtualopensystems.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=snabb-devel@googlegroups.com \
--cc=stefanha@redhat.com \
--cc=tech@virtualopensystems.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.