qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 2/5] vhost: introduce wrappers to set guest notifiers for


From: Dima Stepanov
Subject: Re: [PATCH v2 2/5] vhost: introduce wrappers to set guest notifiers for virtio device
Date: Mon, 11 May 2020 11:55:41 +0300
User-agent: Mutt/1.5.24 (2015-08-30)

On Mon, May 11, 2020 at 11:03:01AM +0800, Jason Wang wrote:
> 
> On 2020/4/30 下午9:36, Dima Stepanov wrote:
> >Introduce new wrappers to set/reset guest notifiers for the virtio
> >device in the vhost device module:
> >   vhost_dev_assign_guest_notifiers
> >     ->set_guest_notifiers(..., ..., true);
> >   vhost_dev_drop_guest_notifiers
> >     ->set_guest_notifiers(..., ..., false);
> >This is a preliminary step to refactor code,
> 
> 
> Maybe I miss something, I don't see any add-on patch to modify the new
> wrapper in this series?
Hi, in fact the next 3/5 patch:
  "[PATCH v2 3/5] vhost-user-blk: add mechanism to track the guest
notifiers init state"
is about using these wrappers. But disregard it, i decided to follow
Raphael suggestion. So we will fix the vhost-user-blk case first, so i
will not introduce these wrappers. And the code will be more easier to
read and straightforward.
I will send v3 as soon as we decide what to do with the migration fix
in this patchset.

No other comments mixed in below.

