misc: genwqe: make class_genwqe a static const structure
authorIvan Orlov <ivan.orlov0322@gmail.com>
Thu, 10 Aug 2023 18:27:11 +0000 (22:27 +0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 11 Aug 2023 19:41:33 +0000 (21:41 +0200)
Now that the driver core allows for struct class to be in read-only
memory, move the class_genwqe structure to be declared at build time
placing it into read-only memory, instead of having to be dynamically
allocated at boot time. Update the 'class_genwqe' field of the
'genwqe_dev' struct correspondingly.

Suggested-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Ivan Orlov <ivan.orlov0322@gmail.com>
Link: https://lore.kernel.org/r/20230810182711.22664-1-ivan.orlov0322@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/genwqe/card_base.c
drivers/misc/genwqe/card_base.h

index b030108..224a7e9 100644 (file)
@@ -42,7 +42,7 @@ MODULE_VERSION(DRV_VERSION);
 MODULE_LICENSE("GPL");
 
 static char genwqe_driver_name[] = GENWQE_DEVNAME;
-static struct class *class_genwqe;
+
 static struct dentry *debugfs_genwqe;
 static struct genwqe_dev *genwqe_devices[GENWQE_CARD_NO_MAX];
 
@@ -105,6 +105,26 @@ static const struct pci_device_id genwqe_device_table[] = {
 MODULE_DEVICE_TABLE(pci, genwqe_device_table);
 
 /**
+ * genwqe_devnode() - Set default access mode for genwqe devices.
+ * @dev:       Pointer to device (unused)
+ * @mode:      Carrier to pass-back given mode (permissions)
+ *
+ * Default mode should be rw for everybody. Do not change default
+ * device name.
+ */
+static char *genwqe_devnode(const struct device *dev, umode_t *mode)
+{
+       if (mode)
+               *mode = 0666;
+       return NULL;
+}
+
+static const struct class class_genwqe = {
+       .name = GENWQE_DEVNAME,
+       .devnode = genwqe_devnode,
+};
+
+/**
  * genwqe_dev_alloc() - Create and prepare a new card descriptor
  *
  * Return: Pointer to card descriptor, or ERR_PTR(err) on error
@@ -126,7 +146,7 @@ static struct genwqe_dev *genwqe_dev_alloc(void)
                return ERR_PTR(-ENOMEM);
 
        cd->card_idx = i;
-       cd->class_genwqe = class_genwqe;
+       cd->class_genwqe = &class_genwqe;
        cd->debugfs_genwqe = debugfs_genwqe;
 
        /*
@@ -1340,35 +1360,18 @@ static struct pci_driver genwqe_driver = {
 };
 
 /**
- * genwqe_devnode() - Set default access mode for genwqe devices.
- * @dev:       Pointer to device (unused)
- * @mode:      Carrier to pass-back given mode (permissions)
- *
- * Default mode should be rw for everybody. Do not change default
- * device name.
- */
-static char *genwqe_devnode(const struct device *dev, umode_t *mode)
-{
-       if (mode)
-               *mode = 0666;
-       return NULL;
-}
-
-/**
  * genwqe_init_module() - Driver registration and initialization
  */
 static int __init genwqe_init_module(void)
 {
        int rc;
 
-       class_genwqe = class_create(GENWQE_DEVNAME);
-       if (IS_ERR(class_genwqe)) {
+       rc = class_register(&class_genwqe);
+       if (rc) {
                pr_err("[%s] create class failed\n", __func__);
                return -ENOMEM;
        }
 
-       class_genwqe->devnode = genwqe_devnode;
-
        debugfs_genwqe = debugfs_create_dir(GENWQE_DEVNAME, NULL);
 
        rc = pci_register_driver(&genwqe_driver);
@@ -1381,7 +1384,7 @@ static int __init genwqe_init_module(void)
 
  err_out0:
        debugfs_remove(debugfs_genwqe);
-       class_destroy(class_genwqe);
+       class_unregister(&class_genwqe);
        return rc;
 }
 
@@ -1392,7 +1395,7 @@ static void __exit genwqe_exit_module(void)
 {
        pci_unregister_driver(&genwqe_driver);
        debugfs_remove(debugfs_genwqe);
-       class_destroy(class_genwqe);
+       class_unregister(&class_genwqe);
 }
 
 module_init(genwqe_init_module);
index 0e90297..d700266 100644 (file)
@@ -289,7 +289,7 @@ struct genwqe_dev {
 
        /* char device */
        dev_t  devnum_genwqe;           /* major/minor num card */
-       struct class *class_genwqe;     /* reference to class object */
+       const struct class *class_genwqe;       /* reference to class object */
        struct device *dev;             /* for device creation */
        struct cdev cdev_genwqe;        /* char device for card */