virtio: bugfixes
Some small, obvious (in hindsight) bugfixes: - new ioctl in vhost-vdpa has a wrong # - not too late to fix - vhost has apparently been lacking an smp_rmb() - due to code duplication :( The duplication will be fixed in the next merge cycle, this is a minimal fix. - an error message in vhost talks about guest moving used index - which of course never happens, guest only ever moves the available index. - i2c-virtio didn't set the driver owner so it did not get refcounted correctly. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> -----BEGIN PGP SIGNATURE----- iQFDBAABCAAtFiEEXQn9CHHI+FuUyooNKB8NuNKNVGkFAmYTqN4PHG1zdEByZWRo YXQuY29tAAoJECgfDbjSjVRpMaAH/iEP8RA0casqGCVvHsAn0LXQlFMtL8GemYbY EX26EL8vfQZGYQ3GoZQpWUR63Oiaaptu0r+phAtMktRj/QeSWQtCM0XX+cV8xiwV 3dFOosMYYqDihXraDnrpOqYnl0jc4cF3lrAf+WEFxNokdRSLP6hnXqmokmQI/YVG mhgnnRnhWQInkfPAzkYqEjQKhssFnKhiRGyV6saXmFHf+lUE68mBQ9NO42ogW74m FWMaEd7r6rfimjDYjotOgISP1xH0G17FudKoYly5Ymf1PSZbrinO+nU0rtklXxEG qIrMXQHzHPhRBP5eCU7qhOO4cPq4UphB0tY7ow4Wqr1e0eymauw= =dpxf -----END PGP SIGNATURE----- Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost Pull virtio bugfixes from Michael Tsirkin: "Some small, obvious (in hindsight) bugfixes: - new ioctl in vhost-vdpa has a wrong # - not too late to fix - vhost has apparently been lacking an smp_rmb() - due to code duplication :( The duplication will be fixed in the next merge cycle, this is a minimal fix - an error message in vhost talks about guest moving used index - which of course never happens, guest only ever moves the available index - i2c-virtio didn't set the driver owner so it did not get refcounted correctly" * tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost: vhost: correct misleading printing information vhost-vdpa: change ioctl # for VDPA_GET_VRING_SIZE virtio: store owner from modules with register_virtio_driver() vhost: Add smp_rmb() in vhost_enable_notify() vhost: Add smp_rmb() in vhost_vq_avail_empty()
This commit is contained in:
commit
399f4dae68
@ -97,7 +97,6 @@ like this::
|
||||
|
||||
static struct virtio_driver virtio_dummy_driver = {
|
||||
.driver.name = KBUILD_MODNAME,
|
||||
.driver.owner = THIS_MODULE,
|
||||
.id_table = id_table,
|
||||
.probe = virtio_dummy_probe,
|
||||
.remove = virtio_dummy_remove,
|
||||
|
@ -2515,7 +2515,7 @@ int vhost_get_vq_desc(struct vhost_virtqueue *vq,
|
||||
vq->avail_idx = vhost16_to_cpu(vq, avail_idx);
|
||||
|
||||
if (unlikely((u16)(vq->avail_idx - last_avail_idx) > vq->num)) {
|
||||
vq_err(vq, "Guest moved used index from %u to %u",
|
||||
vq_err(vq, "Guest moved avail index from %u to %u",
|
||||
last_avail_idx, vq->avail_idx);
|
||||
return -EFAULT;
|
||||
}
|
||||
@ -2799,9 +2799,19 @@ bool vhost_vq_avail_empty(struct vhost_dev *dev, struct vhost_virtqueue *vq)
|
||||
r = vhost_get_avail_idx(vq, &avail_idx);
|
||||
if (unlikely(r))
|
||||
return false;
|
||||
vq->avail_idx = vhost16_to_cpu(vq, avail_idx);
|
||||
|
||||
return vq->avail_idx == vq->last_avail_idx;
|
||||
vq->avail_idx = vhost16_to_cpu(vq, avail_idx);
|
||||
if (vq->avail_idx != vq->last_avail_idx) {
|
||||
/* Since we have updated avail_idx, the following
|
||||
* call to vhost_get_vq_desc() will read available
|
||||
* ring entries. Make sure that read happens after
|
||||
* the avail_idx read.
|
||||
*/
|
||||
smp_rmb();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vhost_vq_avail_empty);
|
||||
|
||||
@ -2838,9 +2848,19 @@ bool vhost_enable_notify(struct vhost_dev *dev, struct vhost_virtqueue *vq)
|
||||
&vq->avail->idx, r);
|
||||
return false;
|
||||
}
|
||||
vq->avail_idx = vhost16_to_cpu(vq, avail_idx);
|
||||
|
||||
return vq->avail_idx != vq->last_avail_idx;
|
||||
vq->avail_idx = vhost16_to_cpu(vq, avail_idx);
|
||||
if (vq->avail_idx != vq->last_avail_idx) {
|
||||
/* Since we have updated avail_idx, the following
|
||||
* call to vhost_get_vq_desc() will read available
|
||||
* ring entries. Make sure that read happens after
|
||||
* the avail_idx read.
|
||||
*/
|
||||
smp_rmb();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vhost_enable_notify);
|
||||
|
||||
|
@ -362,14 +362,16 @@ static const struct bus_type virtio_bus = {
|
||||
.remove = virtio_dev_remove,
|
||||
};
|
||||
|
||||
int register_virtio_driver(struct virtio_driver *driver)
|
||||
int __register_virtio_driver(struct virtio_driver *driver, struct module *owner)
|
||||
{
|
||||
/* Catch this early. */
|
||||
BUG_ON(driver->feature_table_size && !driver->feature_table);
|
||||
driver->driver.bus = &virtio_bus;
|
||||
driver->driver.owner = owner;
|
||||
|
||||
return driver_register(&driver->driver);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(register_virtio_driver);
|
||||
EXPORT_SYMBOL_GPL(__register_virtio_driver);
|
||||
|
||||
void unregister_virtio_driver(struct virtio_driver *driver)
|
||||
{
|
||||
|
@ -170,7 +170,7 @@ size_t virtio_max_dma_size(const struct virtio_device *vdev);
|
||||
|
||||
/**
|
||||
* struct virtio_driver - operations for a virtio I/O driver
|
||||
* @driver: underlying device driver (populate name and owner).
|
||||
* @driver: underlying device driver (populate name).
|
||||
* @id_table: the ids serviced by this driver.
|
||||
* @feature_table: an array of feature numbers supported by this driver.
|
||||
* @feature_table_size: number of entries in the feature table array.
|
||||
@ -208,7 +208,10 @@ static inline struct virtio_driver *drv_to_virtio(struct device_driver *drv)
|
||||
return container_of(drv, struct virtio_driver, driver);
|
||||
}
|
||||
|
||||
int register_virtio_driver(struct virtio_driver *drv);
|
||||
/* use a macro to avoid include chaining to get THIS_MODULE */
|
||||
#define register_virtio_driver(drv) \
|
||||
__register_virtio_driver(drv, THIS_MODULE)
|
||||
int __register_virtio_driver(struct virtio_driver *drv, struct module *owner);
|
||||
void unregister_virtio_driver(struct virtio_driver *drv);
|
||||
|
||||
/* module_virtio_driver() - Helper macro for drivers that don't do
|
||||
|
@ -179,12 +179,6 @@
|
||||
/* Get the config size */
|
||||
#define VHOST_VDPA_GET_CONFIG_SIZE _IOR(VHOST_VIRTIO, 0x79, __u32)
|
||||
|
||||
/* Get the count of all virtqueues */
|
||||
#define VHOST_VDPA_GET_VQS_COUNT _IOR(VHOST_VIRTIO, 0x80, __u32)
|
||||
|
||||
/* Get the number of virtqueue groups. */
|
||||
#define VHOST_VDPA_GET_GROUP_NUM _IOR(VHOST_VIRTIO, 0x81, __u32)
|
||||
|
||||
/* Get the number of address spaces. */
|
||||
#define VHOST_VDPA_GET_AS_NUM _IOR(VHOST_VIRTIO, 0x7A, unsigned int)
|
||||
|
||||
@ -228,10 +222,17 @@
|
||||
#define VHOST_VDPA_GET_VRING_DESC_GROUP _IOWR(VHOST_VIRTIO, 0x7F, \
|
||||
struct vhost_vring_state)
|
||||
|
||||
|
||||
/* Get the count of all virtqueues */
|
||||
#define VHOST_VDPA_GET_VQS_COUNT _IOR(VHOST_VIRTIO, 0x80, __u32)
|
||||
|
||||
/* Get the number of virtqueue groups. */
|
||||
#define VHOST_VDPA_GET_GROUP_NUM _IOR(VHOST_VIRTIO, 0x81, __u32)
|
||||
|
||||
/* Get the queue size of a specific virtqueue.
|
||||
* userspace set the vring index in vhost_vring_state.index
|
||||
* kernel set the queue size in vhost_vring_state.num
|
||||
*/
|
||||
#define VHOST_VDPA_GET_VRING_SIZE _IOWR(VHOST_VIRTIO, 0x80, \
|
||||
#define VHOST_VDPA_GET_VRING_SIZE _IOWR(VHOST_VIRTIO, 0x82, \
|
||||
struct vhost_vring_state)
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user