Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <sgarzare@redhat.com>
Link: https://lore.kernel.org/r/20210315163450.254396-15-sgarzare@redhat.com
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Acked-by: Jason Wang <jasowang@redhat.com>

authored by

Stefano Garzarella and committed by
Michael S. Tsirkin
899c4d18 e6fa6052

+63 -13
+63 -13
drivers/vdpa/vdpa_sim/vdpa_sim_blk.c
··· 37 37 #define VDPASIM_BLK_SEG_MAX 32 38 38 #define VDPASIM_BLK_VQ_NUM 1 39 39 40 - static struct vdpasim *vdpasim_blk_dev; 41 40 static char vdpasim_blk_id[VIRTIO_BLK_ID_BYTES] = "vdpa_blk_sim"; 42 41 43 42 static bool vdpasim_blk_check_range(u64 start_sector, size_t range_size) ··· 240 241 blk_config->blk_size = cpu_to_vdpasim32(vdpasim, SECTOR_SIZE); 241 242 } 242 243 243 - static int __init vdpasim_blk_init(void) 244 + static void vdpasim_blk_mgmtdev_release(struct device *dev) 245 + { 246 + } 247 + 248 + static struct device vdpasim_blk_mgmtdev = { 249 + .init_name = "vdpasim_blk", 250 + .release = vdpasim_blk_mgmtdev_release, 251 + }; 252 + 253 + static int vdpasim_blk_dev_add(struct vdpa_mgmt_dev *mdev, const char *name) 244 254 { 245 255 struct vdpasim_dev_attr dev_attr = {}; 256 + struct vdpasim *simdev; 246 257 int ret; 247 258 259 + dev_attr.mgmt_dev = mdev; 260 + dev_attr.name = name; 248 261 dev_attr.id = VIRTIO_ID_BLOCK; 249 262 dev_attr.supported_features = VDPASIM_BLK_FEATURES; 250 263 dev_attr.nvqs = VDPASIM_BLK_VQ_NUM; ··· 265 254 dev_attr.work_fn = vdpasim_blk_work; 266 255 dev_attr.buffer_size = VDPASIM_BLK_CAPACITY << SECTOR_SHIFT; 267 256 268 - vdpasim_blk_dev = vdpasim_create(&dev_attr); 269 - if (IS_ERR(vdpasim_blk_dev)) { 270 - ret = PTR_ERR(vdpasim_blk_dev); 271 - goto out; 272 - } 257 + simdev = vdpasim_create(&dev_attr); 258 + if (IS_ERR(simdev)) 259 + return PTR_ERR(simdev); 273 260 274 - ret = vdpa_register_device(&vdpasim_blk_dev->vdpa, VDPASIM_BLK_VQ_NUM); 261 + ret = _vdpa_register_device(&simdev->vdpa, VDPASIM_BLK_VQ_NUM); 275 262 if (ret) 276 263 goto put_dev; 277 264 278 265 return 0; 279 266 280 267 put_dev: 281 - put_device(&vdpasim_blk_dev->vdpa.dev); 282 - out: 268 + put_device(&simdev->vdpa.dev); 269 + return ret; 270 + } 271 + 272 + static void vdpasim_blk_dev_del(struct vdpa_mgmt_dev *mdev, 273 + struct vdpa_device *dev) 274 + { 275 + struct vdpasim *simdev = container_of(dev, struct vdpasim, vdpa); 276 + 277 + _vdpa_unregister_device(&simdev->vdpa); 278 + } 279 + 280 + static const struct vdpa_mgmtdev_ops vdpasim_blk_mgmtdev_ops = { 281 + .dev_add = vdpasim_blk_dev_add, 282 + .dev_del = vdpasim_blk_dev_del 283 + }; 284 + 285 + static struct virtio_device_id id_table[] = { 286 + { VIRTIO_ID_BLOCK, VIRTIO_DEV_ANY_ID }, 287 + { 0 }, 288 + }; 289 + 290 + static struct vdpa_mgmt_dev mgmt_dev = { 291 + .device = &vdpasim_blk_mgmtdev, 292 + .id_table = id_table, 293 + .ops = &vdpasim_blk_mgmtdev_ops, 294 + }; 295 + 296 + static int __init vdpasim_blk_init(void) 297 + { 298 + int ret; 299 + 300 + ret = device_register(&vdpasim_blk_mgmtdev); 301 + if (ret) 302 + return ret; 303 + 304 + ret = vdpa_mgmtdev_register(&mgmt_dev); 305 + if (ret) 306 + goto parent_err; 307 + 308 + return 0; 309 + 310 + parent_err: 311 + device_unregister(&vdpasim_blk_mgmtdev); 283 312 return ret; 284 313 } 285 314 286 315 static void __exit vdpasim_blk_exit(void) 287 316 { 288 - struct vdpa_device *vdpa = &vdpasim_blk_dev->vdpa; 289 - 290 - vdpa_unregister_device(vdpa); 317 + vdpa_mgmtdev_unregister(&mgmt_dev); 318 + device_unregister(&vdpasim_blk_mgmtdev); 291 319 } 292 320 293 321 module_init(vdpasim_blk_init)