Jason Wang
2022-Apr-25 02:44 UTC
[PATCH V3 3/9] virtio: introduce config op to synchronize vring callbacks
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 <tglx at linutronix.de> Cc: Peter Zijlstra <peterz at infradead.org> Cc: "Paul E. McKenney" <paulmck at kernel.org> Cc: Marc Zyngier <maz at kernel.org> Cc: Halil Pasic <pasic at linux.ibm.com> Cc: Cornelia Huck <cohuck at redhat.com> Signed-off-by: Jason Wang <jasowang at redhat.com> --- include/linux/virtio_config.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h index b341dd62aa4d..14fe89ff99c7 100644 --- a/include/linux/virtio_config.h +++ b/include/linux/virtio_config.h @@ -57,6 +57,10 @@ 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) + * Make sure the writes commited before this method is visible to + * vring_interrupt() which is called after this method. + * 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 +93,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 +222,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. See comment + * above synchronize_rcu(). + */ + synchronize_rcu(); + } +} + /** * virtio_device_ready - enable vq use in probe function * @vdev: the device -- 2.25.1
Cornelia Huck
2022-Apr-28 09:13 UTC
[PATCH V3 3/9] virtio: introduce config op to synchronize vring callbacks
On Mon, Apr 25 2022, Jason Wang <jasowang at redhat.com> 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 isWhich kind of writes? I.e., what is the scope?> called after the return of this function. For the transport that > doesn't provide synchronize_vqs(), use synchornize_rcu() whichTypo: synchronize_rcu()> synchronize with IRQ implicitly as a fallback. > > Cc: Thomas Gleixner <tglx at linutronix.de> > Cc: Peter Zijlstra <peterz at infradead.org> > Cc: "Paul E. McKenney" <paulmck at kernel.org> > Cc: Marc Zyngier <maz at kernel.org> > Cc: Halil Pasic <pasic at linux.ibm.com> > Cc: Cornelia Huck <cohuck at redhat.com> > Signed-off-by: Jason Wang <jasowang at redhat.com> > --- > include/linux/virtio_config.h | 24 ++++++++++++++++++++++++ > 1 file changed, 24 insertions(+) > > diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h > index b341dd62aa4d..14fe89ff99c7 100644 > --- a/include/linux/virtio_config.h > +++ b/include/linux/virtio_config.h > @@ -57,6 +57,10 @@ 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) > + * Make sure the writes commited before this method is visible to > + * vring_interrupt() which is called after this method.Same here, I think the description needs to be a bit more explicit about which writes we care about here.> + * 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 +93,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);