vhost: add features changed callback
authorYuanhan Liu <yuanhan.liu@linux.intel.com>
Sat, 1 Apr 2017 07:22:54 +0000 (15:22 +0800)
committerYuanhan Liu <yuanhan.liu@linux.intel.com>
Sat, 1 Apr 2017 08:42:44 +0000 (10:42 +0200)
Features could be changed after the feature negotiation. For example,
VHOST_F_LOG_ALL will be set/cleared at the start/end of live migration,
respecitively. Thus, we need a new callback to inform the application
on such change.

Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
doc/guides/prog_guide/vhost_lib.rst
lib/librte_vhost/rte_virtio_net.h
lib/librte_vhost/vhost_user.c

index 88f0591..a4fb1f1 100644 (file)
@@ -143,6 +143,12 @@ The following is an overview of some key Vhost API functions:
     This callback is invoked when a specific queue's state is changed, for
     example to enabled or disabled.
 
+  * ``features_changed(int vid, uint64_t features)``
+
+    This callback is invoked when the features is changed. For example,
+    ``VHOST_F_LOG_ALL`` will be set/cleared at the start/end of live
+    migration, respectively.
+
 * ``rte_vhost_enqueue_burst(vid, queue_id, pkts, count)``
 
   Transmits (enqueues) ``count`` packets from host to guest.
index 78828cd..c867590 100644 (file)
@@ -93,7 +93,15 @@ struct vhost_device_ops {
 
        int (*vring_state_changed)(int vid, uint16_t queue_id, int enable);     /**< triggered when a vring is enabled or disabled */
 
-       void *reserved[5]; /**< Reserved for future extension */
+       /**
+        * Features could be changed after the feature negotiation.
+        * For example, VHOST_F_LOG_ALL will be set/cleared at the
+        * start/end of live migration, respectively. This callback
+        * is used to inform the application on such change.
+        */
+       int (*features_changed)(int vid, uint64_t features);
+
+       void *reserved[4]; /**< Reserved for future extension */
 };
 
 /**
index 604d95d..8b12ebb 100644 (file)
@@ -167,6 +167,11 @@ vhost_user_set_features(struct virtio_net *dev, uint64_t features)
        if (features & ~vhost_features)
                return -1;
 
+       if ((dev->flags & VIRTIO_DEV_RUNNING) && dev->features != features) {
+               if (dev->notify_ops->features_changed)
+                       dev->notify_ops->features_changed(dev->vid, features);
+       }
+
        dev->features = features;
        if (dev->features &
                ((1 << VIRTIO_NET_F_MRG_RXBUF) | (1ULL << VIRTIO_F_VERSION_1))) {