Skip to content

Commit 7c14564

Browse files
committed
Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
Pull virtio fixes from Michael Tsirkin: "A collection of small fixes that look like worth having in this release" * tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost: virtio_pci: fix the common cfg map size virtio-crypto: handle config changed by work queue vhost: Allow null msg.size on VHOST_IOTLB_INVALIDATE vdpa/mlx5: Fix firmware error on creation of 1k VQs virtio_balloon: Fix endless deflation and inflation on arm64 vdpa/mlx5: Fix double release of debugfs entry virtio-mmio: fix memory leak of vm_dev vdpa_sim_blk: Fix the potential leak of mgmt_dev tools/virtio: Add dma sync api for virtio test
2 parents 05d3ef8 + 061b39f commit 7c14564

File tree

11 files changed

+121
-30
lines changed

11 files changed

+121
-30
lines changed

drivers/crypto/virtio/virtio_crypto_common.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ struct virtio_crypto {
3535
struct virtqueue *ctrl_vq;
3636
struct data_queue *data_vq;
3737

38+
/* Work struct for config space updates */
39+
struct work_struct config_work;
40+
3841
/* To protect the vq operations for the controlq */
3942
spinlock_t ctrl_lock;
4043

drivers/crypto/virtio/virtio_crypto_core.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,14 @@ static void virtcrypto_del_vqs(struct virtio_crypto *vcrypto)
335335
virtcrypto_free_queues(vcrypto);
336336
}
337337

338+
static void vcrypto_config_changed_work(struct work_struct *work)
339+
{
340+
struct virtio_crypto *vcrypto =
341+
container_of(work, struct virtio_crypto, config_work);
342+
343+
virtcrypto_update_status(vcrypto);
344+
}
345+
338346
static int virtcrypto_probe(struct virtio_device *vdev)
339347
{
340348
int err = -EFAULT;
@@ -454,6 +462,8 @@ static int virtcrypto_probe(struct virtio_device *vdev)
454462
if (err)
455463
goto free_engines;
456464

465+
INIT_WORK(&vcrypto->config_work, vcrypto_config_changed_work);
466+
457467
return 0;
458468

459469
free_engines:
@@ -490,6 +500,7 @@ static void virtcrypto_remove(struct virtio_device *vdev)
490500

491501
dev_info(&vdev->dev, "Start virtcrypto_remove.\n");
492502

503+
flush_work(&vcrypto->config_work);
493504
if (virtcrypto_dev_started(vcrypto))
494505
virtcrypto_dev_stop(vcrypto);
495506
virtio_reset_device(vdev);
@@ -504,14 +515,15 @@ static void virtcrypto_config_changed(struct virtio_device *vdev)
504515
{
505516
struct virtio_crypto *vcrypto = vdev->priv;
506517

507-
virtcrypto_update_status(vcrypto);
518+
schedule_work(&vcrypto->config_work);
508519
}
509520

510521
#ifdef CONFIG_PM_SLEEP
511522
static int virtcrypto_freeze(struct virtio_device *vdev)
512523
{
513524
struct virtio_crypto *vcrypto = vdev->priv;
514525

526+
flush_work(&vcrypto->config_work);
515527
virtio_reset_device(vdev);
516528
virtcrypto_free_unused_reqs(vcrypto);
517529
if (virtcrypto_dev_started(vcrypto))

drivers/vdpa/mlx5/net/debug.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ void mlx5_vdpa_add_debugfs(struct mlx5_vdpa_net *ndev)
146146
ndev->rx_dent = debugfs_create_dir("rx", ndev->debugfs);
147147
}
148148

149-
void mlx5_vdpa_remove_debugfs(struct dentry *dbg)
149+
void mlx5_vdpa_remove_debugfs(struct mlx5_vdpa_net *ndev)
150150
{
151-
debugfs_remove_recursive(dbg);
151+
debugfs_remove_recursive(ndev->debugfs);
152+
ndev->debugfs = NULL;
152153
}

drivers/vdpa/mlx5/net/mlx5_vnet.c

Lines changed: 56 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -625,30 +625,70 @@ static void cq_destroy(struct mlx5_vdpa_net *ndev, u16 idx)
625625
mlx5_db_free(ndev->mvdev.mdev, &vcq->db);
626626
}
627627

628+
static int read_umem_params(struct mlx5_vdpa_net *ndev)
629+
{
630+
u32 in[MLX5_ST_SZ_DW(query_hca_cap_in)] = {};
631+
u16 opmod = (MLX5_CAP_VDPA_EMULATION << 1) | (HCA_CAP_OPMOD_GET_CUR & 0x01);
632+
struct mlx5_core_dev *mdev = ndev->mvdev.mdev;
633+
int out_size;
634+
void *caps;
635+
void *out;
636+
int err;
637+
638+
out_size = MLX5_ST_SZ_BYTES(query_hca_cap_out);
639+
out = kzalloc(out_size, GFP_KERNEL);
640+
if (!out)
641+
return -ENOMEM;
642+
643+
MLX5_SET(query_hca_cap_in, in, opcode, MLX5_CMD_OP_QUERY_HCA_CAP);
644+
MLX5_SET(query_hca_cap_in, in, op_mod, opmod);
645+
err = mlx5_cmd_exec_inout(mdev, query_hca_cap, in, out);
646+
if (err) {
647+
mlx5_vdpa_warn(&ndev->mvdev,
648+
"Failed reading vdpa umem capabilities with err %d\n", err);
649+
goto out;
650+
}
651+
652+
caps = MLX5_ADDR_OF(query_hca_cap_out, out, capability);
653+
654+
ndev->umem_1_buffer_param_a = MLX5_GET(virtio_emulation_cap, caps, umem_1_buffer_param_a);
655+
ndev->umem_1_buffer_param_b = MLX5_GET(virtio_emulation_cap, caps, umem_1_buffer_param_b);
656+
657+
ndev->umem_2_buffer_param_a = MLX5_GET(virtio_emulation_cap, caps, umem_2_buffer_param_a);
658+
ndev->umem_2_buffer_param_b = MLX5_GET(virtio_emulation_cap, caps, umem_2_buffer_param_b);
659+
660+
ndev->umem_3_buffer_param_a = MLX5_GET(virtio_emulation_cap, caps, umem_3_buffer_param_a);
661+
ndev->umem_3_buffer_param_b = MLX5_GET(virtio_emulation_cap, caps, umem_3_buffer_param_b);
662+
663+
out:
664+
kfree(out);
665+
return 0;
666+
}
667+
628668
static void set_umem_size(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, int num,
629669
struct mlx5_vdpa_umem **umemp)
630670
{
631-
struct mlx5_core_dev *mdev = ndev->mvdev.mdev;
632-
int p_a;
633-
int p_b;
671+
u32 p_a;
672+
u32 p_b;
634673

635674
switch (num) {
636675
case 1:
637-
p_a = MLX5_CAP_DEV_VDPA_EMULATION(mdev, umem_1_buffer_param_a);
638-
p_b = MLX5_CAP_DEV_VDPA_EMULATION(mdev, umem_1_buffer_param_b);
676+
p_a = ndev->umem_1_buffer_param_a;
677+
p_b = ndev->umem_1_buffer_param_b;
639678
*umemp = &mvq->umem1;
640679
break;
641680
case 2:
642-
p_a = MLX5_CAP_DEV_VDPA_EMULATION(mdev, umem_2_buffer_param_a);
643-
p_b = MLX5_CAP_DEV_VDPA_EMULATION(mdev, umem_2_buffer_param_b);
681+
p_a = ndev->umem_2_buffer_param_a;
682+
p_b = ndev->umem_2_buffer_param_b;
644683
*umemp = &mvq->umem2;
645684
break;
646685
case 3:
647-
p_a = MLX5_CAP_DEV_VDPA_EMULATION(mdev, umem_3_buffer_param_a);
648-
p_b = MLX5_CAP_DEV_VDPA_EMULATION(mdev, umem_3_buffer_param_b);
686+
p_a = ndev->umem_3_buffer_param_a;
687+
p_b = ndev->umem_3_buffer_param_b;
649688
*umemp = &mvq->umem3;
650689
break;
651690
}
691+
652692
(*umemp)->size = p_a * mvq->num_ent + p_b;
653693
}
654694

@@ -2679,6 +2719,11 @@ static int setup_driver(struct mlx5_vdpa_dev *mvdev)
26792719
goto out;
26802720
}
26812721
mlx5_vdpa_add_debugfs(ndev);
2722+
2723+
err = read_umem_params(ndev);
2724+
if (err)
2725+
goto err_setup;
2726+
26822727
err = setup_virtqueues(mvdev);
26832728
if (err) {
26842729
mlx5_vdpa_warn(mvdev, "setup_virtqueues\n");
@@ -2713,7 +2758,7 @@ static int setup_driver(struct mlx5_vdpa_dev *mvdev)
27132758
err_rqt:
27142759
teardown_virtqueues(ndev);
27152760
err_setup:
2716-
mlx5_vdpa_remove_debugfs(ndev->debugfs);
2761+
mlx5_vdpa_remove_debugfs(ndev);
27172762
out:
27182763
return err;
27192764
}
@@ -2727,8 +2772,7 @@ static void teardown_driver(struct mlx5_vdpa_net *ndev)
27272772
if (!ndev->setup)
27282773
return;
27292774

2730-
mlx5_vdpa_remove_debugfs(ndev->debugfs);
2731-
ndev->debugfs = NULL;
2775+
mlx5_vdpa_remove_debugfs(ndev);
27322776
teardown_steering(ndev);
27332777
destroy_tir(ndev);
27342778
destroy_rqt(ndev);
@@ -3489,8 +3533,6 @@ static void mlx5_vdpa_dev_del(struct vdpa_mgmt_dev *v_mdev, struct vdpa_device *
34893533
struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
34903534
struct workqueue_struct *wq;
34913535

3492-
mlx5_vdpa_remove_debugfs(ndev->debugfs);
3493-
ndev->debugfs = NULL;
34943536
unregister_link_notifier(ndev);
34953537
_vdpa_unregister_device(dev);
34963538
wq = mvdev->wq;

drivers/vdpa/mlx5/net/mlx5_vnet.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,15 @@ struct mlx5_vdpa_net {
6565
struct hlist_head macvlan_hash[MLX5V_MACVLAN_SIZE];
6666
struct mlx5_vdpa_irq_pool irqp;
6767
struct dentry *debugfs;
68+
69+
u32 umem_1_buffer_param_a;
70+
u32 umem_1_buffer_param_b;
71+
72+
u32 umem_2_buffer_param_a;
73+
u32 umem_2_buffer_param_b;
74+
75+
u32 umem_3_buffer_param_a;
76+
u32 umem_3_buffer_param_b;
6877
};
6978

7079
struct mlx5_vdpa_counter {
@@ -88,7 +97,7 @@ struct macvlan_node {
8897
};
8998

9099
void mlx5_vdpa_add_debugfs(struct mlx5_vdpa_net *ndev);
91-
void mlx5_vdpa_remove_debugfs(struct dentry *dbg);
100+
void mlx5_vdpa_remove_debugfs(struct mlx5_vdpa_net *ndev);
92101
void mlx5_vdpa_add_rx_flow_table(struct mlx5_vdpa_net *ndev);
93102
void mlx5_vdpa_remove_rx_flow_table(struct mlx5_vdpa_net *ndev);
94103
void mlx5_vdpa_add_tirn(struct mlx5_vdpa_net *ndev);

drivers/vdpa/vdpa_sim/vdpa_sim_blk.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -499,12 +499,13 @@ static int __init vdpasim_blk_init(void)
499499
GFP_KERNEL);
500500
if (!shared_buffer) {
501501
ret = -ENOMEM;
502-
goto parent_err;
502+
goto mgmt_dev_err;
503503
}
504504
}
505505

506506
return 0;
507-
507+
mgmt_dev_err:
508+
vdpa_mgmtdev_unregister(&mgmt_dev);
508509
parent_err:
509510
device_unregister(&vdpasim_blk_mgmtdev);
510511
return ret;

