[PATCH 2.6.7-rc3] Add's class support to msr.c

From: Hanna Linder (hannal_at_us.ibm.com)
Date: 06/10/04

  • Next message: Stian Jordet: "Fix warning in hisax/config.c"
    Date:	Wed, 09 Jun 2004 16:23:11 -0700
    To: linux-kernel@vger.kernel.org
    
    

    This patch enables class support in arch/i386/kernel/msr.c. Very simliar
    to cpuid (with the fixes Zwane/Greg made, thanks).

    [root@w-hlinder2 root]# tree /sys/class/msr
    /sys/class/msr
    |-- msr0
    | `-- dev
    `-- msr1
        `-- dev

    2 directories, 2 files

    Please consider for testing/inclusion.

    Signed-off-by Hanna Linder <hannal@us.ibm.com>

    Thanks.

    Hanna Linder
    IBM Linux Technology Center
    -----------
    diff -Nrup linux-2.6.7-rc3/arch/i386/kernel/msr.c linux-2.6.7-rc3p/arch/i386/kernel/msr.c
    --- linux-2.6.7-rc3/arch/i386/kernel/msr.c 2004-06-08 16:49:29.000000000 -0700
    +++ linux-2.6.7-rc3p/arch/i386/kernel/msr.c 2004-06-09 15:26:31.000000000 -0700
    @@ -35,12 +35,17 @@
     #include <linux/smp_lock.h>
     #include <linux/major.h>
     #include <linux/fs.h>
    +#include <linux/device.h>
    +#include <linux/cpu.h>
    +#include <linux/notifier.h>
     
     #include <asm/processor.h>
     #include <asm/msr.h>
     #include <asm/uaccess.h>
     #include <asm/system.h>
     
    +static struct class_simple *msr_class;
    +
     /* Note: "err" is handled in a funny way below. Otherwise one version
        of gcc or another breaks. */
     
    @@ -255,20 +260,82 @@ static struct file_operations msr_fops =
             .open = msr_open,
     };
     
    +static int msr_class_simple_device_add(int i)
    +{
    + int err = 0;
    + struct class_device *class_err;
    +
    + class_err = class_simple_device_add(msr_class, MKDEV(MSR_MAJOR, i), NULL, "msr%d",i);
    + if (IS_ERR(class_err))
    + err = PTR_ERR(class_err);
    + return err;
    +}
    +
    +static int __devinit msr_class_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
    +{
    + unsigned int cpu = (unsigned long)hcpu;
    +
    + switch (action) {
    + case CPU_ONLINE:
    + msr_class_simple_device_add(cpu);
    + break;
    + case CPU_DEAD:
    + class_simple_device_remove(MKDEV(MSR_MAJOR, cpu));
    + break;
    + }
    + return NOTIFY_OK;
    +}
    +
    +static struct notifier_block msr_class_cpu_notifier =
    +{
    + .notifier_call = msr_class_cpu_callback,
    +};
    +
     int __init msr_init(void)
     {
    + int i, err = 0;
    + i = 0;
    +
             if (register_chrdev(MSR_MAJOR, "cpu/msr", &msr_fops)) {
                     printk(KERN_ERR "msr: unable to get major %d for msr\n",
                            MSR_MAJOR);
    - return -EBUSY;
    + err = -EBUSY;
    + goto out;
    + }
    + msr_class = class_simple_create(THIS_MODULE, "msr");
    + if (IS_ERR(msr_class)) {
    + err = PTR_ERR(msr_class);
    + goto out_chrdev;
    + }
    + for_each_online_cpu(i) {
    + err = msr_class_simple_device_add(i);
    + if (err != 0)
    + goto out_class;
             }
    + register_cpu_notifier(&msr_class_cpu_notifier);
     
    - return 0;
    + err = 0;
    + goto out;
    +
    + out_class:
    + i = 0;
    + for_each_online_cpu(i)
    + class_simple_device_remove(MKDEV(MSR_MAJOR, i));
    + class_simple_destroy(msr_class);
    + out_chrdev:
    + unregister_chrdev(MSR_MAJOR, "cpu/msr");
    + out:
    + return err;
     }
     
     void __exit msr_exit(void)
     {
    + int cpu = 0;
    + for_each_online_cpu(cpu)
    + class_simple_device_remove(MKDEV(MSR_MAJOR, cpu));
    + class_simple_destroy(msr_class);
             unregister_chrdev(MSR_MAJOR, "cpu/msr");
    + unregister_cpu_notifier(&msr_class_cpu_notifier);
     }
     
     module_init(msr_init);

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/


  • Next message: Stian Jordet: "Fix warning in hisax/config.c"

    Relevant Pages

    • Re: modprobe + request_module() deadlock
      ... calls request_moduleonce the depending module went to LIVE state. ... +static int pending_call(struct notifier_block *self, unsigned long state, ... +static struct notifier_block pending_notifier = { ... send the line "unsubscribe linux-kernel" in ...
      (Linux-Kernel)
    • [PATCH] kill 8139too kernel thread (sorta)
      ... static void mdio_write (struct net_device *dev, int phy_id, int location, ... static struct ethtool_ops rtl8139_ethtool_ops; ... send the line "unsubscribe linux-kernel" in ...
      (Linux-Kernel)
    • [2.6 patch] net/appletalk/: make some code static
      ... * Probe a Phase 1 device or a device that requires its Net:Node to ... +static void atrtr_device_down(struct net_device *dev) ... +static struct packet_type ppptalk_packet_type = { ... send the line "unsubscribe linux-kernel" in ...
      (Linux-Kernel)
    • Re: [PATCH] PCI patches for 2.6.10
      ... +static int pirq_enable_irq(struct pci_dev *dev) ... extern int pcibios_scanned; ... send the line "unsubscribe linux-kernel" in ...
      (Linux-Kernel)
    • Re: [PATCH 2.6.7-rc3] Adds class support to msr.c
      ... Thanks to Randy Dunlap for pointing out the unnecessary tabs. ... +static struct class_simple *msr_class; ... +static int msr_class_simple_device_add ... send the line "unsubscribe linux-kernel" in ...
      (Linux-Kernel)