Skip to content
  • Andi Kleen's avatar
    Add driver auto probing for x86 features v4 · 644e9cbb
    Andi Kleen authored
    
    
    There's a growing number of drivers that support a specific x86 feature
    or CPU.  Currently loading these drivers currently on a generic
    distribution requires various driver specific hacks and it often
    doesn't work.
    
    This patch adds auto probing for drivers based on the x86 cpuid
    information, in particular based on vendor/family/model number
    and also based on CPUID feature bits.
    
    For example a common issue is not loading the SSE 4.2 accelerated
    CRC module: this can significantly lower the performance of BTRFS
    which relies on fast CRC.
    
    Another issue is loading the right CPUFREQ driver for the current CPU.
    Currently distributions often try all all possible driver until
    one sticks, which is not really a good way to do this.
    
    It works with existing udev without any changes. The code
    exports the x86 information as a generic string in sysfs
    that can be matched by udev's pattern matching.
    
    This scheme does not support numeric ranges, so if you want to
    handle e.g. ranges of model numbers they have to be encoded
    in ASCII or simply all models or families listed. Fixing
    that would require changing udev.
    
    Another issue is that udev will happily load all drivers that match,
    there is currently no nice way to stop a specific driver from
    being loaded if it's not needed (e.g. if you don't need fast CRC)
    But there are not that many cpu specific drivers around and they're
    all not that bloated, so this isn't a particularly serious issue.
    
    Originally this patch added the modalias to the normal cpu
    sysdevs. However sysdevs don't have all the infrastructure
    needed for udev, so it couldn't really autoload drivers.
    This patch instead adds the CPU modaliases to the cpuid devices,
    which are real devices with full support for udev. This implies
    that the cpuid driver has to be loaded to use this.
    
    This patch just adds infrastructure, some driver conversions
    in followups.
    
    Thanks to Kay for helping with some sysfs magic.
    
    v2: Constifcation, some updates
    v4: (trenn@suse.de):
        - Use kzalloc instead of kmalloc to terminate modalias buffer
        - Use uppercase hex values to match correctly against hex values containing
          letters
    
    Cc: Dave Jones <davej@redhat.com>
    Cc: Kay Sievers <kay.sievers@vrfy.org>
    Cc: Jen Axboe <axboe@kernel.dk>
    Cc: Herbert Xu <herbert@gondor.apana.org.au>
    Cc: Huang Ying <ying.huang@intel.com>
    Cc: Len Brown <lenb@kernel.org>
    Signed-off-by: default avatarAndi Kleen <ak@linux.intel.com>
    Signed-off-by: default avatarThomas Renninger <trenn@suse.de>
    Acked-by: default avatarH. Peter Anvin <hpa@zytor.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    644e9cbb