Skip to content

Commit ffbda8e

Browse files
lulu-github-namemstsirkin
authored andcommitted
vdpa/vp_vdpa : add vdpa tool support in vp_vdpa
this patch is to add the support for vdpa tool in vp_vdpa here is the example steps modprobe vp_vdpa modprobe vhost_vdpa echo 0000:00:06.0>/sys/bus/pci/drivers/virtio-pci/unbind echo 1af4 1041 > /sys/bus/pci/drivers/vp-vdpa/new_id vdpa dev add name vdpa1 mgmtdev pci/0000:00:06.0 Signed-off-by: Cindy Lu <[email protected]> Message-Id: <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]> Acked-by: Jason Wang <[email protected]>
1 parent 0619eda commit ffbda8e

File tree

2 files changed

+130
-33
lines changed

2 files changed

+130
-33
lines changed

drivers/vdpa/virtio_pci/vp_vdpa.c

Lines changed: 129 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ struct vp_vring {
3232

3333
struct vp_vdpa {
3434
struct vdpa_device vdpa;
35-
struct virtio_pci_modern_device mdev;
35+
struct virtio_pci_modern_device *mdev;
3636
struct vp_vring *vring;
3737
struct vdpa_callback config_cb;
3838
char msix_name[VP_VDPA_NAME_SIZE];
@@ -41,6 +41,12 @@ struct vp_vdpa {
4141
int vectors;
4242
};
4343

44+
struct vp_vdpa_mgmtdev {
45+
struct vdpa_mgmt_dev mgtdev;
46+
struct virtio_pci_modern_device *mdev;
47+
struct vp_vdpa *vp_vdpa;
48+
};
49+
4450
static struct vp_vdpa *vdpa_to_vp(struct vdpa_device *vdpa)
4551
{
4652
return container_of(vdpa, struct vp_vdpa, vdpa);
@@ -50,7 +56,12 @@ static struct virtio_pci_modern_device *vdpa_to_mdev(struct vdpa_device *vdpa)
5056
{
5157
struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
5258

53-
return &vp_vdpa->mdev;
59+
return vp_vdpa->mdev;
60+
}
61+
62+
static struct virtio_pci_modern_device *vp_vdpa_to_mdev(struct vp_vdpa *vp_vdpa)
63+
{
64+
return vp_vdpa->mdev;
5465
}
5566

5667
static u64 vp_vdpa_get_device_features(struct vdpa_device *vdpa)
@@ -96,7 +107,7 @@ static int vp_vdpa_get_vq_irq(struct vdpa_device *vdpa, u16 idx)
96107

97108
static void vp_vdpa_free_irq(struct vp_vdpa *vp_vdpa)
98109
{
99-
struct virtio_pci_modern_device *mdev = &vp_vdpa->mdev;
110+
struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
100111
struct pci_dev *pdev = mdev->pci_dev;
101112
int i;
102113

@@ -143,7 +154,7 @@ static irqreturn_t vp_vdpa_config_handler(int irq, void *arg)
143154

144155
static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
145156
{
146-
struct virtio_pci_modern_device *mdev = &vp_vdpa->mdev;
157+
struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
147158
struct pci_dev *pdev = mdev->pci_dev;
148159
int i, ret, irq;
149160
int queues = vp_vdpa->queues;
@@ -198,7 +209,7 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
198209
static void vp_vdpa_set_status(struct vdpa_device *vdpa, u8 status)
199210
{
200211
struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
201-
struct virtio_pci_modern_device *mdev = &vp_vdpa->mdev;
212+
struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
202213
u8 s = vp_vdpa_get_status(vdpa);
203214

204215
if (status & VIRTIO_CONFIG_S_DRIVER_OK &&
@@ -212,7 +223,7 @@ static void vp_vdpa_set_status(struct vdpa_device *vdpa, u8 status)
212223
static int vp_vdpa_reset(struct vdpa_device *vdpa)
213224
{
214225
struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
215-
struct virtio_pci_modern_device *mdev = &vp_vdpa->mdev;
226+
struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
216227
u8 s = vp_vdpa_get_status(vdpa);
217228

218229
vp_modern_set_status(mdev, 0);
@@ -372,7 +383,7 @@ static void vp_vdpa_get_config(struct vdpa_device *vdpa,
372383
void *buf, unsigned int len)
373384
{
374385
struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
375-
struct virtio_pci_modern_device *mdev = &vp_vdpa->mdev;
386+
struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
376387
u8 old, new;
377388
u8 *p;
378389
int i;
@@ -392,7 +403,7 @@ static void vp_vdpa_set_config(struct vdpa_device *vdpa,
392403
unsigned int len)
393404
{
394405
struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
395-
struct virtio_pci_modern_device *mdev = &vp_vdpa->mdev;
406+
struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
396407
const u8 *p = buf;
397408
int i;
398409

@@ -412,7 +423,7 @@ static struct vdpa_notification_area
412423
vp_vdpa_get_vq_notification(struct vdpa_device *vdpa, u16 qid)
413424
{
414425
struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
415-
struct virtio_pci_modern_device *mdev = &vp_vdpa->mdev;
426+
struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
416427
struct vdpa_notification_area notify;
417428

418429
notify.addr = vp_vdpa->vring[qid].notify_pa;
@@ -454,38 +465,31 @@ static void vp_vdpa_free_irq_vectors(void *data)
454465
pci_free_irq_vectors(data);
455466
}
456467

457-
static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
468+
static int vp_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name,
469+
const struct vdpa_dev_set_config *add_config)
458470
{
459-
struct virtio_pci_modern_device *mdev;
471+
struct vp_vdpa_mgmtdev *vp_vdpa_mgtdev =
472+
container_of(v_mdev, struct vp_vdpa_mgmtdev, mgtdev);
473+
474+
struct virtio_pci_modern_device *mdev = vp_vdpa_mgtdev->mdev;
475+
struct pci_dev *pdev = mdev->pci_dev;
460476
struct device *dev = &pdev->dev;
461-
struct vp_vdpa *vp_vdpa;
477+
struct vp_vdpa *vp_vdpa = NULL;
462478
int ret, i;
463479

464-
ret = pcim_enable_device(pdev);
465-
if (ret)
466-
return ret;
467-
468480
vp_vdpa = vdpa_alloc_device(struct vp_vdpa, vdpa,
469-
dev, &vp_vdpa_ops, 1, 1, NULL, false);
481+
dev, &vp_vdpa_ops, 1, 1, name, false);
482+
470483
if (IS_ERR(vp_vdpa)) {
471484
dev_err(dev, "vp_vdpa: Failed to allocate vDPA structure\n");
472485
return PTR_ERR(vp_vdpa);
473486
}
474487

475-
mdev = &vp_vdpa->mdev;
476-
mdev->pci_dev = pdev;
477-
478-
ret = vp_modern_probe(mdev);
479-
if (ret) {
480-
dev_err(&pdev->dev, "Failed to probe modern PCI device\n");
481-
goto err;
482-
}
483-
484-
pci_set_master(pdev);
485-
pci_set_drvdata(pdev, vp_vdpa);
488+
vp_vdpa_mgtdev->vp_vdpa = vp_vdpa;
486489

487490
vp_vdpa->vdpa.dma_dev = &pdev->dev;
488491
vp_vdpa->queues = vp_modern_get_num_queues(mdev);
492+
vp_vdpa->mdev = mdev;
489493

490494
ret = devm_add_action_or_reset(dev, vp_vdpa_free_irq_vectors, pdev);
491495
if (ret) {
@@ -516,7 +520,8 @@ static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
516520
}
517521
vp_vdpa->config_irq = VIRTIO_MSI_NO_VECTOR;
518522

519-
ret = vdpa_register_device(&vp_vdpa->vdpa, vp_vdpa->queues);
523+
vp_vdpa->vdpa.mdev = &vp_vdpa_mgtdev->mgtdev;
524+
ret = _vdpa_register_device(&vp_vdpa->vdpa, vp_vdpa->queues);
520525
if (ret) {
521526
dev_err(&pdev->dev, "Failed to register to vdpa bus\n");
522527
goto err;
@@ -529,12 +534,104 @@ static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
529534
return ret;
530535
}
531536

537+
static void vp_vdpa_dev_del(struct vdpa_mgmt_dev *v_mdev,
538+
struct vdpa_device *dev)
539+
{
540+
struct vp_vdpa_mgmtdev *vp_vdpa_mgtdev =
541+
container_of(v_mdev, struct vp_vdpa_mgmtdev, mgtdev);
542+
543+
struct vp_vdpa *vp_vdpa = vp_vdpa_mgtdev->vp_vdpa;
544+
545+
_vdpa_unregister_device(&vp_vdpa->vdpa);
546+
vp_vdpa_mgtdev->vp_vdpa = NULL;
547+
}
548+
549+
static const struct vdpa_mgmtdev_ops vp_vdpa_mdev_ops = {
550+
.dev_add = vp_vdpa_dev_add,
551+
.dev_del = vp_vdpa_dev_del,
552+
};
553+
554+
static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
555+
{
556+
struct vp_vdpa_mgmtdev *vp_vdpa_mgtdev = NULL;
557+
struct vdpa_mgmt_dev *mgtdev;
558+
struct device *dev = &pdev->dev;
559+
struct virtio_pci_modern_device *mdev = NULL;
560+
struct virtio_device_id *mdev_id = NULL;
561+
int err;
562+
563+
vp_vdpa_mgtdev = kzalloc(sizeof(*vp_vdpa_mgtdev), GFP_KERNEL);
564+
if (!vp_vdpa_mgtdev)
565+
return -ENOMEM;
566+
567+
mgtdev = &vp_vdpa_mgtdev->mgtdev;
568+
mgtdev->ops = &vp_vdpa_mdev_ops;
569+
mgtdev->device = dev;
570+
571+
mdev = kzalloc(sizeof(struct virtio_pci_modern_device), GFP_KERNEL);
572+
if (!mdev) {
573+
err = -ENOMEM;
574+
goto mdev_err;
575+
}
576+
577+
mdev_id = kzalloc(sizeof(struct virtio_device_id), GFP_KERNEL);
578+
if (!mdev_id) {
579+
err = -ENOMEM;
580+
goto mdev_id_err;
581+
}
582+
583+
vp_vdpa_mgtdev->mdev = mdev;
584+
mdev->pci_dev = pdev;
585+
586+
err = pcim_enable_device(pdev);
587+
if (err) {
588+
goto probe_err;
589+
}
590+
591+
err = vp_modern_probe(mdev);
592+
if (err) {
593+
dev_err(&pdev->dev, "Failed to probe modern PCI device\n");
594+
goto probe_err;
595+
}
596+
597+
mdev_id->device = mdev->id.device;
598+
mdev_id->vendor = mdev->id.vendor;
599+
mgtdev->id_table = mdev_id;
600+
mgtdev->max_supported_vqs = vp_modern_get_num_queues(mdev);
601+
mgtdev->supported_features = vp_modern_get_features(mdev);
602+
pci_set_master(pdev);
603+
pci_set_drvdata(pdev, vp_vdpa_mgtdev);
604+
605+
err = vdpa_mgmtdev_register(mgtdev);
606+
if (err) {
607+
dev_err(&pdev->dev, "Failed to register vdpa mgmtdev device\n");
608+
goto register_err;
609+
}
610+
611+
return 0;
612+
613+
register_err:
614+
vp_modern_remove(vp_vdpa_mgtdev->mdev);
615+
probe_err:
616+
kfree(mdev_id);
617+
mdev_id_err:
618+
kfree(mdev);
619+
mdev_err:
620+
kfree(vp_vdpa_mgtdev);
621+
return err;
622+
}
623+
532624
static void vp_vdpa_remove(struct pci_dev *pdev)
533625
{
534-
struct vp_vdpa *vp_vdpa = pci_get_drvdata(pdev);
626+
struct vp_vdpa_mgmtdev *vp_vdpa_mgtdev = pci_get_drvdata(pdev);
627+
struct virtio_pci_modern_device *mdev = NULL;
535628

536-
vp_modern_remove(&vp_vdpa->mdev);
537-
vdpa_unregister_device(&vp_vdpa->vdpa);
629+
mdev = vp_vdpa_mgtdev->mdev;
630+
vp_modern_remove(mdev);
631+
vdpa_mgmtdev_unregister(&vp_vdpa_mgtdev->mgtdev);
632+
kfree(&vp_vdpa_mgtdev->mgtdev.id_table);
633+
kfree(mdev);
634+
kfree(vp_vdpa_mgtdev);
538635
}
539636

540637
static struct pci_driver vp_vdpa_driver = {

include/linux/vdpa.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,7 @@ struct vdpa_mgmtdev_ops {
492492
struct vdpa_mgmt_dev {
493493
struct device *device;
494494
const struct vdpa_mgmtdev_ops *ops;
495-
const struct virtio_device_id *id_table;
495+
struct virtio_device_id *id_table;
496496
u64 config_attr_mask;
497497
struct list_head list;
498498
u64 supported_features;

0 commit comments

Comments
 (0)