Re: [PATCH V5 3/9] virtio: introduce config op to synchronize vring callbacks

2022-05-19 Thread Stefano Garzarella

On Wed, May 18, 2022 at 11:59:45AM +0800, Jason Wang wrote:

This patch introduces new virtio config op to vring
callbacks. Transport specific method is required to make sure the
write before this function is visible to the vring_interrupt() that is
called after the return of this function. For the transport that
doesn't provide synchronize_vqs(), use synchornize_rcu() which
synchronize with IRQ implicitly as a fallback.

Cc: Thomas Gleixner 
Cc: Peter Zijlstra 
Cc: "Paul E. McKenney" 
Cc: Marc Zyngier 
Cc: Halil Pasic 
Cc: Cornelia Huck 
Cc: Vineeth Vijayan 
Cc: Peter Oberparleiter 
Cc: linux-s...@vger.kernel.org
Reviewed-by: Cornelia Huck 
Signed-off-by: Jason Wang 
---
include/linux/virtio_config.h | 25 +
1 file changed, 25 insertions(+)


Reviewed-by: Stefano Garzarella 

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization


[PATCH V5 3/9] virtio: introduce config op to synchronize vring callbacks

2022-05-17 Thread Jason Wang
This patch introduces new virtio config op to vring
callbacks. Transport specific method is required to make sure the
write before this function is visible to the vring_interrupt() that is
called after the return of this function. For the transport that
doesn't provide synchronize_vqs(), use synchornize_rcu() which
synchronize with IRQ implicitly as a fallback.

Cc: Thomas Gleixner 
Cc: Peter Zijlstra 
Cc: "Paul E. McKenney" 
Cc: Marc Zyngier 
Cc: Halil Pasic 
Cc: Cornelia Huck 
Cc: Vineeth Vijayan 
Cc: Peter Oberparleiter 
Cc: linux-s...@vger.kernel.org
Reviewed-by: Cornelia Huck 
Signed-off-by: Jason Wang 
---
 include/linux/virtio_config.h | 25 +
 1 file changed, 25 insertions(+)

diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index b341dd62aa4d..25be018810a7 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -57,6 +57,11 @@ struct virtio_shm_region {
  * include a NULL entry for vqs unused by driver
  * Returns 0 on success or error status
  * @del_vqs: free virtqueues found by find_vqs().
+ * @synchronize_cbs: synchronize with the virtqueue callbacks (optional)
+ *  The function guarantees that all memory operations on the
+ *  queue before it are visible to the vring_interrupt() that is
+ *  called after it.
+ *  vdev: the virtio_device
  * @get_features: get the array of feature bits for this device.
  * vdev: the virtio_device
  * Returns the first 64 feature bits (all we currently need).
@@ -89,6 +94,7 @@ struct virtio_config_ops {
const char * const names[], const bool *ctx,
struct irq_affinity *desc);
void (*del_vqs)(struct virtio_device *);
+   void (*synchronize_cbs)(struct virtio_device *);
u64 (*get_features)(struct virtio_device *vdev);
int (*finalize_features)(struct virtio_device *vdev);
const char *(*bus_name)(struct virtio_device *vdev);
@@ -217,6 +223,25 @@ int virtio_find_vqs_ctx(struct virtio_device *vdev, 
unsigned nvqs,
  desc);
 }
 
+/**
+ * virtio_synchronize_cbs - synchronize with virtqueue callbacks
+ * @vdev: the device
+ */
+static inline
+void virtio_synchronize_cbs(struct virtio_device *dev)
+{
+   if (dev->config->synchronize_cbs) {
+   dev->config->synchronize_cbs(dev);
+   } else {
+   /*
+* A best effort fallback to synchronize with
+* interrupts, preemption and softirq disabled
+* regions. See comment above synchronize_rcu().
+*/
+   synchronize_rcu();
+   }
+}
+
 /**
  * virtio_device_ready - enable vq use in probe function
  * @vdev: the device
-- 
2.25.1

___
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization