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:
@@ -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 @@ err_setup_vq_res:
|
||||
_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 @@ out_info:
|
||||
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));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user