x86/cpuid: make cpuid_class a static const structure
authorIvan Orlov <ivan.orlov0322@gmail.com>
Tue, 20 Jun 2023 14:44:32 +0000 (16:44 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 5 Aug 2023 06:31:41 +0000 (08:31 +0200)
Now that the driver core allows for struct class to be in read-only
memory, move the cpuid_class structure to be declared at build time
placing it into read-only memory, instead of having to be dynamically
allocated at boot time.

Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: x86@kernel.org
Suggested-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Ivan Orlov <ivan.orlov0322@gmail.com>
Link: https://lore.kernel.org/r/20230620144431.583290-4-gregkh@linuxfoundation.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/x86/kernel/cpuid.c

index bdc0d55..dae4362 100644 (file)
@@ -40,7 +40,6 @@
 #include <asm/processor.h>
 #include <asm/msr.h>
 
-static struct class *cpuid_class;
 static enum cpuhp_state cpuhp_cpuid_state;
 
 struct cpuid_regs_done {
@@ -124,26 +123,31 @@ static const struct file_operations cpuid_fops = {
        .open = cpuid_open,
 };
 
+static char *cpuid_devnode(const struct device *dev, umode_t *mode)
+{
+       return kasprintf(GFP_KERNEL, "cpu/%u/cpuid", MINOR(dev->devt));
+}
+
+static const struct class cpuid_class = {
+       .name           = "cpuid",
+       .devnode        = cpuid_devnode,
+};
+
 static int cpuid_device_create(unsigned int cpu)
 {
        struct device *dev;
 
-       dev = device_create(cpuid_class, NULL, MKDEV(CPUID_MAJOR, cpu), NULL,
+       dev = device_create(&cpuid_class, NULL, MKDEV(CPUID_MAJOR, cpu), NULL,
                            "cpu%d", cpu);
        return PTR_ERR_OR_ZERO(dev);
 }
 
 static int cpuid_device_destroy(unsigned int cpu)
 {
-       device_destroy(cpuid_class, MKDEV(CPUID_MAJOR, cpu));
+       device_destroy(&cpuid_class, MKDEV(CPUID_MAJOR, cpu));
        return 0;
 }
 
-static char *cpuid_devnode(const struct device *dev, umode_t *mode)
-{
-       return kasprintf(GFP_KERNEL, "cpu/%u/cpuid", MINOR(dev->devt));
-}
-
 static int __init cpuid_init(void)
 {
        int err;
@@ -154,12 +158,9 @@ static int __init cpuid_init(void)
                       CPUID_MAJOR);
                return -EBUSY;
        }
-       cpuid_class = class_create("cpuid");
-       if (IS_ERR(cpuid_class)) {
-               err = PTR_ERR(cpuid_class);
+       err = class_register(&cpuid_class);
+       if (err)
                goto out_chrdev;
-       }
-       cpuid_class->devnode = cpuid_devnode;
 
        err = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "x86/cpuid:online",
                                cpuid_device_create, cpuid_device_destroy);
@@ -170,7 +171,7 @@ static int __init cpuid_init(void)
        return 0;
 
 out_class:
-       class_destroy(cpuid_class);
+       class_unregister(&cpuid_class);
 out_chrdev:
        __unregister_chrdev(CPUID_MAJOR, 0, NR_CPUS, "cpu/cpuid");
        return err;
@@ -180,7 +181,7 @@ module_init(cpuid_init);
 static void __exit cpuid_exit(void)
 {
        cpuhp_remove_state(cpuhp_cpuid_state);
-       class_destroy(cpuid_class);
+       class_unregister(&cpuid_class);
        __unregister_chrdev(CPUID_MAJOR, 0, NR_CPUS, "cpu/cpuid");
 }
 module_exit(cpuid_exit);