Michael S. Tsirkin
2021-Jan-05 11:48 UTC
[PATCH linux-next v3 6/6] vdpa_sim_net: Add support for user supported devices
On Tue, Jan 05, 2021 at 12:32:03PM +0200, Parav Pandit wrote:> Enable user to create vdpasim net simulate devices. > > Show vdpa management device that supports creating, deleting vdpa devices. > > $ vdpa mgmtdev show > vdpasim_net: > supported_classes > net > > $ vdpa mgmtdev show -jp > { > "show": { > "vdpasim_net": { > "supported_classes": { > "net" > } > } > } > > Create a vdpa device of type networking named as "foo2" from > the management device vdpasim: > > $ vdpa dev add mgmtdev vdpasim_net name foo2 > > Show the newly created vdpa device by its name: > $ vdpa dev show foo2 > foo2: type network mgmtdev vdpasim_net vendor_id 0 max_vqs 2 max_vq_size 256 > > $ vdpa dev show foo2 -jp > { > "dev": { > "foo2": { > "type": "network", > "mgmtdev": "vdpasim_net", > "vendor_id": 0, > "max_vqs": 2, > "max_vq_size": 256 > } > } > }I'd like an example of how do device specific (e.g. net specific) interfaces tie in to this.> Delete the vdpa device after its use: > $ vdpa dev del foo2 > > Signed-off-by: Parav Pandit <parav at nvidia.com> > Reviewed-by: Eli Cohen <elic at nvidia.com> > Acked-by: Jason Wang <jasowang at redhat.com> > --- > Changelog: > v2->v3: > - removed code branches due to default device removal patch > v1->v2: > - rebased > --- > drivers/vdpa/vdpa_sim/vdpa_sim.c | 3 +- > drivers/vdpa/vdpa_sim/vdpa_sim.h | 2 + > drivers/vdpa/vdpa_sim/vdpa_sim_net.c | 96 ++++++++++++++++++++-------- > 3 files changed, 75 insertions(+), 26 deletions(-) > > diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim.c b/drivers/vdpa/vdpa_sim/vdpa_sim.c > index db1636a99ba4..d5942842432d 100644 > --- a/drivers/vdpa/vdpa_sim/vdpa_sim.c > +++ b/drivers/vdpa/vdpa_sim/vdpa_sim.c > @@ -235,7 +235,7 @@ struct vdpasim *vdpasim_create(struct vdpasim_dev_attr *dev_attr) > ops = &vdpasim_config_ops; > > vdpasim = vdpa_alloc_device(struct vdpasim, vdpa, NULL, ops, > - dev_attr->nvqs, NULL); > + dev_attr->nvqs, dev_attr->name); > if (!vdpasim) > goto err_alloc; > > @@ -249,6 +249,7 @@ struct vdpasim *vdpasim_create(struct vdpasim_dev_attr *dev_attr) > if (dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64))) > goto err_iommu; > set_dma_ops(dev, &vdpasim_dma_ops); > + vdpasim->vdpa.mdev = dev_attr->mgmt_dev; > > vdpasim->config = kzalloc(dev_attr->config_size, GFP_KERNEL); > if (!vdpasim->config) > diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim.h b/drivers/vdpa/vdpa_sim/vdpa_sim.h > index b02142293d5b..6d75444f9948 100644 > --- a/drivers/vdpa/vdpa_sim/vdpa_sim.h > +++ b/drivers/vdpa/vdpa_sim/vdpa_sim.h > @@ -33,6 +33,8 @@ struct vdpasim_virtqueue { > }; > > struct vdpasim_dev_attr { > + struct vdpa_mgmt_dev *mgmt_dev; > + const char *name; > u64 supported_features; > size_t config_size; > size_t buffer_size; > diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim_net.c b/drivers/vdpa/vdpa_sim/vdpa_sim_net.c > index f0482427186b..d344c5b7c914 100644 > --- a/drivers/vdpa/vdpa_sim/vdpa_sim_net.c > +++ b/drivers/vdpa/vdpa_sim/vdpa_sim_net.c > @@ -35,8 +35,6 @@ MODULE_PARM_DESC(macaddr, "Ethernet MAC address"); > > static u8 macaddr_buf[ETH_ALEN]; > > -static struct vdpasim *vdpasim_net_dev; > - > static void vdpasim_net_work(struct work_struct *work) > { > struct vdpasim *vdpasim = container_of(work, struct vdpasim, work); > @@ -120,21 +118,23 @@ static void vdpasim_net_get_config(struct vdpasim *vdpasim, void *config) > memcpy(net_config->mac, macaddr_buf, ETH_ALEN); > } > > -static int __init vdpasim_net_init(void) > +static void vdpasim_net_mgmtdev_release(struct device *dev) > +{ > +} > + > +static struct device vdpasim_net_mgmtdev = { > + .init_name = "vdpasim_net", > + .release = vdpasim_net_mgmtdev_release, > +}; > + > +static int vdpasim_net_dev_add(struct vdpa_mgmt_dev *mdev, const char *name) > { > struct vdpasim_dev_attr dev_attr = {}; > + struct vdpasim *simdev; > int ret; > > - if (macaddr) { > - mac_pton(macaddr, macaddr_buf); > - if (!is_valid_ether_addr(macaddr_buf)) { > - ret = -EADDRNOTAVAIL; > - goto out; > - } > - } else { > - eth_random_addr(macaddr_buf); > - } > - > + dev_attr.mgmt_dev = mdev; > + dev_attr.name = name; > dev_attr.id = VIRTIO_ID_NET; > dev_attr.supported_features = VDPASIM_NET_FEATURES; > dev_attr.nvqs = VDPASIM_NET_VQ_NUM; > @@ -143,29 +143,75 @@ static int __init vdpasim_net_init(void) > dev_attr.work_fn = vdpasim_net_work; > dev_attr.buffer_size = PAGE_SIZE; > > - vdpasim_net_dev = vdpasim_create(&dev_attr); > - if (IS_ERR(vdpasim_net_dev)) { > - ret = PTR_ERR(vdpasim_net_dev); > - goto out; > + simdev = vdpasim_create(&dev_attr); > + if (IS_ERR(simdev)) > + return PTR_ERR(simdev); > + > + ret = _vdpa_register_device(&simdev->vdpa); > + if (ret) > + goto reg_err; > + > + return 0; > + > +reg_err: > + put_device(&simdev->vdpa.dev); > + return ret; > +} > + > +static void vdpasim_net_dev_del(struct vdpa_mgmt_dev *mdev, > + struct vdpa_device *dev) > +{ > + struct vdpasim *simdev = container_of(dev, struct vdpasim, vdpa); > + > + _vdpa_unregister_device(&simdev->vdpa); > +} > + > +static const struct vdpa_mgmtdev_ops vdpasim_net_mgmtdev_ops = { > + .dev_add = vdpasim_net_dev_add, > + .dev_del = vdpasim_net_dev_del > +}; > + > +static struct virtio_device_id id_table[] = { > + { VIRTIO_ID_NET, VIRTIO_DEV_ANY_ID }, > + { 0 }, > +}; > + > +static struct vdpa_mgmt_dev mgmt_dev = { > + .device = &vdpasim_net_mgmtdev, > + .id_table = id_table, > + .ops = &vdpasim_net_mgmtdev_ops, > +}; > + > +static int __init vdpasim_net_init(void) > +{ > + int ret; > + > + if (macaddr) { > + mac_pton(macaddr, macaddr_buf); > + if (!is_valid_ether_addr(macaddr_buf)) > + return -EADDRNOTAVAIL; > + } else { > + eth_random_addr(macaddr_buf); > }Hmm so all devices start out with the same MAC until changed? And how is the change effected?> - ret = vdpa_register_device(&vdpasim_net_dev->vdpa); > + ret = device_register(&vdpasim_net_mgmtdev); > if (ret) > - goto put_dev; > + return ret; > > + ret = vdpa_mgmtdev_register(&mgmt_dev); > + if (ret) > + goto parent_err; > return 0; > > -put_dev: > - put_device(&vdpasim_net_dev->vdpa.dev); > -out: > +parent_err: > + device_unregister(&vdpasim_net_mgmtdev); > return ret; > } > > static void __exit vdpasim_net_exit(void) > { > - struct vdpa_device *vdpa = &vdpasim_net_dev->vdpa; > - > - vdpa_unregister_device(vdpa); > + vdpa_mgmtdev_unregister(&mgmt_dev); > + device_unregister(&vdpasim_net_mgmtdev); > } > > module_init(vdpasim_net_init); > -- > 2.26.2
Parav Pandit
2021-Jan-05 12:02 UTC
[PATCH linux-next v3 6/6] vdpa_sim_net: Add support for user supported devices
> From: Michael S. Tsirkin <mst at redhat.com> > Sent: Tuesday, January 5, 2021 5:19 PM > > On Tue, Jan 05, 2021 at 12:32:03PM +0200, Parav Pandit wrote: > > Enable user to create vdpasim net simulate devices. > > > >> > $ vdpa dev add mgmtdev vdpasim_net name foo2 > > > > Show the newly created vdpa device by its name: > > $ vdpa dev show foo2 > > foo2: type network mgmtdev vdpasim_net vendor_id 0 max_vqs 2 > > max_vq_size 256 > > > > $ vdpa dev show foo2 -jp > > { > > "dev": { > > "foo2": { > > "type": "network", > > "mgmtdev": "vdpasim_net", > > "vendor_id": 0, > > "max_vqs": 2, > > "max_vq_size": 256 > > } > > } > > } > > > I'd like an example of how do device specific (e.g. net specific) interfaces tie > in to this.Not sure I follow your question. Do you mean how to set mac address or mtu of this vdpa device of type net? If so, dev add command will be extended shortly in subsequent series to set this net specific attributes. (I did mention in the next steps in cover letter).> > +static int __init vdpasim_net_init(void) { > > + int ret; > > + > > + if (macaddr) { > > + mac_pton(macaddr, macaddr_buf); > > + if (!is_valid_ether_addr(macaddr_buf)) > > + return -EADDRNOTAVAIL; > > + } else { > > + eth_random_addr(macaddr_buf); > > } > > Hmm so all devices start out with the same MAC until changed? And how is > the change effected?Post this patchset and post we have iproute2 vdpa in the tree, will add the mac address as the input attribute during "vdpa dev add" command. So that each different vdpa device can have user specified (different) mac address.