virtio,vdpa: fixes
Fixes up some issues in rc5. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> -----BEGIN PGP SIGNATURE----- iQFDBAABCAAtFiEEXQn9CHHI+FuUyooNKB8NuNKNVGkFAmFm1OcPHG1zdEByZWRo YXQuY29tAAoJECgfDbjSjVRpp0AIAL5lvwd/Dzj0trDEOm93yTiKigkllJ9if8pF G3V6IgyyeNujmEJLD2Fz5GPUVXg5G2+Yh2xgf8OP4syS/pZoCGkGcLIoo7lJRSvz D3KpNYrZ2O1kFw2XWP3p7O/H8pxWAMPjykRaVoniCd+rIIpRzWdYBDDWConUGqC1 IlB5BS6cv3vRIoJ4Ac3YVOEUM4WOw/2fwzxejVjxQdNjgbWL0JBY1IBiJrfp7iEo L3KRmN25JWCwE0x+Ehy6/uSalVzPgjESBYzrBFihnFXDS/LIIIXuRb9Q3HzEFFHT UhccuExc8Nq8JDKWrZkYP2s950Gnv249bC9tqlHHTnoE+pxG3Ms= =i68W -----END PGP SIGNATURE----- Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost Pull virtio fixes from Michael Tsirkin: "Fixes up some issues in rc5" * tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost: vhost-vdpa: Fix the wrong input in config_cb VDUSE: fix documentation underline warning Revert "virtio-blk: Add validation for block size in config space" vhost_vdpa: unset vq irq before freeing irq virtio: write back F_VERSION_1 before validate
This commit is contained in:
commit
3bb50f8530
@ -18,7 +18,7 @@ types can be added after the security issue of corresponding device driver
|
|||||||
is clarified or fixed in the future.
|
is clarified or fixed in the future.
|
||||||
|
|
||||||
Create/Destroy VDUSE devices
|
Create/Destroy VDUSE devices
|
||||||
------------------------
|
----------------------------
|
||||||
|
|
||||||
VDUSE devices are created as follows:
|
VDUSE devices are created as follows:
|
||||||
|
|
||||||
|
@ -689,28 +689,6 @@ static const struct blk_mq_ops virtio_mq_ops = {
|
|||||||
static unsigned int virtblk_queue_depth;
|
static unsigned int virtblk_queue_depth;
|
||||||
module_param_named(queue_depth, virtblk_queue_depth, uint, 0444);
|
module_param_named(queue_depth, virtblk_queue_depth, uint, 0444);
|
||||||
|
|
||||||
static int virtblk_validate(struct virtio_device *vdev)
|
|
||||||
{
|
|
||||||
u32 blk_size;
|
|
||||||
|
|
||||||
if (!vdev->config->get) {
|
|
||||||
dev_err(&vdev->dev, "%s failure: config access disabled\n",
|
|
||||||
__func__);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!virtio_has_feature(vdev, VIRTIO_BLK_F_BLK_SIZE))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
blk_size = virtio_cread32(vdev,
|
|
||||||
offsetof(struct virtio_blk_config, blk_size));
|
|
||||||
|
|
||||||
if (blk_size < SECTOR_SIZE || blk_size > PAGE_SIZE)
|
|
||||||
__virtio_clear_bit(vdev, VIRTIO_BLK_F_BLK_SIZE);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int virtblk_probe(struct virtio_device *vdev)
|
static int virtblk_probe(struct virtio_device *vdev)
|
||||||
{
|
{
|
||||||
struct virtio_blk *vblk;
|
struct virtio_blk *vblk;
|
||||||
@ -722,6 +700,12 @@ static int virtblk_probe(struct virtio_device *vdev)
|
|||||||
u8 physical_block_exp, alignment_offset;
|
u8 physical_block_exp, alignment_offset;
|
||||||
unsigned int queue_depth;
|
unsigned int queue_depth;
|
||||||
|
|
||||||
|
if (!vdev->config->get) {
|
||||||
|
dev_err(&vdev->dev, "%s failure: config access disabled\n",
|
||||||
|
__func__);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
err = ida_simple_get(&vd_index_ida, 0, minor_to_index(1 << MINORBITS),
|
err = ida_simple_get(&vd_index_ida, 0, minor_to_index(1 << MINORBITS),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
@ -836,14 +820,6 @@ static int virtblk_probe(struct virtio_device *vdev)
|
|||||||
else
|
else
|
||||||
blk_size = queue_logical_block_size(q);
|
blk_size = queue_logical_block_size(q);
|
||||||
|
|
||||||
if (blk_size < SECTOR_SIZE || blk_size > PAGE_SIZE) {
|
|
||||||
dev_err(&vdev->dev,
|
|
||||||
"block size is changed unexpectedly, now is %u\n",
|
|
||||||
blk_size);
|
|
||||||
err = -EINVAL;
|
|
||||||
goto out_cleanup_disk;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Use topology information if available */
|
/* Use topology information if available */
|
||||||
err = virtio_cread_feature(vdev, VIRTIO_BLK_F_TOPOLOGY,
|
err = virtio_cread_feature(vdev, VIRTIO_BLK_F_TOPOLOGY,
|
||||||
struct virtio_blk_config, physical_block_exp,
|
struct virtio_blk_config, physical_block_exp,
|
||||||
@ -1009,7 +985,6 @@ static struct virtio_driver virtio_blk = {
|
|||||||
.driver.name = KBUILD_MODNAME,
|
.driver.name = KBUILD_MODNAME,
|
||||||
.driver.owner = THIS_MODULE,
|
.driver.owner = THIS_MODULE,
|
||||||
.id_table = id_table,
|
.id_table = id_table,
|
||||||
.validate = virtblk_validate,
|
|
||||||
.probe = virtblk_probe,
|
.probe = virtblk_probe,
|
||||||
.remove = virtblk_remove,
|
.remove = virtblk_remove,
|
||||||
.config_changed = virtblk_config_changed,
|
.config_changed = virtblk_config_changed,
|
||||||
|
@ -173,6 +173,10 @@ static long vhost_vdpa_set_status(struct vhost_vdpa *v, u8 __user *statusp)
|
|||||||
if (status != 0 && (ops->get_status(vdpa) & ~status) != 0)
|
if (status != 0 && (ops->get_status(vdpa) & ~status) != 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
if ((status_old & VIRTIO_CONFIG_S_DRIVER_OK) && !(status & VIRTIO_CONFIG_S_DRIVER_OK))
|
||||||
|
for (i = 0; i < nvqs; i++)
|
||||||
|
vhost_vdpa_unsetup_vq_irq(v, i);
|
||||||
|
|
||||||
if (status == 0) {
|
if (status == 0) {
|
||||||
ret = ops->reset(vdpa);
|
ret = ops->reset(vdpa);
|
||||||
if (ret)
|
if (ret)
|
||||||
@ -184,10 +188,6 @@ static long vhost_vdpa_set_status(struct vhost_vdpa *v, u8 __user *statusp)
|
|||||||
for (i = 0; i < nvqs; i++)
|
for (i = 0; i < nvqs; i++)
|
||||||
vhost_vdpa_setup_vq_irq(v, i);
|
vhost_vdpa_setup_vq_irq(v, i);
|
||||||
|
|
||||||
if ((status_old & VIRTIO_CONFIG_S_DRIVER_OK) && !(status & VIRTIO_CONFIG_S_DRIVER_OK))
|
|
||||||
for (i = 0; i < nvqs; i++)
|
|
||||||
vhost_vdpa_unsetup_vq_irq(v, i);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -322,7 +322,7 @@ static long vhost_vdpa_set_config_call(struct vhost_vdpa *v, u32 __user *argp)
|
|||||||
struct eventfd_ctx *ctx;
|
struct eventfd_ctx *ctx;
|
||||||
|
|
||||||
cb.callback = vhost_vdpa_config_cb;
|
cb.callback = vhost_vdpa_config_cb;
|
||||||
cb.private = v->vdpa;
|
cb.private = v;
|
||||||
if (copy_from_user(&fd, argp, sizeof(fd)))
|
if (copy_from_user(&fd, argp, sizeof(fd)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
@ -239,6 +239,17 @@ static int virtio_dev_probe(struct device *_d)
|
|||||||
driver_features_legacy = driver_features;
|
driver_features_legacy = driver_features;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some devices detect legacy solely via F_VERSION_1. Write
|
||||||
|
* F_VERSION_1 to force LE config space accesses before FEATURES_OK for
|
||||||
|
* these when needed.
|
||||||
|
*/
|
||||||
|
if (drv->validate && !virtio_legacy_is_little_endian()
|
||||||
|
&& device_features & BIT_ULL(VIRTIO_F_VERSION_1)) {
|
||||||
|
dev->features = BIT_ULL(VIRTIO_F_VERSION_1);
|
||||||
|
dev->config->finalize_features(dev);
|
||||||
|
}
|
||||||
|
|
||||||
if (device_features & (1ULL << VIRTIO_F_VERSION_1))
|
if (device_features & (1ULL << VIRTIO_F_VERSION_1))
|
||||||
dev->features = driver_features & device_features;
|
dev->features = driver_features & device_features;
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user