mirror of
https://github.com/torvalds/linux.git
synced 2026-06-05 21:15:53 +02:00
virtio: bugfixes
Several small bugfixes all over the place. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> -----BEGIN PGP SIGNATURE----- iQFDBAABCAAtFiEEXQn9CHHI+FuUyooNKB8NuNKNVGkFAmcxrosPHG1zdEByZWRo YXQuY29tAAoJECgfDbjSjVRpBekH+wcamT5OZybW1+GuCUD0K405UHLtQhJHYe/K pCTHPgcvKLj0qCuUt99mqN+jqa8esAjyML+eozi87d5u3lrN/8KKOXSnji2JJ7Ut uW5t4dqN66MSdkv3iwzDOo8Iww+CwxeQQ0BNljpHnxubkX/WtgLvuS0P2tngcUZW ChcXTrVitCza6WqrnwLliNYc76pXC6oJ4nSbunidlDKNLr0s6vnE1GqW+pHUWi8Z 5DSIlgkqZvtydABuIxnbsRU8rJ+qEfl04lkcKYiAcy3eogD+c6y0k8RlQ16iE7Vt 0rD+1hJnceyP6uq5PAJ7WfhQfsU7IFIarW6JubAtWSh9ZyEr5DY= =K4S6 -----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: "Several small bugfixes all over the place" * tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost: vdpa/mlx5: Fix error path during device add vp_vdpa: fix id_table array not null terminated error virtio_pci: Fix admin vq cleanup by using correct info pointer vDPA/ifcvf: Fix pci_read_config_byte() return code handling Fix typo in vringh_test.c vdpa: solidrun: Fix UB bug with devres vsock/virtio: Initialization of the dangling pointer occurring in vsk->trans
This commit is contained in:
commit
0ccd733ac9
|
|
@ -108,7 +108,7 @@ int ifcvf_init_hw(struct ifcvf_hw *hw, struct pci_dev *pdev)
|
|||
u32 i;
|
||||
|
||||
ret = pci_read_config_byte(pdev, PCI_CAPABILITY_LIST, &pos);
|
||||
if (ret < 0) {
|
||||
if (ret) {
|
||||
IFCVF_ERR(pdev, "Failed to read PCI capability list\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3963,28 +3963,28 @@ static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name,
|
|||
mvdev->vdev.dma_dev = &mdev->pdev->dev;
|
||||
err = mlx5_vdpa_alloc_resources(&ndev->mvdev);
|
||||
if (err)
|
||||
goto err_mpfs;
|
||||
goto err_alloc;
|
||||
|
||||
err = mlx5_vdpa_init_mr_resources(mvdev);
|
||||
if (err)
|
||||
goto err_res;
|
||||
goto err_alloc;
|
||||
|
||||
if (MLX5_CAP_GEN(mvdev->mdev, umem_uid_0)) {
|
||||
err = mlx5_vdpa_create_dma_mr(mvdev);
|
||||
if (err)
|
||||
goto err_mr_res;
|
||||
goto err_alloc;
|
||||
}
|
||||
|
||||
err = alloc_fixed_resources(ndev);
|
||||
if (err)
|
||||
goto err_mr;
|
||||
goto err_alloc;
|
||||
|
||||
ndev->cvq_ent.mvdev = mvdev;
|
||||
INIT_WORK(&ndev->cvq_ent.work, mlx5_cvq_kick_handler);
|
||||
mvdev->wq = create_singlethread_workqueue("mlx5_vdpa_wq");
|
||||
if (!mvdev->wq) {
|
||||
err = -ENOMEM;
|
||||
goto err_res2;
|
||||
goto err_alloc;
|
||||
}
|
||||
|
||||
mvdev->vdev.mdev = &mgtdev->mgtdev;
|
||||
|
|
@ -4010,17 +4010,6 @@ static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name,
|
|||
_vdpa_unregister_device(&mvdev->vdev);
|
||||
err_reg:
|
||||
destroy_workqueue(mvdev->wq);
|
||||
err_res2:
|
||||
free_fixed_resources(ndev);
|
||||
err_mr:
|
||||
mlx5_vdpa_clean_mrs(mvdev);
|
||||
err_mr_res:
|
||||
mlx5_vdpa_destroy_mr_resources(mvdev);
|
||||
err_res:
|
||||
mlx5_vdpa_free_resources(&ndev->mvdev);
|
||||
err_mpfs:
|
||||
if (!is_zero_ether_addr(config->mac))
|
||||
mlx5_mpfs_del_mac(pfmdev, config->mac);
|
||||
err_alloc:
|
||||
put_device(&mvdev->vdev.dev);
|
||||
return err;
|
||||
|
|
|
|||
|
|
@ -555,7 +555,7 @@ static const struct vdpa_config_ops snet_config_ops = {
|
|||
|
||||
static int psnet_open_pf_bar(struct pci_dev *pdev, struct psnet *psnet)
|
||||
{
|
||||
char name[50];
|
||||
char *name;
|
||||
int ret, i, mask = 0;
|
||||
/* We don't know which BAR will be used to communicate..
|
||||
* We will map every bar with len > 0.
|
||||
|
|
@ -573,7 +573,10 @@ static int psnet_open_pf_bar(struct pci_dev *pdev, struct psnet *psnet)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
snprintf(name, sizeof(name), "psnet[%s]-bars", pci_name(pdev));
|
||||
name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "psnet[%s]-bars", pci_name(pdev));
|
||||
if (!name)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = pcim_iomap_regions(pdev, mask, name);
|
||||
if (ret) {
|
||||
SNET_ERR(pdev, "Failed to request and map PCI BARs\n");
|
||||
|
|
@ -590,10 +593,13 @@ static int psnet_open_pf_bar(struct pci_dev *pdev, struct psnet *psnet)
|
|||
|
||||
static int snet_open_vf_bar(struct pci_dev *pdev, struct snet *snet)
|
||||
{
|
||||
char name[50];
|
||||
char *name;
|
||||
int ret;
|
||||
|
||||
snprintf(name, sizeof(name), "snet[%s]-bar", pci_name(pdev));
|
||||
name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "snet[%s]-bars", pci_name(pdev));
|
||||
if (!name)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Request and map BAR */
|
||||
ret = pcim_iomap_regions(pdev, BIT(snet->psnet->cfg.vf_bar), name);
|
||||
if (ret) {
|
||||
|
|
|
|||
|
|
@ -612,7 +612,11 @@ static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
goto mdev_err;
|
||||
}
|
||||
|
||||
mdev_id = kzalloc(sizeof(struct virtio_device_id), GFP_KERNEL);
|
||||
/*
|
||||
* id_table should be a null terminated array, so allocate one additional
|
||||
* entry here, see vdpa_mgmtdev_get_classes().
|
||||
*/
|
||||
mdev_id = kcalloc(2, sizeof(struct virtio_device_id), GFP_KERNEL);
|
||||
if (!mdev_id) {
|
||||
err = -ENOMEM;
|
||||
goto mdev_id_err;
|
||||
|
|
@ -632,8 +636,8 @@ static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
goto probe_err;
|
||||
}
|
||||
|
||||
mdev_id->device = mdev->id.device;
|
||||
mdev_id->vendor = mdev->id.vendor;
|
||||
mdev_id[0].device = mdev->id.device;
|
||||
mdev_id[0].vendor = mdev->id.vendor;
|
||||
mgtdev->id_table = mdev_id;
|
||||
mgtdev->max_supported_vqs = vp_modern_get_num_queues(mdev);
|
||||
mgtdev->supported_features = vp_modern_get_features(mdev);
|
||||
|
|
|
|||
|
|
@ -24,6 +24,16 @@ MODULE_PARM_DESC(force_legacy,
|
|||
"Force legacy mode for transitional virtio 1 devices");
|
||||
#endif
|
||||
|
||||
bool vp_is_avq(struct virtio_device *vdev, unsigned int index)
|
||||
{
|
||||
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
|
||||
|
||||
if (!virtio_has_feature(vdev, VIRTIO_F_ADMIN_VQ))
|
||||
return false;
|
||||
|
||||
return index == vp_dev->admin_vq.vq_index;
|
||||
}
|
||||
|
||||
/* wait for pending irq handlers */
|
||||
void vp_synchronize_vectors(struct virtio_device *vdev)
|
||||
{
|
||||
|
|
@ -234,10 +244,9 @@ static struct virtqueue *vp_setup_vq(struct virtio_device *vdev, unsigned int in
|
|||
return vq;
|
||||
}
|
||||
|
||||
static void vp_del_vq(struct virtqueue *vq)
|
||||
static void vp_del_vq(struct virtqueue *vq, struct virtio_pci_vq_info *info)
|
||||
{
|
||||
struct virtio_pci_device *vp_dev = to_vp_device(vq->vdev);
|
||||
struct virtio_pci_vq_info *info = vp_dev->vqs[vq->index];
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
|
|
@ -258,13 +267,16 @@ static void vp_del_vq(struct virtqueue *vq)
|
|||
void vp_del_vqs(struct virtio_device *vdev)
|
||||
{
|
||||
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
|
||||
struct virtio_pci_vq_info *info;
|
||||
struct virtqueue *vq, *n;
|
||||
int i;
|
||||
|
||||
list_for_each_entry_safe(vq, n, &vdev->vqs, list) {
|
||||
if (vp_dev->per_vq_vectors) {
|
||||
int v = vp_dev->vqs[vq->index]->msix_vector;
|
||||
info = vp_is_avq(vdev, vq->index) ? vp_dev->admin_vq.info :
|
||||
vp_dev->vqs[vq->index];
|
||||
|
||||
if (vp_dev->per_vq_vectors) {
|
||||
int v = info->msix_vector;
|
||||
if (v != VIRTIO_MSI_NO_VECTOR &&
|
||||
!vp_is_slow_path_vector(v)) {
|
||||
int irq = pci_irq_vector(vp_dev->pci_dev, v);
|
||||
|
|
@ -273,7 +285,7 @@ void vp_del_vqs(struct virtio_device *vdev)
|
|||
free_irq(irq, vq);
|
||||
}
|
||||
}
|
||||
vp_del_vq(vq);
|
||||
vp_del_vq(vq, info);
|
||||
}
|
||||
vp_dev->per_vq_vectors = false;
|
||||
|
||||
|
|
@ -354,7 +366,7 @@ vp_find_one_vq_msix(struct virtio_device *vdev, int queue_idx,
|
|||
vring_interrupt, 0,
|
||||
vp_dev->msix_names[msix_vec], vq);
|
||||
if (err) {
|
||||
vp_del_vq(vq);
|
||||
vp_del_vq(vq, *p_info);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -178,6 +178,7 @@ struct virtio_device *virtio_pci_vf_get_pf_dev(struct pci_dev *pdev);
|
|||
#define VIRTIO_ADMIN_CMD_BITMAP 0
|
||||
#endif
|
||||
|
||||
bool vp_is_avq(struct virtio_device *vdev, unsigned int index);
|
||||
void vp_modern_avq_done(struct virtqueue *vq);
|
||||
int vp_modern_admin_cmd_exec(struct virtio_device *vdev,
|
||||
struct virtio_admin_cmd *cmd);
|
||||
|
|
|
|||
|
|
@ -43,16 +43,6 @@ static int vp_avq_index(struct virtio_device *vdev, u16 *index, u16 *num)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static bool vp_is_avq(struct virtio_device *vdev, unsigned int index)
|
||||
{
|
||||
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
|
||||
|
||||
if (!virtio_has_feature(vdev, VIRTIO_F_ADMIN_VQ))
|
||||
return false;
|
||||
|
||||
return index == vp_dev->admin_vq.vq_index;
|
||||
}
|
||||
|
||||
void vp_modern_avq_done(struct virtqueue *vq)
|
||||
{
|
||||
struct virtio_pci_device *vp_dev = to_vp_device(vq->vdev);
|
||||
|
|
@ -245,7 +235,7 @@ static void vp_modern_avq_cleanup(struct virtio_device *vdev)
|
|||
if (!virtio_has_feature(vdev, VIRTIO_F_ADMIN_VQ))
|
||||
return;
|
||||
|
||||
vq = vp_dev->vqs[vp_dev->admin_vq.vq_index]->vq;
|
||||
vq = vp_dev->admin_vq.info->vq;
|
||||
if (!vq)
|
||||
return;
|
||||
|
||||
|
|
|
|||
|
|
@ -1109,6 +1109,7 @@ void virtio_transport_destruct(struct vsock_sock *vsk)
|
|||
struct virtio_vsock_sock *vvs = vsk->trans;
|
||||
|
||||
kfree(vvs);
|
||||
vsk->trans = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(virtio_transport_destruct);
|
||||
|
||||
|
|
|
|||
|
|
@ -519,7 +519,7 @@ int main(int argc, char *argv[])
|
|||
errx(1, "virtqueue_add_sgs: %i", err);
|
||||
__kmalloc_fake = NULL;
|
||||
|
||||
/* Host retreives it. */
|
||||
/* Host retrieves it. */
|
||||
vringh_iov_init(&riov, host_riov, ARRAY_SIZE(host_riov));
|
||||
vringh_iov_init(&wiov, host_wiov, ARRAY_SIZE(host_wiov));
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user