From: "Michael S. Tsirkin" <mst@redhat.com>
To: Nikolay Nikolaev <n.nikolaev@virtualopensystems.com>
Cc: snabb-devel@googlegroups.com, thomas.long@intel.com,
qemu-devel@nongnu.org, tech@virtualopensystems.com
Subject: Re: [Qemu-devel] [PATCH] vhost-user: multiqueue support
Date: Wed, 21 Jan 2015 16:25:48 +0200 [thread overview]
Message-ID: <20150121142548.GA16545@redhat.com> (raw)
In-Reply-To: <20141206165241.4064.61867.stgit@i3820>
On Sat, Dec 06, 2014 at 06:52:56PM +0200, Nikolay Nikolaev wrote:
> Vhost-user will implement the multiqueueu support in a similar way to what
> vhost already has - a separate thread for each queue.
>
> To enable multiquue funcionality - a new command line parameter
> "queues" is introduced for the vhost-user netdev.
>
> Signed-off-by: Nikolay Nikolaev <n.nikolaev@virtualopensystems.com>
Nikolay - plan to repost addressing comments?
> ---
> docs/specs/vhost-user.txt | 7 +++++++
> hw/virtio/vhost-user.c | 6 +++++-
> net/vhost-user.c | 35 +++++++++++++++++++++++------------
> qapi-schema.json | 5 ++++-
> qemu-options.hx | 5 +++--
> 5 files changed, 42 insertions(+), 16 deletions(-)
>
> diff --git a/docs/specs/vhost-user.txt b/docs/specs/vhost-user.txt
> index 650bb18..d3857f5 100644
> --- a/docs/specs/vhost-user.txt
> +++ b/docs/specs/vhost-user.txt
> @@ -127,6 +127,13 @@ in the ancillary data:
> If Master is unable to send the full message or receives a wrong reply it will
> close the connection. An optional reconnection mechanism can be implemented.
>
> +Multi queue suport
> +---------------------
> +The protocol supports multiple queues by setting all index fields in the sent
> +messages to a value calculated by the following formula:
> +<queue idx> + <vring idx>
> +The <queue idx> is increased by 2.
> +
> Message types
> -------------
>
How is the support negotiated though?
What if I set queues=N with a legacy backend that
does not support multiqueue?
> diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
> index aefe0bb..83ebcaa 100644
> --- a/hw/virtio/vhost-user.c
> +++ b/hw/virtio/vhost-user.c
> @@ -253,17 +253,20 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request,
> case VHOST_SET_VRING_NUM:
> case VHOST_SET_VRING_BASE:
> memcpy(&msg.state, arg, sizeof(struct vhost_vring_state));
> + msg.state.index += dev->vq_index;
> msg.size = sizeof(m.state);
> break;
>
> case VHOST_GET_VRING_BASE:
> memcpy(&msg.state, arg, sizeof(struct vhost_vring_state));
> + msg.state.index += dev->vq_index;
> msg.size = sizeof(m.state);
> need_reply = 1;
> break;
>
> case VHOST_SET_VRING_ADDR:
> memcpy(&msg.addr, arg, sizeof(struct vhost_vring_addr));
> + msg.addr.index += dev->vq_index;
> msg.size = sizeof(m.addr);
> break;
>
> @@ -271,7 +274,7 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request,
> case VHOST_SET_VRING_CALL:
> case VHOST_SET_VRING_ERR:
> file = arg;
> - msg.u64 = file->index & VHOST_USER_VRING_IDX_MASK;
> + msg.u64 = (file->index + dev->vq_index) & VHOST_USER_VRING_IDX_MASK;
> msg.size = sizeof(m.u64);
> if (ioeventfd_enabled() && file->fd > 0) {
> fds[fd_num++] = file->fd;
> @@ -313,6 +316,7 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request,
> error_report("Received bad msg size.\n");
> return -1;
> }
> + msg.state.index -= dev->vq_index;
> memcpy(arg, &msg.state, sizeof(struct vhost_vring_state));
> break;
> default:
> diff --git a/net/vhost-user.c b/net/vhost-user.c
> index 24e050c..1ea2f98 100644
> --- a/net/vhost-user.c
> +++ b/net/vhost-user.c
> @@ -134,25 +134,27 @@ static void net_vhost_user_event(void *opaque, int event)
>
> static int net_vhost_user_init(NetClientState *peer, const char *device,
> const char *name, CharDriverState *chr,
> - bool vhostforce)
> + bool vhostforce, uint32_t queues)
> {
> NetClientState *nc;
> VhostUserState *s;
> + int i;
>
> - nc = qemu_new_net_client(&net_vhost_user_info, peer, device, name);
> + for (i = 0; i < queues; i++) {
> + nc = qemu_new_net_client(&net_vhost_user_info, peer, device, name);
>
> - snprintf(nc->info_str, sizeof(nc->info_str), "vhost-user to %s",
> - chr->label);
> + snprintf(nc->info_str, sizeof(nc->info_str), "vhost-user%d to %s",
> + i, chr->label);
>
> - s = DO_UPCAST(VhostUserState, nc, nc);
> + s = DO_UPCAST(VhostUserState, nc, nc);
>
> - /* We don't provide a receive callback */
> - s->nc.receive_disabled = 1;
> - s->chr = chr;
> - s->vhostforce = vhostforce;
> -
> - qemu_chr_add_handlers(s->chr, NULL, NULL, net_vhost_user_event, s);
> + /* We don't provide a receive callback */
> + s->nc.receive_disabled = 1;
> + s->chr = chr;
> + s->vhostforce = vhostforce;
>
> + qemu_chr_add_handlers(s->chr, NULL, NULL, net_vhost_user_event, s);
> + }
> return 0;
> }
>
> @@ -228,6 +230,7 @@ static int net_vhost_check_net(QemuOpts *opts, void *opaque)
> int net_init_vhost_user(const NetClientOptions *opts, const char *name,
> NetClientState *peer)
> {
> + uint32_t queues;
> const NetdevVhostUserOptions *vhost_user_opts;
> CharDriverState *chr;
> bool vhostforce;
> @@ -254,5 +257,13 @@ int net_init_vhost_user(const NetClientOptions *opts, const char *name,
> vhostforce = false;
> }
>
> - return net_vhost_user_init(peer, "vhost_user", name, chr, vhostforce);
> + /* number of queues for multiqueue */
> + if (vhost_user_opts->has_queues) {
> + queues = vhost_user_opts->queues;
> + } else {
> + queues = 1;
> + }
> +
> + return net_vhost_user_init(peer, "vhost_user", name, chr, vhostforce,
> + queues);
> }
> diff --git a/qapi-schema.json b/qapi-schema.json
> index 9ffdcf8..aa3bb6f 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -2208,12 +2208,15 @@
> #
> # @vhostforce: #optional vhost on for non-MSIX virtio guests (default: false).
> #
> +# @queues: #optional number of queues to be created for multiqueue vhost-user
> +#
> # Since 2.1
> ##
> { 'type': 'NetdevVhostUserOptions',
> 'data': {
> 'chardev': 'str',
> - '*vhostforce': 'bool' } }
> + '*vhostforce': 'bool',
> + '*queues': 'uint32' } }
>
> ##
> # @NetClientOptions
> diff --git a/qemu-options.hx b/qemu-options.hx
> index 64af16d..23f010f 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -1893,13 +1893,14 @@ The hubport netdev lets you connect a NIC to a QEMU "vlan" instead of a single
> netdev. @code{-net} and @code{-device} with parameter @option{vlan} create the
> required hub automatically.
>
> -@item -netdev vhost-user,chardev=@var{id}[,vhostforce=on|off]
> +@item -netdev vhost-user,chardev=@var{id}[,vhostforce=on|off][,queues=n]
>
> Establish a vhost-user netdev, backed by a chardev @var{id}. The chardev should
> be a unix domain socket backed one. The vhost-user uses a specifically defined
> protocol to pass vhost ioctl replacement messages to an application on the other
> end of the socket. On non-MSIX guests, the feature can be forced with
> -@var{vhostforce}.
> +@var{vhostforce}. Use 'queues=@var{n}' to specify the number of queues to
> +be created for multiqueue vhost-user.
>
> Example:
> @example
>
next prev parent reply other threads:[~2015-01-21 14:26 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-06 16:52 [Qemu-devel] [PATCH] vhost-user: multiqueue support Nikolay Nikolaev
2014-12-08 9:04 ` Olivier MATZ
2014-12-08 9:41 ` Michael S. Tsirkin
2014-12-08 15:58 ` Eric Blake
2015-01-21 14:25 ` Michael S. Tsirkin [this message]
2015-01-22 8:14 ` [Qemu-devel] [snabb-devel] " Nikolay Nikolaev
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=20150121142548.GA16545@redhat.com \
--to=mst@redhat.com \
--cc=n.nikolaev@virtualopensystems.com \
--cc=qemu-devel@nongnu.org \
--cc=snabb-devel@googlegroups.com \
--cc=tech@virtualopensystems.com \
--cc=thomas.long@intel.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.