All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jason Wang <jasowang@redhat.com>
To: Yuanhan Liu <yuanhan.liu@linux.intel.com>, qemu-devel@nongnu.org
Cc: Changchun Ouyang <changchun.ouyang@intel.com>,
	Changchun.ouyang@hotmail.com, mst@redhat.com
Subject: Re: [Qemu-devel] [PATCH v11 7/7] vhost-user: add a new message to disable/enable a specific virt queue.
Date: Thu, 24 Sep 2015 13:43:09 +0800	[thread overview]
Message-ID: <56038D6D.6010006@redhat.com> (raw)
In-Reply-To: <1442982001-10669-8-git-send-email-yuanhan.liu@linux.intel.com>



On 09/23/2015 12:20 PM, Yuanhan Liu wrote:
> From: Changchun Ouyang <changchun.ouyang@intel.com>
>
> Add a new message, VHOST_USER_SET_VRING_ENABLE, to enable or disable
> a specific virt queue, which is similar to attach/detach queue for
> tap device.
>
> virtio driver on guest doesn't have to use max virt queue pair, it
> could enable any number of virt queue ranging from 1 to max virt
> queue pair.
>
> Signed-off-by: Changchun Ouyang <changchun.ouyang@intel.com>
> Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>

Reviewed-by: Jason Wang <jasowang@redhat.com>