> 
> 
> >  so the set_guest_notifiers
> >methods could be called based on the vhost device state.
> >Update all vhost used devices to use these wrappers instead of direct
> >method call.
> >
> >Signed-off-by: Dima Stepanov <address@hidden>
> >---
> >  backends/cryptodev-vhost.c  | 26 +++++++++++++++-----------
> >  backends/vhost-user.c       | 16 +++++-----------
> >  hw/block/vhost-user-blk.c   | 15 +++++----------
> >  hw/net/vhost_net.c          | 30 +++++++++++++++++-------------
> >  hw/scsi/vhost-scsi-common.c | 15 +++++----------
> >  hw/virtio/vhost-user-fs.c   | 17 +++++++----------
> >  hw/virtio/vhost-vsock.c     | 18 ++++++++----------
> >  hw/virtio/vhost.c           | 38 ++++++++++++++++++++++++++++++++++++++
> >  hw/virtio/virtio.c          | 13 +++++++++++++
> >  include/hw/virtio/vhost.h   |  4 ++++
> >  include/hw/virtio/virtio.h  |  1 +
> >  11 files changed, 118 insertions(+), 75 deletions(-)
> >
> >diff --git a/backends/cryptodev-vhost.c b/backends/cryptodev-vhost.c
> >index 8337c9a..4522195 100644
> >--- a/backends/cryptodev-vhost.c
> >+++ b/backends/cryptodev-vhost.c
> >@@ -169,16 +169,13 @@ vhost_set_vring_enable(CryptoDevBackendClient *cc,
> >  int cryptodev_vhost_start(VirtIODevice *dev, int total_queues)
> >  {
> >      VirtIOCrypto *vcrypto = VIRTIO_CRYPTO(dev);
> >-    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev)));
> >-    VirtioBusState *vbus = VIRTIO_BUS(qbus);
> >-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
> >      int r, e;
> >      int i;
> >      CryptoDevBackend *b = vcrypto->cryptodev;
> >      CryptoDevBackendVhost *vhost_crypto;
> >      CryptoDevBackendClient *cc;
> >-    if (!k->set_guest_notifiers) {
> >+    if (!virtio_device_guest_notifiers_initialized(dev)) {
> >          error_report("binding does not support guest notifiers");
> >          return -ENOSYS;
> >      }
> >@@ -198,9 +195,13 @@ int cryptodev_vhost_start(VirtIODevice *dev, int 
> >total_queues)
> >          }
> >       }
> >-    r = k->set_guest_notifiers(qbus->parent, total_queues, true);
> >+    /*
> >+     * Since all the states are handled by one vhost device,
> >+     * use the first one in array.
> >+     */
> >+    vhost_crypto = cryptodev_get_vhost(b->conf.peers.ccs[0], b, 0);
> >+    r = vhost_dev_assign_guest_notifiers(&vhost_crypto->dev, dev, 
> >total_queues);
> >      if (r < 0) {
> >-        error_report("error binding guest notifier: %d", -r);
> >          goto err;
> >      }
> >@@ -232,7 +233,8 @@ err_start:
> >          vhost_crypto = cryptodev_get_vhost(cc, b, i);
> >          cryptodev_vhost_stop_one(vhost_crypto, dev);
> >      }
> >-    e = k->set_guest_notifiers(qbus->parent, total_queues, false);
> >+    vhost_crypto = cryptodev_get_vhost(b->conf.peers.ccs[0], b, 0);
> >+    e = vhost_dev_drop_guest_notifiers(&vhost_crypto->dev, dev, 
> >total_queues);
> >      if (e < 0) {
> >          error_report("vhost guest notifier cleanup failed: %d", e);
> >      }
> >@@ -242,9 +244,6 @@ err:
> >  void cryptodev_vhost_stop(VirtIODevice *dev, int total_queues)
> >  {
> >-    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev)));
> >-    VirtioBusState *vbus = VIRTIO_BUS(qbus);
> >-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
> >      VirtIOCrypto *vcrypto = VIRTIO_CRYPTO(dev);
> >      CryptoDevBackend *b = vcrypto->cryptodev;
> >      CryptoDevBackendVhost *vhost_crypto;
> >@@ -259,7 +258,12 @@ void cryptodev_vhost_stop(VirtIODevice *dev, int 
> >total_queues)
> >          cryptodev_vhost_stop_one(vhost_crypto, dev);
> >      }
> >-    r = k->set_guest_notifiers(qbus->parent, total_queues, false);
> >+    /*
> >+     * Since all the states are handled by one vhost device,
> >+     * use the first one in array.
> >+     */
> >+    vhost_crypto = cryptodev_get_vhost(b->conf.peers.ccs[0], b, 0);
> >+    r = vhost_dev_drop_guest_notifiers(&vhost_crypto->dev, dev, 
> >total_queues);
> >      if (r < 0) {
> >          error_report("vhost guest notifier cleanup failed: %d", r);
> >      }
> >diff --git a/backends/vhost-user.c b/backends/vhost-user.c
> >index 2bf3406..e116bc6 100644
> >--- a/backends/vhost-user.c
> >+++ b/backends/vhost-user.c
> >@@ -60,15 +60,13 @@ vhost_user_backend_dev_init(VhostUserBackend *b, 
> >VirtIODevice *vdev,
> >  void
> >  vhost_user_backend_start(VhostUserBackend *b)
> >  {
> >-    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(b->vdev)));
> >-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
> >      int ret, i ;
> >      if (b->started) {
> >          return;
> >      }
> >-    if (!k->set_guest_notifiers) {
> >+    if (!virtio_device_guest_notifiers_initialized(b->vdev)) {
> >          error_report("binding does not support guest notifiers");
> >          return;
> >      }
> >@@ -78,9 +76,8 @@ vhost_user_backend_start(VhostUserBackend *b)
> >          return;
> >      }
> >-    ret = k->set_guest_notifiers(qbus->parent, b->dev.nvqs, true);
> >+    ret = vhost_dev_assign_guest_notifiers(&b->dev, b->vdev, b->dev.nvqs);
> >      if (ret < 0) {
> >-        error_report("Error binding guest notifier");
> >          goto err_host_notifiers;
> >      }
> >@@ -104,7 +101,7 @@ vhost_user_backend_start(VhostUserBackend *b)
> >      return;
> >  err_guest_notifiers:
> >-    k->set_guest_notifiers(qbus->parent, b->dev.nvqs, false);
> >+    vhost_dev_drop_guest_notifiers(&b->dev, b->vdev, b->dev.nvqs);
> >  err_host_notifiers:
> >      vhost_dev_disable_notifiers(&b->dev, b->vdev);
> >  }
> >@@ -112,8 +109,6 @@ err_host_notifiers:
> >  void
> >  vhost_user_backend_stop(VhostUserBackend *b)
> >  {
> >-    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(b->vdev)));
> >-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
> >      int ret = 0;
> >      if (!b->started) {
> >@@ -122,9 +117,8 @@ vhost_user_backend_stop(VhostUserBackend *b)
> >      vhost_dev_stop(&b->dev, b->vdev);
> >-    if (k->set_guest_notifiers) {
> >-        ret = k->set_guest_notifiers(qbus->parent,
> >-                                     b->dev.nvqs, false);
> >+    if (virtio_device_guest_notifiers_initialized(b->vdev)) {
> >+        ret = vhost_dev_drop_guest_notifiers(&b->dev, b->vdev, b->dev.nvqs);
> >          if (ret < 0) {
> >              error_report("vhost guest notifier cleanup failed: %d", ret);
> >          }
> >diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c
> >index 17df533..70d7842 100644
> >--- a/hw/block/vhost-user-blk.c
> >+++ b/hw/block/vhost-user-blk.c
> >@@ -109,11 +109,9 @@ const VhostDevConfigOps blk_ops = {
> >  static int vhost_user_blk_start(VirtIODevice *vdev)
> >  {
> >      VHostUserBlk *s = VHOST_USER_BLK(vdev);
> >-    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
> >-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
> >      int i, ret;
> >-    if (!k->set_guest_notifiers) {
> >+    if (!virtio_device_guest_notifiers_initialized(vdev)) {
> >          error_report("binding does not support guest notifiers");
> >          return -ENOSYS;
> >      }
> >@@ -124,9 +122,8 @@ static int vhost_user_blk_start(VirtIODevice *vdev)
> >          return ret;
> >      }
> >-    ret = k->set_guest_notifiers(qbus->parent, s->dev.nvqs, true);
> >+    ret = vhost_dev_assign_guest_notifiers(&s->dev, vdev, s->dev.nvqs);
> >      if (ret < 0) {
> >-        error_report("Error binding guest notifier: %d", -ret);
> >          goto err_host_notifiers;
> >      }
> >@@ -163,7 +160,7 @@ static int vhost_user_blk_start(VirtIODevice *vdev)
> >      return ret;
> >  err_guest_notifiers:
> >-    k->set_guest_notifiers(qbus->parent, s->dev.nvqs, false);
> >+    vhost_dev_drop_guest_notifiers(&s->dev, vdev, s->dev.nvqs);
> >  err_host_notifiers:
> >      vhost_dev_disable_notifiers(&s->dev, vdev);
> >      return ret;
> >@@ -172,17 +169,15 @@ err_host_notifiers:
> >  static void vhost_user_blk_stop(VirtIODevice *vdev)
> >  {
> >      VHostUserBlk *s = VHOST_USER_BLK(vdev);
> >-    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
> >-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
> >      int ret;
> >-    if (!k->set_guest_notifiers) {
> >+    if (!virtio_device_guest_notifiers_initialized(vdev)) {
> >          return;
> >      }
> >      vhost_dev_stop(&s->dev, vdev);
> >-    ret = k->set_guest_notifiers(qbus->parent, s->dev.nvqs, false);
> >+    ret = vhost_dev_drop_guest_notifiers(&s->dev, vdev, s->dev.nvqs);
> >      if (ret < 0) {
> >          error_report("vhost guest notifier cleanup failed: %d", ret);
> >          return;
> >diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
> >index 6b82803..c13b444 100644
> >--- a/hw/net/vhost_net.c
> >+++ b/hw/net/vhost_net.c
> >@@ -303,19 +303,15 @@ static void vhost_net_stop_one(struct vhost_net *net,
> >  int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
> >                      int total_queues)
> >  {
> >-    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev)));
> >-    VirtioBusState *vbus = VIRTIO_BUS(qbus);
> >-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
> >+    struct vhost_net *net;
> >      int r, e, i;
> >-    if (!k->set_guest_notifiers) {
> >+    if (!virtio_device_guest_notifiers_initialized(dev)) {
> >          error_report("binding does not support guest notifiers");
> >          return -ENOSYS;
> >      }
> >      for (i = 0; i < total_queues; i++) {
> >-        struct vhost_net *net;
> >-
> >          net = get_vhost_net(ncs[i].peer);
> >          vhost_net_set_vq_index(net, i * 2);
> >@@ -328,9 +324,13 @@ int vhost_net_start(VirtIODevice *dev, NetClientState 
> >*ncs,
> >          }
> >       }
> >-    r = k->set_guest_notifiers(qbus->parent, total_queues * 2, true);
> >+    /*
> >+     * Since all the states are handled by one vhost_net device,
> >+     * use the first one in array.
> >+     */
> 
> 
> This comment is confusing, kernel vhost-net backends will use all its peers.
> 
> 
> >+    net = get_vhost_net(ncs[0].peer);
> >+    r = vhost_dev_assign_guest_notifiers(&net->dev, dev, total_queues * 2);
> >      if (r < 0) {
> >-        error_report("Error binding guest notifier: %d", -r);
> >          goto err;
> >      }
> >@@ -357,7 +357,8 @@ err_start:
> >      while (--i >= 0) {
> >          vhost_net_stop_one(get_vhost_net(ncs[i].peer), dev);
> >      }
> >-    e = k->set_guest_notifiers(qbus->parent, total_queues * 2, false);
> >+    net = get_vhost_net(ncs[0].peer);
> >+    e = vhost_dev_drop_guest_notifiers(&net->dev, dev, total_queues * 2);
> >      if (e < 0) {
> >          fprintf(stderr, "vhost guest notifier cleanup failed: %d\n", e);
> >          fflush(stderr);
> >@@ -369,16 +370,19 @@ err:
> >  void vhost_net_stop(VirtIODevice *dev, NetClientState *ncs,
> >                      int total_queues)
> >  {
> >-    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev)));
> >-    VirtioBusState *vbus = VIRTIO_BUS(qbus);
> >-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
> >+    struct vhost_net *net;
> >      int i, r;
> >      for (i = 0; i < total_queues; i++) {
> >          vhost_net_stop_one(get_vhost_net(ncs[i].peer), dev);
> >      }
> >-    r = k->set_guest_notifiers(qbus->parent, total_queues * 2, false);
> >+    /*
> >+     * Since all the states are handled by one vhost_net device,
> >+     * use the first one in array.
> >+     */
> >+    net = get_vhost_net(ncs[0].peer);
> >+    r = vhost_dev_drop_guest_notifiers(&net->dev, dev, total_queues * 2);
> >      if (r < 0) {
> >          fprintf(stderr, "vhost guest notifier cleanup failed: %d\n", r);
> >          fflush(stderr);
> >diff --git a/hw/scsi/vhost-scsi-common.c b/hw/scsi/vhost-scsi-common.c
> >index 8ec49d7..8f51ec0 100644
> >--- a/hw/scsi/vhost-scsi-common.c
> >+++ b/hw/scsi/vhost-scsi-common.c
> >@@ -29,10 +29,8 @@ int vhost_scsi_common_start(VHostSCSICommon *vsc)
> >  {
> >      int ret, i;
> >      VirtIODevice *vdev = VIRTIO_DEVICE(vsc);
> >-    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
> >-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
> >-    if (!k->set_guest_notifiers) {
> >+    if (!virtio_device_guest_notifiers_initialized(vdev)) {
> >          error_report("binding does not support guest notifiers");
> >          return -ENOSYS;
> >      }
> >@@ -42,9 +40,8 @@ int vhost_scsi_common_start(VHostSCSICommon *vsc)
> >          return ret;
> >      }
> >-    ret = k->set_guest_notifiers(qbus->parent, vsc->dev.nvqs, true);
> >+    ret = vhost_dev_assign_guest_notifiers(&vsc->dev, vdev, vsc->dev.nvqs);
> >      if (ret < 0) {
> >-        error_report("Error binding guest notifier");
> >          goto err_host_notifiers;
> >      }
> >@@ -66,7 +63,7 @@ int vhost_scsi_common_start(VHostSCSICommon *vsc)
> >      return ret;
> >  err_guest_notifiers:
> >-    k->set_guest_notifiers(qbus->parent, vsc->dev.nvqs, false);
> >+    vhost_dev_drop_guest_notifiers(&vsc->dev, vdev, vsc->dev.nvqs);
> >  err_host_notifiers:
> >      vhost_dev_disable_notifiers(&vsc->dev, vdev);
> >      return ret;
> >@@ -75,14 +72,12 @@ err_host_notifiers:
> >  void vhost_scsi_common_stop(VHostSCSICommon *vsc)
> >  {
> >      VirtIODevice *vdev = VIRTIO_DEVICE(vsc);
> >-    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
> >-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
> >      int ret = 0;
> >      vhost_dev_stop(&vsc->dev, vdev);
> >-    if (k->set_guest_notifiers) {
> >-        ret = k->set_guest_notifiers(qbus->parent, vsc->dev.nvqs, false);
> >+    if (virtio_device_guest_notifiers_initialized(vdev)) {
> >+        ret = vhost_dev_drop_guest_notifiers(&vsc->dev, vdev, 
> >vsc->dev.nvqs);
> >          if (ret < 0) {
> >                  error_report("vhost guest notifier cleanup failed: %d", 
> > ret);
> >          }
> >diff --git a/hw/virtio/vhost-user-fs.c b/hw/virtio/vhost-user-fs.c
> >index 6136768..6b101fc 100644
> >--- a/hw/virtio/vhost-user-fs.c
> >+++ b/hw/virtio/vhost-user-fs.c
> >@@ -38,12 +38,10 @@ static void vuf_get_config(VirtIODevice *vdev, uint8_t 
> >*config)
> >  static void vuf_start(VirtIODevice *vdev)
> >  {
> >      VHostUserFS *fs = VHOST_USER_FS(vdev);
> >-    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
> >-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
> >      int ret;
> >      int i;
> >-    if (!k->set_guest_notifiers) {
> >+    if (!virtio_device_guest_notifiers_initialized(vdev)) {
> >          error_report("binding does not support guest notifiers");
> >          return;
> >      }
> >@@ -54,9 +52,9 @@ static void vuf_start(VirtIODevice *vdev)
> >          return;
> >      }
> >-    ret = k->set_guest_notifiers(qbus->parent, fs->vhost_dev.nvqs, true);
> >+    ret = vhost_dev_assign_guest_notifiers(&fs->vhost_dev, vdev,
> >+            fs->vhost_dev.nvqs);
> >      if (ret < 0) {
> >-        error_report("Error binding guest notifier: %d", -ret);
> >          goto err_host_notifiers;
> >      }
> >@@ -79,7 +77,7 @@ static void vuf_start(VirtIODevice *vdev)
> >      return;
> >  err_guest_notifiers:
> >-    k->set_guest_notifiers(qbus->parent, fs->vhost_dev.nvqs, false);
> >+    vhost_dev_drop_guest_notifiers(&fs->vhost_dev, vdev, 
> >fs->vhost_dev.nvqs);
> >  err_host_notifiers:
> >      vhost_dev_disable_notifiers(&fs->vhost_dev, vdev);
> >  }
> >@@ -87,17 +85,16 @@ err_host_notifiers:
> >  static void vuf_stop(VirtIODevice *vdev)
> >  {
> >      VHostUserFS *fs = VHOST_USER_FS(vdev);
> >-    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
> >-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
> >      int ret;
> >-    if (!k->set_guest_notifiers) {
> >+    if (!virtio_device_guest_notifiers_initialized(vdev)) {
> >          return;
> >      }
> >      vhost_dev_stop(&fs->vhost_dev, vdev);
> >-    ret = k->set_guest_notifiers(qbus->parent, fs->vhost_dev.nvqs, false);
> >+    ret = vhost_dev_drop_guest_notifiers(&fs->vhost_dev, vdev,
> >+            fs->vhost_dev.nvqs);
> >      if (ret < 0) {
> >          error_report("vhost guest notifier cleanup failed: %d", ret);
> >          return;
> >diff --git a/hw/virtio/vhost-vsock.c b/hw/virtio/vhost-vsock.c
> >index 09b6b07..52489dd 100644
> >--- a/hw/virtio/vhost-vsock.c
> >+++ b/hw/virtio/vhost-vsock.c
> >@@ -75,12 +75,10 @@ static int vhost_vsock_set_running(VHostVSock *vsock, 
> >int start)
> >  static void vhost_vsock_start(VirtIODevice *vdev)
> >  {
> >      VHostVSock *vsock = VHOST_VSOCK(vdev);
> >-    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
> >-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
> >      int ret;
> >      int i;
> >-    if (!k->set_guest_notifiers) {
> >+    if (!virtio_device_guest_notifiers_initialized(vdev)) {
> >          error_report("binding does not support guest notifiers");
> >          return;
> >      }
> >@@ -91,9 +89,9 @@ static void vhost_vsock_start(VirtIODevice *vdev)
> >          return;
> >      }
> >-    ret = k->set_guest_notifiers(qbus->parent, vsock->vhost_dev.nvqs, true);
> >+    ret = vhost_dev_assign_guest_notifiers(&vsock->vhost_dev,
> >+            vdev, vsock->vhost_dev.nvqs);
> >      if (ret < 0) {
> >-        error_report("Error binding guest notifier: %d", -ret);
> >          goto err_host_notifiers;
> >      }
> >@@ -123,7 +121,8 @@ static void vhost_vsock_start(VirtIODevice *vdev)
> >  err_dev_start:
> >      vhost_dev_stop(&vsock->vhost_dev, vdev);
> >  err_guest_notifiers:
> >-    k->set_guest_notifiers(qbus->parent, vsock->vhost_dev.nvqs, false);
> >+    vhost_dev_drop_guest_notifiers(&vsock->vhost_dev,
> >+            vdev, vsock->vhost_dev.nvqs);
> >  err_host_notifiers:
> >      vhost_dev_disable_notifiers(&vsock->vhost_dev, vdev);
> >  }
> >@@ -131,11 +130,9 @@ err_host_notifiers:
> >  static void vhost_vsock_stop(VirtIODevice *vdev)
> >  {
> >      VHostVSock *vsock = VHOST_VSOCK(vdev);
> >-    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
> >-    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
> >      int ret;
> >-    if (!k->set_guest_notifiers) {
> >+    if (!virtio_device_guest_notifiers_initialized(vdev)) {
> >          return;
> >      }
> >@@ -147,7 +144,8 @@ static void vhost_vsock_stop(VirtIODevice *vdev)
> >      vhost_dev_stop(&vsock->vhost_dev, vdev);
> >-    ret = k->set_guest_notifiers(qbus->parent, vsock->vhost_dev.nvqs, 
> >false);
> >+    ret = vhost_dev_drop_guest_notifiers(&vsock->vhost_dev,
> >+            vdev, vsock->vhost_dev.nvqs);
> >      if (ret < 0) {
> >          error_report("vhost guest notifier cleanup failed: %d", ret);
> >          return;
> >diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
> >index 01ebe12..fa3da9c 100644
> >--- a/hw/virtio/vhost.c
> >+++ b/hw/virtio/vhost.c
> >@@ -1419,6 +1419,44 @@ void vhost_dev_disable_notifiers(struct vhost_dev 
> >*hdev, VirtIODevice *vdev)
> >      virtio_device_release_ioeventfd(vdev);
> >  }
> >+/*
> >+ * Assign guest notifiers.
> >+ * Should be called after vhost_dev_enable_notifiers.
> >+ */
> >+int vhost_dev_assign_guest_notifiers(struct vhost_dev *hdev,
> >+                                     VirtIODevice *vdev, int nvqs)
> >+{
> >+    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
> >+    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
> >+    int ret;
> >+
> >+    ret = k->set_guest_notifiers(qbus->parent, nvqs, true);
> >+    if (ret < 0) {
> >+        error_report("Error binding guest notifier: %d", -ret);
> >+    }
> >+
> >+    return ret;
> >+}
> >+
> >+/*
> >+ * Drop guest notifiers.
> >+ * Should be called before vhost_dev_disable_notifiers.
> >+ */
> >+int vhost_dev_drop_guest_notifiers(struct vhost_dev *hdev,
> >+                                   VirtIODevice *vdev, int nvqs)
> >+{
> 
> 
> hdev is not used?
> 
> Thanks
> 
> 
> >+    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
> >+    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
> >+    int ret;
> >+
> >+    ret = k->set_guest_notifiers(qbus->parent, nvqs, false);
> >+    if (ret < 0) {
> >+        error_report("Error reset guest notifier: %d", -ret);
> >+    }
> >+
> >+    return ret;
> >+}
> >+
> >  /* Test and clear event pending status.
> >   * Should be called after unmask to avoid losing events.
> >   */
> >diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
> >index b6c8ef5..8a95618 100644
> >--- a/hw/virtio/virtio.c
> >+++ b/hw/virtio/virtio.c
> >@@ -3812,6 +3812,19 @@ bool virtio_device_ioeventfd_enabled(VirtIODevice 
> >*vdev)
> >      return virtio_bus_ioeventfd_enabled(vbus);
> >  }
> >+/*
> >+ * Check if set_guest_notifiers() method is set by the init routine.
> >+ * Return true if yes, otherwise return false.
> >+ */
> >+bool virtio_device_guest_notifiers_initialized(VirtIODevice *vdev)
> >+{
> >+    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
> >+    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
> >+
> >+    return k->set_guest_notifiers;
> >+}
> >+
> >+
> >  static const TypeInfo virtio_device_info = {
> >      .name = TYPE_VIRTIO_DEVICE,
> >      .parent = TYPE_DEVICE,
> >diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h
> >index 085450c..4d0d2e2 100644
> >--- a/include/hw/virtio/vhost.h
> >+++ b/include/hw/virtio/vhost.h
> >@@ -100,6 +100,10 @@ int vhost_dev_start(struct vhost_dev *hdev, 
> >VirtIODevice *vdev);
> >  void vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev);
> >  int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev);
> >  void vhost_dev_disable_notifiers(struct vhost_dev *hdev, VirtIODevice 
> > *vdev);
> >+int vhost_dev_assign_guest_notifiers(struct vhost_dev *hdev,
> >+                                     VirtIODevice *vdev, int nvqs);
> >+int vhost_dev_drop_guest_notifiers(struct vhost_dev *hdev,
> >+                                   VirtIODevice *vdev, int nvqs);
> >  /* Test and clear masked event pending status.
> >   * Should be called after unmask to avoid losing events.
> >diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
> >index b69d517..d9a3d72 100644
> >--- a/include/hw/virtio/virtio.h
> >+++ b/include/hw/virtio/virtio.h
> >@@ -323,6 +323,7 @@ void 
> >virtio_queue_aio_set_host_notifier_handler(VirtQueue *vq, AioContext *ctx,
> >                                                  VirtIOHandleAIOOutput 
> > handle_output);
> >  VirtQueue *virtio_vector_first_queue(VirtIODevice *vdev, uint16_t vector);
> >  VirtQueue *virtio_vector_next_queue(VirtQueue *vq);
> >+bool virtio_device_guest_notifiers_initialized(VirtIODevice *vdev);
> >  static inline void virtio_add_feature(uint64_t *features, unsigned int 
> > fbit)
> >  {
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]