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 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).