>
> ---
> v11: fix typo
> ---
>  docs/specs/vhost-user.txt         | 12 +++++++++++-
>  hw/net/vhost_net.c                | 18 ++++++++++++++++++
>  hw/net/virtio-net.c               |  8 ++++++++
>  hw/virtio/vhost-user.c            | 19 +++++++++++++++++++
>  include/hw/virtio/vhost-backend.h |  2 ++
>  include/net/vhost_net.h           |  2 ++
>  6 files changed, 60 insertions(+), 1 deletion(-)
>
> diff --git a/docs/specs/vhost-user.txt b/docs/specs/vhost-user.txt
> index cfc9d41..4eadad1 100644
> --- a/docs/specs/vhost-user.txt
> +++ b/docs/specs/vhost-user.txt
> @@ -148,7 +148,9 @@ VHOST_USER_GET_PROTOCOL_FEATURES. Master should stop when the number of
>  requested queues is bigger than that.
>  
>  As all queues share one connection, the master uses a unique index for each
> -queue in the sent message to identify a specified queue.
> +queue in the sent message to identify a specified queue. One queue pair
> +is enabled initially. More queues are enabled dynamically, by sending
> +message VHOST_USER_SET_VRING_ENABLE.
>  
>  Message types
>  -------------
> @@ -327,3 +329,11 @@ Message types
>        Query how many queues the backend supports. This request should be
>        sent only when VHOST_USER_PROTOCOL_F_MQ is set in quried protocol
>        features by VHOST_USER_GET_PROTOCOL_FEATURES.
> +
> + * VHOST_USER_SET_VRING_ENABLE
> +
> +      Id: 18
> +      Equivalent ioctl: N/A
> +      Master payload: vring state description
> +
> +      Signal slave to enable or disable corresponding vring.
> diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
> index ad82b5c..2bce891 100644
> --- a/hw/net/vhost_net.c
> +++ b/hw/net/vhost_net.c
> @@ -422,6 +422,19 @@ VHostNetState *get_vhost_net(NetClientState *nc)
>  
>      return vhost_net;
>  }
> +
> +int vhost_set_vring_enable(NetClientState *nc, int enable)
> +{
> +    VHostNetState *net = get_vhost_net(nc);
> +    const VhostOps *vhost_ops = net->dev.vhost_ops;
> +
> +    if (vhost_ops->vhost_backend_set_vring_enable) {
> +        return vhost_ops->vhost_backend_set_vring_enable(&net->dev, enable);
> +    }
> +
> +    return 0;
> +}
> +
>  #else
>  uint64_t vhost_net_get_max_queues(VHostNetState *net)
>  {
> @@ -472,4 +485,9 @@ VHostNetState *get_vhost_net(NetClientState *nc)
>  {
>      return 0;
>  }
> +
> +int vhost_set_vring_enable(NetClientState *nc, int enable)
> +{
> +    return 0;
> +}
>  #endif
> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> index f72eebf..916222f 100644
> --- a/hw/net/virtio-net.c
> +++ b/hw/net/virtio-net.c
> @@ -406,6 +406,10 @@ static int peer_attach(VirtIONet *n, int index)
>          return 0;
>      }
>  
> +    if (nc->peer->info->type == NET_CLIENT_OPTIONS_KIND_VHOST_USER) {
> +        vhost_set_vring_enable(nc->peer, 1);
> +    }
> +
>      if (nc->peer->info->type != NET_CLIENT_OPTIONS_KIND_TAP) {
>          return 0;
>      }
> @@ -421,6 +425,10 @@ static int peer_detach(VirtIONet *n, int index)
>          return 0;
>      }
>  
> +    if (nc->peer->info->type == NET_CLIENT_OPTIONS_KIND_VHOST_USER) {
> +        vhost_set_vring_enable(nc->peer, 0);
> +    }
> +
>      if (nc->peer->info->type !=  NET_CLIENT_OPTIONS_KIND_TAP) {
>          return 0;
>      }
> diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
> index e42fde6..b11c0d2 100644
> --- a/hw/virtio/vhost-user.c
> +++ b/hw/virtio/vhost-user.c
> @@ -48,6 +48,7 @@ typedef enum VhostUserRequest {
>      VHOST_USER_GET_PROTOCOL_FEATURES = 15,
>      VHOST_USER_SET_PROTOCOL_FEATURES = 16,
>      VHOST_USER_GET_QUEUE_NUM = 17,
> +    VHOST_USER_SET_VRING_ENABLE = 18,
>      VHOST_USER_MAX
>  } VhostUserRequest;
>  
> @@ -290,6 +291,7 @@ static int vhost_user_call(struct vhost_dev *dev, unsigned long int request,
>  
>      case VHOST_USER_SET_VRING_NUM:
>      case VHOST_USER_SET_VRING_BASE:
> +    case VHOST_USER_SET_VRING_ENABLE:
>          memcpy(&msg.state, arg, sizeof(struct vhost_vring_state));
>          msg.size = sizeof(m.state);
>          break;
> @@ -406,6 +408,22 @@ static int vhost_user_init(struct vhost_dev *dev, void *opaque)
>      return 0;
>  }
>  
> +static int vhost_user_set_vring_enable(struct vhost_dev *dev, int enable)
> +{
> +    struct vhost_vring_state state = {
> +        .index = dev->vq_index,
> +        .num   = enable,
> +    };
> +
> +    assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_USER);
> +
> +    if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_MQ))) {
> +        return -1;
> +    }
> +
> +    return vhost_user_call(dev, VHOST_USER_SET_VRING_ENABLE, &state);
> +}
> +
>  static int vhost_user_cleanup(struct vhost_dev *dev)
>  {
>      assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_USER);
> @@ -428,4 +446,5 @@ const VhostOps user_ops = {
>          .vhost_backend_init = vhost_user_init,
>          .vhost_backend_cleanup = vhost_user_cleanup,
>          .vhost_backend_get_vq_index = vhost_user_get_vq_index,
> +        .vhost_backend_set_vring_enable = vhost_user_set_vring_enable,
>  };
> diff --git a/include/hw/virtio/vhost-backend.h b/include/hw/virtio/vhost-backend.h
> index e1dfc6d..3a0f6e2 100644
> --- a/include/hw/virtio/vhost-backend.h
> +++ b/include/hw/virtio/vhost-backend.h
> @@ -25,6 +25,7 @@ typedef int (*vhost_call)(struct vhost_dev *dev, unsigned long int request,
>  typedef int (*vhost_backend_init)(struct vhost_dev *dev, void *opaque);
>  typedef int (*vhost_backend_cleanup)(struct vhost_dev *dev);
>  typedef int (*vhost_backend_get_vq_index)(struct vhost_dev *dev, int idx);
> +typedef int (*vhost_backend_set_vring_enable)(struct vhost_dev *dev, int enable);
>  
>  typedef struct VhostOps {
>      VhostBackendType backend_type;
> @@ -32,6 +33,7 @@ typedef struct VhostOps {
>      vhost_backend_init vhost_backend_init;
>      vhost_backend_cleanup vhost_backend_cleanup;
>      vhost_backend_get_vq_index vhost_backend_get_vq_index;
> +    vhost_backend_set_vring_enable vhost_backend_set_vring_enable;
>  } VhostOps;
>  
>  extern const VhostOps user_ops;
> diff --git a/include/net/vhost_net.h b/include/net/vhost_net.h
> index 8db723e..0188c4d 100644
> --- a/include/net/vhost_net.h
> +++ b/include/net/vhost_net.h
> @@ -28,4 +28,6 @@ bool vhost_net_virtqueue_pending(VHostNetState *net, int n);
>  void vhost_net_virtqueue_mask(VHostNetState *net, VirtIODevice *dev,
>                                int idx, bool mask);
>  VHostNetState *get_vhost_net(NetClientState *nc);
> +
> +int vhost_set_vring_enable(NetClientState * nc, int enable);
>  #endif

  reply	other threads:[~2015-09-24  5:43 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-23  4:19 [Qemu-devel] [PATCH v11 0/7] vhost-user multiple queue support Yuanhan Liu
2015-09-23  4:19 ` [Qemu-devel] [PATCH v11 1/7] vhost-user: use VHOST_USER_XXX macro for switch statement Yuanhan Liu
2015-09-24 10:05   ` Marcel Apfelbaum
2015-09-24 10:18     ` Michael S. Tsirkin
2015-09-24 10:27       ` Marcel Apfelbaum
2015-09-23  4:19 ` [Qemu-devel] [PATCH v11 2/7] vhost-user: add protocol feature negotiation Yuanhan Liu
2015-09-24 10:13   ` Marcel Apfelbaum
2015-09-24 11:25     ` Yuanhan Liu
2015-09-24 11:29     ` Yuanhan Liu
2015-09-23  4:19 ` [Qemu-devel] [PATCH v11 3/7] vhost: rename VHOST_RESET_OWNER to VHOST_RESET_DEVICE Yuanhan Liu
2015-09-24 10:18   ` Marcel Apfelbaum
2015-09-23  4:19 ` [Qemu-devel] [PATCH v11 4/7] vhost-user: add VHOST_USER_GET_QUEUE_NUM message Yuanhan Liu
2015-09-24 10:25   ` Marcel Apfelbaum
2015-09-23  4:19 ` [Qemu-devel] [PATCH v11 5/7] vhost: introduce vhost_backend_get_vq_index method Yuanhan Liu
2015-09-23  4:20 ` [Qemu-devel] [PATCH v11 6/7] vhost-user: add multiple queue support Yuanhan Liu
2015-09-23  6:56   ` Yuanhan Liu
2015-09-24  5:34     ` Jason Wang
2015-09-24  5:57       ` Yuanhan Liu
2015-09-24  6:15         ` Jason Wang
2015-09-23  4:20 ` [Qemu-devel] [PATCH v11 7/7] vhost-user: add a new message to disable/enable a specific virt queue Yuanhan Liu
2015-09-24  5:43   ` Jason Wang [this message]
2015-09-24 10:03 ` [Qemu-devel] [PATCH v11 0/7] vhost-user multiple queue support Marcel Apfelbaum

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=56038D6D.6010006@redhat.com \
    --to=jasowang@redhat.com \
    --cc=Changchun.ouyang@hotmail.com \
    --cc=changchun.ouyang@intel.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=yuanhan.liu@linux.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.