samples/vfio-mdev/mbochs.c

Source file repositories/reference/linux-study-clean/samples/vfio-mdev/mbochs.c

File Facts

System
Linux kernel
Corpus path
samples/vfio-mdev/mbochs.c
Extension
.c
Size
36304 bytes
Lines
1452
Domain
Support Tooling And Documentation
Bucket
samples
Inferred role
Support Tooling And Documentation: operation-table or driver-model contract
Status
pattern implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

static const struct file_operations vd_fops = {
	.owner		= THIS_MODULE,
};

static void mbochs_device_release(struct device *dev)
{
	/* nothing */
}

static int __init mbochs_dev_init(void)
{
	int ret = 0;

	atomic_set(&mbochs_avail_mbytes, max_mbytes);

	ret = alloc_chrdev_region(&mbochs_devt, 0, MINORMASK + 1, MBOCHS_NAME);
	if (ret < 0) {
		pr_err("Error: failed to register mbochs_dev, err: %d\n", ret);
		return ret;
	}
	cdev_init(&mbochs_cdev, &vd_fops);
	cdev_add(&mbochs_cdev, mbochs_devt, MINORMASK + 1);
	pr_info("%s: major %d\n", __func__, MAJOR(mbochs_devt));

	ret = mdev_register_driver(&mbochs_driver);
	if (ret)
		goto err_cdev;

	ret = class_register(&mbochs_class);
	if (ret)
		goto err_driver;
	mbochs_dev.class = &mbochs_class;
	mbochs_dev.release = mbochs_device_release;
	dev_set_name(&mbochs_dev, "%s", MBOCHS_NAME);

	ret = device_register(&mbochs_dev);
	if (ret)
		goto err_put;

	ret = mdev_register_parent(&mbochs_parent, &mbochs_dev, &mbochs_driver,
				   mbochs_mdev_types,
				   ARRAY_SIZE(mbochs_mdev_types));
	if (ret)
		goto err_device;

	return 0;

err_device:
	device_del(&mbochs_dev);
err_put:
	put_device(&mbochs_dev);
	class_unregister(&mbochs_class);
err_driver:
	mdev_unregister_driver(&mbochs_driver);
err_cdev:
	cdev_del(&mbochs_cdev);
	unregister_chrdev_region(mbochs_devt, MINORMASK + 1);
	return ret;
}

static void __exit mbochs_dev_exit(void)
{
	mbochs_dev.bus = NULL;
	mdev_unregister_parent(&mbochs_parent);

	device_unregister(&mbochs_dev);
	mdev_unregister_driver(&mbochs_driver);
	cdev_del(&mbochs_cdev);
	unregister_chrdev_region(mbochs_devt, MINORMASK + 1);
	class_unregister(&mbochs_class);
}

MODULE_IMPORT_NS("DMA_BUF");
module_init(mbochs_dev_init)
module_exit(mbochs_dev_exit)

Annotation

Implementation Notes