Jan Beulich
2012-Jan-19 12:33 UTC
[PATCH] linux-2.6.18/gntdev: switch from char-dev to misc-dev
Rather than consuming a major (using just a single minor under it)
register a dynamic-minor misc-dev (as has been the case in the pv-ops
code from the very beginning).
Signed-off-by: Jan Beulich <jbeulich@suse.com>
--- a/drivers/xen/gntdev/gntdev.c
+++ b/drivers/xen/gntdev/gntdev.c
@@ -21,7 +21,7 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
-#include <linux/device.h>
+#include <linux/miscdevice.h>
#include <linux/mm.h>
#include <linux/mman.h>
#include <asm/uaccess.h>
@@ -30,9 +30,6 @@
#include <asm/hypervisor.h>
#include <xen/balloon.h>
#include <xen/evtchn.h>
-#include <xen/driver_util.h>
-
-#include <linux/types.h>
#include <xen/public/gntdev.h>
@@ -156,11 +153,6 @@ static struct vm_operations_struct gntde
.zap_pte = gntdev_clear_pte
};
-/* Global variables. */
-
-/* The driver major number, for use when unregistering the driver. */
-static int gntdev_major;
-
#define GNTDEV_NAME "gntdev"
/* Memory mapping functions
@@ -371,42 +363,27 @@ nomem_out:
/* Interface functions. */
+static struct miscdevice gntdev_miscdev = {
+ .minor = MISC_DYNAMIC_MINOR,
+ .name = GNTDEV_NAME,
+ .fops = &gntdev_fops,
+};
+
/* Initialises the driver. Called when the module is loaded. */
static int __init gntdev_init(void)
{
- struct class *class;
- struct class_device *device;
+ int err;
if (!is_running_on_xen()) {
printk(KERN_ERR "You must be running Xen to use gntdev\n");
return -ENODEV;
}
- gntdev_major = register_chrdev(0, GNTDEV_NAME, &gntdev_fops);
- if (gntdev_major < 0)
+ err = misc_register(&gntdev_miscdev);
+ if (err)
{
printk(KERN_ERR "Could not register gntdev device\n");
- return -ENOMEM;
- }
-
- /* Note that if the sysfs code fails, we will still initialise the
- * device, and output the major number so that the device can be
- * created manually using mknod.
- */
- if ((class = get_xen_class()) == NULL) {
- printk(KERN_ERR "Error setting up xen_class\n");
- printk(KERN_ERR "gntdev created with major number = %d\n",
- gntdev_major);
- return 0;
- }
-
- device = class_device_create(class, NULL, MKDEV(gntdev_major, 0),
- NULL, GNTDEV_NAME);
- if (IS_ERR(device)) {
- printk(KERN_ERR "Error creating gntdev device in xen_class\n");
- printk(KERN_ERR "gntdev created with major number = %d\n",
- gntdev_major);
- return 0;
+ return err;
}
return 0;
@@ -416,10 +393,7 @@ static int __init gntdev_init(void)
*/
static void __exit gntdev_exit(void)
{
- struct class *class;
- if ((class = get_xen_class()) != NULL)
- class_device_destroy(class, MKDEV(gntdev_major, 0));
- unregister_chrdev(gntdev_major, GNTDEV_NAME);
+ misc_deregister(&gntdev_miscdev);
}
/* Called when the device is opened. */
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel