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@linutronix.de> Cc: Peter Zijlstra <peterz@infradead.org> Cc: "Paul E. McKenney" <paulmck@kernel.org> Cc: Marc Zyngier <maz@kernel.org> Cc: Halil Pasic <pasic@linux.ibm.com> Cc: Cornelia Huck <cohuck@redhat.com> Cc: Vineeth Vijayan <vneethv@linux.ibm.com> Cc: Peter Oberparleiter <oberpar@linux.ibm.com> Cc: linux-s390@vger.kernel.org Reviewed-by: Cornelia Huck <cohuck@redhat.com> Signed-off-by: Jason Wang <jasowang@redhat.com> Message-Id: <20220527060120.20964-4-jasowang@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
This commit is contained in:
Родитель
0aa96837c3
Коммит
48b69959a8
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче