Skip to content

Commit 899c4d1

Browse files
stefano-garzarellamstsirkin
authored andcommitted
vdpa_sim_blk: add support for vdpa management tool
Enable the user to create vDPA block simulator devices using the vdpa management tool: # Show vDPA supported devices $ vdpa mgmtdev show vdpasim_blk: supported_classes block # Create a vDPA block device named as 'blk0' from the management # device vdpasim: $ vdpa dev add mgmtdev vdpasim_blk name blk0 # Show the info of the 'blk0' device just created $ vdpa dev show blk0 -jp { "dev": { "blk0": { "type": "block", "mgmtdev": "vdpasim_blk", "vendor_id": 0, "max_vqs": 1, "max_vq_size": 256 } } } # Delete the vDPA device after its use $ vdpa dev del blk0 Signed-off-by: Stefano Garzarella <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Michael S. Tsirkin <[email protected]> Acked-by: Jason Wang <[email protected]>
1 parent e6fa605 commit 899c4d1

File tree

1 file changed

+63
-13
lines changed

1 file changed

+63
-13
lines changed

drivers/vdpa/vdpa_sim/vdpa_sim_blk.c

Lines changed: 63 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
#define VDPASIM_BLK_SEG_MAX 32
3838
#define VDPASIM_BLK_VQ_NUM 1
3939

40-
static struct vdpasim *vdpasim_blk_dev;
4140
static char vdpasim_blk_id[VIRTIO_BLK_ID_BYTES] = "vdpa_blk_sim";
4241

4342
static bool vdpasim_blk_check_range(u64 start_sector, size_t range_size)
@@ -241,11 +240,23 @@ static void vdpasim_blk_get_config(struct vdpasim *vdpasim, void *config)
241240
blk_config->blk_size = cpu_to_vdpasim32(vdpasim, SECTOR_SIZE);
242241
}
243242

244-
static int __init vdpasim_blk_init(void)
243+
static void vdpasim_blk_mgmtdev_release(struct device *dev)
244+
{
245+
}
246+
247+
static struct device vdpasim_blk_mgmtdev = {
248+
.init_name = "vdpasim_blk",
249+
.release = vdpasim_blk_mgmtdev_release,
250+
};
251+
252+
static int vdpasim_blk_dev_add(struct vdpa_mgmt_dev *mdev, const char *name)
245253
{
246254
struct vdpasim_dev_attr dev_attr = {};
255+
struct vdpasim *simdev;
247256
int ret;
248257

258+
dev_attr.mgmt_dev = mdev;
259+
dev_attr.name = name;
249260
dev_attr.id = VIRTIO_ID_BLOCK;
250261
dev_attr.supported_features = VDPASIM_BLK_FEATURES;
251262
dev_attr.nvqs = VDPASIM_BLK_VQ_NUM;
@@ -254,29 +265,68 @@ static int __init vdpasim_blk_init(void)
254265
dev_attr.work_fn = vdpasim_blk_work;
255266
dev_attr.buffer_size = VDPASIM_BLK_CAPACITY << SECTOR_SHIFT;
256267

257-
vdpasim_blk_dev = vdpasim_create(&dev_attr);
258-
if (IS_ERR(vdpasim_blk_dev)) {
259-
ret = PTR_ERR(vdpasim_blk_dev);
260-
goto out;
261-
}
268+
simdev = vdpasim_create(&dev_attr);
269+
if (IS_ERR(simdev))
270+
return PTR_ERR(simdev);
262271

263-
ret = vdpa_register_device(&vdpasim_blk_dev->vdpa, VDPASIM_BLK_VQ_NUM);
272+
ret = _vdpa_register_device(&simdev->vdpa, VDPASIM_BLK_VQ_NUM);
264273
if (ret)
265274
goto put_dev;
266275

267276
return 0;
268277

269278
put_dev:
270-
put_device(&vdpasim_blk_dev->vdpa.dev);
271-
out:
279+
put_device(&simdev->vdpa.dev);
272280
return ret;
273281
}
274282

275-
static void __exit vdpasim_blk_exit(void)
283+
static void vdpasim_blk_dev_del(struct vdpa_mgmt_dev *mdev,
284+
struct vdpa_device *dev)
276285
{
277-
struct vdpa_device *vdpa = &vdpasim_blk_dev->vdpa;
286+
struct vdpasim *simdev = container_of(dev, struct vdpasim, vdpa);
287+
288+
_vdpa_unregister_device(&simdev->vdpa);
289+
}
290+
291+
static const struct vdpa_mgmtdev_ops vdpasim_blk_mgmtdev_ops = {
292+
.dev_add = vdpasim_blk_dev_add,
293+
.dev_del = vdpasim_blk_dev_del
294+
};
278295

279-
vdpa_unregister_device(vdpa);
296+
static struct virtio_device_id id_table[] = {
297+
{ VIRTIO_ID_BLOCK, VIRTIO_DEV_ANY_ID },
298+
{ 0 },
299+
};
300+
301+
static struct vdpa_mgmt_dev mgmt_dev = {
302+
.device = &vdpasim_blk_mgmtdev,
303+
.id_table = id_table,
304+
.ops = &vdpasim_blk_mgmtdev_ops,
305+
};
306+
307+
static int __init vdpasim_blk_init(void)
308+
{
309+
int ret;
310+
311+
ret = device_register(&vdpasim_blk_mgmtdev);
312+
if (ret)
313+
return ret;
314+
315+
ret = vdpa_mgmtdev_register(&mgmt_dev);
316+
if (ret)
317+
goto parent_err;
318+
319+
return 0;
320+
321+
parent_err:
322+
device_unregister(&vdpasim_blk_mgmtdev);
323+
return ret;
324+
}
325+
326+
static void __exit vdpasim_blk_exit(void)
327+
{
328+
vdpa_mgmtdev_unregister(&mgmt_dev);
329+
device_unregister(&vdpasim_blk_mgmtdev);
280330
}
281331

282332
module_init(vdpasim_blk_init)

0 commit comments

Comments
 (0)