drivers/vhost/vhost.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1458,9 +1458,7 @@ ssize_t vhost_chr_write_iter(struct vhost_dev *dev,
14581458
goto done;
14591459
}
14601460

1461-
if ((msg.type == VHOST_IOTLB_UPDATE ||
1462-
msg.type == VHOST_IOTLB_INVALIDATE) &&
1463-
msg.size == 0) {
1461+
if (msg.type == VHOST_IOTLB_UPDATE && msg.size == 0) {
14641462
ret = -EINVAL;
14651463
goto done;
14661464
}

drivers/virtio/virtio_balloon.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,11 @@ static inline s64 towards_target(struct virtio_balloon *vb)
395395
virtio_cread_le(vb->vdev, struct virtio_balloon_config, num_pages,
396396
&num_pages);
397397

398-
target = num_pages;
398+
/*
399+
* Aligned up to guest page size to avoid inflating and deflating
400+
* balloon endlessly.
401+
*/
402+
target = ALIGN(num_pages, VIRTIO_BALLOON_PAGES_PER_PAGE);
399403
return target - vb->num_pages;
400404
}
401405

drivers/virtio/virtio_mmio.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -631,22 +631,26 @@ static int virtio_mmio_probe(struct platform_device *pdev)
631631
spin_lock_init(&vm_dev->lock);
632632

633633
vm_dev->base = devm_platform_ioremap_resource(pdev, 0);
634-
if (IS_ERR(vm_dev->base))
635-
return PTR_ERR(vm_dev->base);
634+
if (IS_ERR(vm_dev->base)) {
635+
rc = PTR_ERR(vm_dev->base);
636+
goto free_vm_dev;
637+
}
636638

637639
/* Check magic value */
638640
magic = readl(vm_dev->base + VIRTIO_MMIO_MAGIC_VALUE);
639641
if (magic != ('v' | 'i' << 8 | 'r' << 16 | 't' << 24)) {
640642
dev_warn(&pdev->dev, "Wrong magic value 0x%08lx!\n", magic);
641-
return -ENODEV;
643+
rc = -ENODEV;
644+
goto free_vm_dev;
642645
}
643646

644647
/* Check device version */
645648
vm_dev->version = readl(vm_dev->base + VIRTIO_MMIO_VERSION);
646649
if (vm_dev->version < 1 || vm_dev->version > 2) {
647650
dev_err(&pdev->dev, "Version %ld not supported!\n",
648651
vm_dev->version);
649-
return -ENXIO;
652+
rc = -ENXIO;
653+
goto free_vm_dev;
650654
}
651655

652656
vm_dev->vdev.id.device = readl(vm_dev->base + VIRTIO_MMIO_DEVICE_ID);
@@ -655,7 +659,8 @@ static int virtio_mmio_probe(struct platform_device *pdev)
655659
* virtio-mmio device with an ID 0 is a (dummy) placeholder
656660
* with no function. End probing now with no error reported.
657661
*/
658-
return -ENODEV;
662+
rc = -ENODEV;
663+
goto free_vm_dev;
659664
}
660665
vm_dev->vdev.id.vendor = readl(vm_dev->base + VIRTIO_MMIO_VENDOR_ID);
661666

@@ -685,6 +690,10 @@ static int virtio_mmio_probe(struct platform_device *pdev)
685690
put_device(&vm_dev->vdev.dev);
686691

687692
return rc;
693+
694+
free_vm_dev:
695+
kfree(vm_dev);
696+
return rc;
688697
}
689698

690699
static int virtio_mmio_remove(struct platform_device *pdev)

drivers/virtio/virtio_pci_modern_dev.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ int vp_modern_probe(struct virtio_pci_modern_device *mdev)
291291
err = -EINVAL;
292292
mdev->common = vp_modern_map_capability(mdev, common,
293293
sizeof(struct virtio_pci_common_cfg), 4,
294-
0, sizeof(struct virtio_pci_common_cfg),
294+
0, sizeof(struct virtio_pci_modern_common_cfg),
295295
NULL, NULL);
296296
if (!mdev->common)
297297
goto err_map_common;

0 commit comments

Comments
 (0)