All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Marc-André Lureau" <marcandre.lureau@redhat.com>
To: Changpeng Liu <changpeng.liu@intel.com>
Cc: qemu-devel@nongnu.org, stefanha@gmail.com, pbonzini@redhat.com,
	mst@redhat.com, felipe@nutanix.com,
	james r harris <james.r.harris@intel.com>
Subject: Re: [Qemu-devel] [PATCH v2 3/4] contrib/libvhost-user: enable virtio config space messages
Date: Wed, 9 Aug 2017 14:34:15 -0400 (EDT)	[thread overview]
Message-ID: <223333740.69259397.1502303655657.JavaMail.zimbra@redhat.com> (raw)
In-Reply-To: <1502359951-29160-4-git-send-email-changpeng.liu@intel.com>

Hi

----- Original Message -----
> Enable VHOST_USER_GET_CONFIG/VHOST_USER_SET_CONFIG/VHOST_USER_SET_CONFIG_FD
> messages in libvhost-user library, users can implement their own I/O target
> based on the library. This enable the virtio config space delivered between
> Qemu host device and the I/O target, also event notifier is added in case
> of virtio config space changed.
> 
> Signed-off-by: Changpeng Liu <changpeng.liu@intel.com>
> ---
>  contrib/libvhost-user/libvhost-user.c | 51
>  +++++++++++++++++++++++++++++++++++
>  contrib/libvhost-user/libvhost-user.h | 14 ++++++++++
>  2 files changed, 65 insertions(+)
> 
> diff --git a/contrib/libvhost-user/libvhost-user.c
> b/contrib/libvhost-user/libvhost-user.c
> index 9efb9da..002cf15 100644
> --- a/contrib/libvhost-user/libvhost-user.c
> +++ b/contrib/libvhost-user/libvhost-user.c
> @@ -63,6 +63,9 @@ vu_request_to_string(int req)
>          REQ(VHOST_USER_SET_VRING_ENABLE),
>          REQ(VHOST_USER_SEND_RARP),
>          REQ(VHOST_USER_INPUT_GET_CONFIG),
> +        REQ(VHOST_USER_GET_CONFIG),
> +        REQ(VHOST_USER_SET_CONFIG),
> +        REQ(VHOST_USER_SET_CONFIG_FD),
>          REQ(VHOST_USER_MAX),
>      };
>  #undef REQ
> @@ -744,6 +747,43 @@ vu_set_vring_enable_exec(VuDev *dev, VhostUserMsg *vmsg)
>  }
>  
>  static bool
> +vu_get_config(VuDev *dev, VhostUserMsg *vmsg)
> +{
> +    if (dev->iface->get_config) {
> +        dev->iface->get_config(dev, vmsg->payload.config, vmsg->size);

better check the return value on error to avoid sending garbage back to master.

> +    }
> +
> +    return true;
> +}
> +
> +static bool
> +vu_set_config(VuDev *dev, VhostUserMsg *vmsg)
> +{
> +    if (dev->iface->set_config) {
> +        dev->iface->set_config(dev, vmsg->payload.config, vmsg->size);

you could perhaps make that function return void instead (since error isn't reported to master)


> +    }
> +
> +    return false;
> +}
> +
> +static bool
> +vu_set_config_fd(VuDev *dev, VhostUserMsg *vmsg)
> +{
> +   if (vmsg->fd_num != 1) {
> +        vu_panic(dev, "Invalid config_fd message");
> +        return false;
> +    }
> +
> +    if (dev->config_fd != -1) {
> +        close(dev->config_fd);
> +    }
> +    dev->config_fd = vmsg->fds[0];
> +    DPRINT("Got config_fd: %d\n", vmsg->fds[0]);
> +
> +    return false;
> +}
> +
> +static bool
>  vu_process_message(VuDev *dev, VhostUserMsg *vmsg)
>  {
>      int do_reply = 0;
> @@ -806,6 +846,12 @@ vu_process_message(VuDev *dev, VhostUserMsg *vmsg)
>          return vu_get_queue_num_exec(dev, vmsg);
>      case VHOST_USER_SET_VRING_ENABLE:
>          return vu_set_vring_enable_exec(dev, vmsg);
> +    case VHOST_USER_GET_CONFIG:
> +        return vu_get_config(dev, vmsg);
> +    case VHOST_USER_SET_CONFIG:
> +        return vu_set_config(dev, vmsg);
> +    case VHOST_USER_SET_CONFIG_FD:
> +        return vu_set_config_fd(dev, vmsg);
>      default:
>          vmsg_close_fds(vmsg);
>          vu_panic(dev, "Unhandled request: %d", vmsg->request);
> @@ -878,6 +924,10 @@ vu_deinit(VuDev *dev)
>  
>      vu_close_log(dev);
>  
> +    if (dev->config_fd != -1) {
> +        close(dev->config_fd);
> +    }
> +
>      if (dev->sock != -1) {
>          close(dev->sock);
>      }
> @@ -907,6 +957,7 @@ vu_init(VuDev *dev,
>      dev->remove_watch = remove_watch;
>      dev->iface = iface;
>      dev->log_call_fd = -1;
> +    dev->config_fd = -1;
>      for (i = 0; i < VHOST_MAX_NR_VIRTQUEUE; i++) {
>          dev->vq[i] = (VuVirtq) {
>              .call_fd = -1, .kick_fd = -1, .err_fd = -1,
> diff --git a/contrib/libvhost-user/libvhost-user.h
> b/contrib/libvhost-user/libvhost-user.h
> index 53ef222..899dee1 100644
> --- a/contrib/libvhost-user/libvhost-user.h
> +++ b/contrib/libvhost-user/libvhost-user.h
> @@ -30,6 +30,8 @@
>  
>  #define VHOST_MEMORY_MAX_NREGIONS 8
>  
> +#define VHOST_USER_MAX_CONFIG_SIZE 256
> +
>  enum VhostUserProtocolFeature {
>      VHOST_USER_PROTOCOL_F_MQ = 0,
>      VHOST_USER_PROTOCOL_F_LOG_SHMFD = 1,
> @@ -62,6 +64,9 @@ typedef enum VhostUserRequest {
>      VHOST_USER_SET_VRING_ENABLE = 18,
>      VHOST_USER_SEND_RARP = 19,
>      VHOST_USER_INPUT_GET_CONFIG = 20,
> +    VHOST_USER_GET_CONFIG = 24,
> +    VHOST_USER_SET_CONFIG = 25,
> +    VHOST_USER_SET_CONFIG_FD = 26,
>      VHOST_USER_MAX
>  } VhostUserRequest;
>  
> @@ -105,6 +110,7 @@ typedef struct VhostUserMsg {
>          struct vhost_vring_addr addr;
>          VhostUserMemory memory;
>          VhostUserLog log;
> +        uint8_t config[VHOST_USER_MAX_CONFIG_SIZE];
>      } payload;
>  
>      int fds[VHOST_MEMORY_MAX_NREGIONS];
> @@ -132,6 +138,9 @@ typedef void (*vu_set_features_cb) (VuDev *dev, uint64_t
> features);
>  typedef int (*vu_process_msg_cb) (VuDev *dev, VhostUserMsg *vmsg,
>                                    int *do_reply);
>  typedef void (*vu_queue_set_started_cb) (VuDev *dev, int qidx, bool
>  started);
> +typedef int (*vu_get_config_cb) (VuDev *dev, uint8_t *config, size_t len);
> +typedef int (*vu_set_config_cb) (VuDev *dev, const uint8_t *config,
> +                                 size_t len);
>  
>  typedef struct VuDevIface {
>      /* called by VHOST_USER_GET_FEATURES to get the features bitmask */
> @@ -148,6 +157,10 @@ typedef struct VuDevIface {
>      vu_process_msg_cb process_msg;
>      /* tells when queues can be processed */
>      vu_queue_set_started_cb queue_set_started;
> +    /* get the config space of the device */
> +    vu_get_config_cb get_config;
> +    /* set the config space of the device */
> +    vu_set_config_cb set_config;
>  } VuDevIface;
>  
>  typedef void (*vu_queue_handler_cb) (VuDev *dev, int qidx);
> @@ -212,6 +225,7 @@ struct VuDev {
>      VuDevRegion regions[VHOST_MEMORY_MAX_NREGIONS];
>      VuVirtq vq[VHOST_MAX_NR_VIRTQUEUE];
>      int log_call_fd;
> +    int config_fd;
>      uint64_t log_size;
>      uint8_t *log_table;
>      uint64_t features;
> --
> 1.9.3
> 
> 

  reply	other threads:[~2017-08-09 18:34 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-10 10:12 [Qemu-devel] [PATCH v2 0/4] *** Introduce a new vhost-user-blk host device to Qemu *** Changpeng Liu
2017-08-09 16:58 ` Michael S. Tsirkin
2017-08-10 10:12 ` [Qemu-devel] [PATCH v2 1/4] vhost-user: add new vhost user messages to support virtio config space Changpeng Liu
2017-08-09 15:10   ` Marc-André Lureau
2017-08-10 10:12 ` [Qemu-devel] [PATCH v2 2/4] vhost-user-blk: introduce a new vhost-user-blk host device Changpeng Liu
2017-08-09 15:39   ` Marc-André Lureau
2017-08-10  0:42     ` Liu, Changpeng
2017-08-09 17:10   ` Michael S. Tsirkin
2017-08-10  9:29     ` Paolo Bonzini
2017-08-10 10:12 ` [Qemu-devel] [PATCH v2 3/4] contrib/libvhost-user: enable virtio config space messages Changpeng Liu
2017-08-09 18:34   ` Marc-André Lureau [this message]
2017-08-10 10:12 ` [Qemu-devel] [PATCH v2 4/4] contrib/vhost-user-blk: introduce a vhost-user-blk sample application Changpeng Liu
2017-08-09 18:27   ` Marc-André Lureau

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=223333740.69259397.1502303655657.JavaMail.zimbra@redhat.com \
    --to=marcandre.lureau@redhat.com \
    --cc=changpeng.liu@intel.com \
    --cc=felipe@nutanix.com \
    --cc=james.r.harris@intel.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@gmail.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.