17 Jan, 2012

1 commit

  • When suspending, there was a large list of warnings going something like:

    Device 'machinecheck1' does not have a release() function, it is broken and must be fixed

    This patch turns the static mce_devices into dynamically allocated, and
    properly frees them when they are removed from the system. It solves
    the warning messages on my laptop here.

    Reported-by: "Srivatsa S. Bhat"
    Reported-by: Linus Torvalds
    Tested-by: Djalal Harouni
    Cc: Kay Sievers
    Cc: Tony Luck
    Cc: Borislav Petkov
    Signed-off-by: Greg Kroah-Hartman
    Signed-off-by: Linus Torvalds

    Greg Kroah-Hartman
     

14 Jan, 2012

1 commit

  • Commit 8a25a2fd126c ("cpu: convert 'cpu' and 'machinecheck' sysdev_class
    to a regular subsystem") changed how things are dealt with in the MCE
    subsystem. Some of the things that got broken due to this are CPU
    hotplug and suspend/hibernate.

    MCE uses per_cpu allocations of struct device. So, when a CPU goes
    offline and comes back online, in order to ensure that we start from a
    clean slate with respect to the MCE subsystem, zero out the entire
    per_cpu device structure to 0 before using it.

    Signed-off-by: Srivatsa S. Bhat
    Signed-off-by: Linus Torvalds

    Srivatsa S. Bhat
     

08 Jan, 2012

1 commit

  • * 'driver-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core: (73 commits)
    arm: fix up some samsung merge sysdev conversion problems
    firmware: Fix an oops on reading fw_priv->fw in sysfs loading file
    Drivers:hv: Fix a bug in vmbus_driver_unregister()
    driver core: remove __must_check from device_create_file
    debugfs: add missing #ifdef HAS_IOMEM
    arm: time.h: remove device.h #include
    driver-core: remove sysdev.h usage.
    clockevents: remove sysdev.h
    arm: convert sysdev_class to a regular subsystem
    arm: leds: convert sysdev_class to a regular subsystem
    kobject: remove kset_find_obj_hinted()
    m86k: gpio - convert sysdev_class to a regular subsystem
    mips: txx9_sram - convert sysdev_class to a regular subsystem
    mips: 7segled - convert sysdev_class to a regular subsystem
    sh: dma - convert sysdev_class to a regular subsystem
    sh: intc - convert sysdev_class to a regular subsystem
    power: suspend - convert sysdev_class to a regular subsystem
    power: qe_ic - convert sysdev_class to a regular subsystem
    power: cmm - convert sysdev_class to a regular subsystem
    s390: time - convert sysdev_class to a regular subsystem
    ...

    Fix up conflicts with 'struct sysdev' removal from various platform
    drivers that got changed:
    - arch/arm/mach-exynos/cpu.c
    - arch/arm/mach-exynos/irq-eint.c
    - arch/arm/mach-s3c64xx/common.c
    - arch/arm/mach-s3c64xx/cpu.c
    - arch/arm/mach-s5p64x0/cpu.c
    - arch/arm/mach-s5pv210/common.c
    - arch/arm/plat-samsung/include/plat/cpu.h
    - arch/powerpc/kernel/sysfs.c
    and fix up cpu_is_hotpluggable() as per Greg in include/linux/cpu.h

    Linus Torvalds
     

07 Jan, 2012

2 commits


22 Dec, 2011

1 commit

  • This moves the 'cpu sysdev_class' over to a regular 'cpu' subsystem
    and converts the devices to regular devices. The sysdev drivers are
    implemented as subsystem interfaces now.

    After all sysdev classes are ported to regular driver core entities, the
    sysdev implementation will be entirely removed from the kernel.

    Userspace relies on events and generic sysfs subsystem infrastructure
    from sysdev devices, which are made available with this conversion.

    Cc: Haavard Skinnemoen
    Cc: Hans-Christian Egtvedt
    Cc: Tony Luck
    Cc: Fenghua Yu
    Cc: Arnd Bergmann
    Cc: Benjamin Herrenschmidt
    Cc: Paul Mackerras
    Cc: Martin Schwidefsky
    Cc: Heiko Carstens
    Cc: Paul Mundt
    Cc: "David S. Miller"
    Cc: Chris Metcalf
    Cc: Thomas Gleixner
    Cc: Ingo Molnar
    Cc: "H. Peter Anvin"
    Cc: Borislav Petkov
    Cc: Tigran Aivazian
    Cc: Len Brown
    Cc: Zhang Rui
    Cc: Dave Jones
    Cc: Peter Zijlstra
    Cc: Russell King
    Cc: Andrew Morton
    Cc: Arjan van de Ven
    Cc: "Rafael J. Wysocki"
    Cc: "Srivatsa S. Bhat"
    Signed-off-by: Kay Sievers
    Signed-off-by: Greg Kroah-Hartman

    Kay Sievers
     

21 Dec, 2011

1 commit

  • Several fields in struct cpuinfo_x86 were not defined for the
    !SMP case, likely to save space. However, those fields still
    have some meaning for UP, and keeping them allows some #ifdef
    removal from other files. The additional size of the UP kernel
    from this change is not significant enough to worry about
    keeping up the distinction:

    text data bss dec hex filename
    4737168 506459 972040 6215667 5ed7f3 vmlinux.o.before
    4737444 506459 972040 6215943 5ed907 vmlinux.o.after

    for a difference of 276 bytes for an example UP config.

    If someone wants those 276 bytes back badly then it should
    be implemented in a cleaner way.

    Signed-off-by: Kevin Winchester
    Cc: Steffen Persvold
    Link: http://lkml.kernel.org/r/1324428742-12498-1-git-send-email-kjwinchester@gmail.com
    Signed-off-by: Ingo Molnar

    Kevin Winchester
     

14 Dec, 2011

2 commits


08 Nov, 2011

1 commit

  • Arjan would like to make struct file_operations const, but
    mce-inject directly writes to the mce_chrdev_ops to install its
    write handler. In an ideal world mce-inject would have its own
    character device, but we have a sizable legacy of test scripts
    that hardwire "/dev/mcelog", so it would be painful to switch to
    a separate device now. Instead, this patch switches to a stub
    function in the mce code, with a registration helper that
    mce-inject can call when it is loaded.

    Note that this would also allow for a sane process to allow
    mce-inject to be unloaded again (with an unregister function,
    and appropriate module_{get,put}() calls), but that is left for
    potential future patches.

    Reported-by: Arjan van de Ven
    Signed-off-by: Tony Luck
    Link: http://lkml.kernel.org/r/4eb2e1971326651a3b@agluck-desktop.sc.intel.com
    Signed-off-by: Ingo Molnar

    Luck, Tony
     

07 Nov, 2011

1 commit

  • * 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git/paulg/linux: (230 commits)
    Revert "tracing: Include module.h in define_trace.h"
    irq: don't put module.h into irq.h for tracking irqgen modules.
    bluetooth: macroize two small inlines to avoid module.h
    ip_vs.h: fix implicit use of module_get/module_put from module.h
    nf_conntrack.h: fix up fallout from implicit moduleparam.h presence
    include: replace linux/module.h with "struct module" wherever possible
    include: convert various register fcns to macros to avoid include chaining
    crypto.h: remove unused crypto_tfm_alg_modname() inline
    uwb.h: fix implicit use of asm/page.h for PAGE_SIZE
    pm_runtime.h: explicitly requires notifier.h
    linux/dmaengine.h: fix implicit use of bitmap.h and asm/page.h
    miscdevice.h: fix up implicit use of lists and types
    stop_machine.h: fix implicit use of smp.h for smp_processor_id
    of: fix implicit use of errno.h in include/linux/of.h
    of_platform.h: delete needless include
    acpi: remove module.h include from platform/aclinux.h
    miscdevice.h: delete unnecessary inclusion of module.h
    device_cgroup.h: delete needless include
    net: sch_generic remove redundant use of
    net: inet_timewait_sock doesnt need
    ...

    Fix up trivial conflicts (other header files, and removal of the ab3550 mfd driver) in
    - drivers/media/dvb/frontends/dibx000_common.c
    - drivers/media/video/{mt9m111.c,ov6650.c}
    - drivers/mfd/ab3550-core.c
    - include/linux/dmaengine.h

    Linus Torvalds
     

03 Nov, 2011

1 commit

  • * 'linux_next' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-edac: (21 commits)
    MAINTAINERS: add an entry for Edac Sandy Bridge driver
    edac: tag sb_edac as EXPERIMENTAL, as it requires more testing
    EDAC: Fix incorrect edac mode reporting in sb_edac
    edac: sb_edac: Add it to the building system
    edac: Add an experimental new driver to support Sandy Bridge CPU's
    i7300_edac: Fix error cleanup logic
    i7core_edac: Initialize memory name with cpu, channel, bank
    i7core_edac: Fix compilation on 32 bits arch
    i7core_edac: scrubbing fixups
    EDAC: Correct Kconfig dependencies
    i7core_edac: return -ENODEV if no MC is found
    i7core_edac: use edac's own way to print errors
    MAINTAINERS: remove dropped edac_mce.* from the file
    i7core_edac: Drop the edac_mce facility
    x86, MCE: Use notifier chain only for MCE decoding
    EDAC i7core: Use mce socketid for better compatibility
    i7core_edac: Don't enable memory scrubbing for Xeon 35xx
    i7core_edac: Add scrubbing support
    edac: Move edac main structs to include/linux/edac.h
    i7core_edac: Fix oops when trying to inject errors
    ...

    Linus Torvalds
     

01 Nov, 2011

3 commits

  • Remove edac_mce pieces and use the normal MCE decoder notifier chain by
    retaining the same functionality with considerably less code.

    Signed-off-by: Borislav Petkov
    Signed-off-by: Mauro Carvalho Chehab

    Borislav Petkov
     
  • These files were implicitly getting EXPORT_SYMBOL via device.h
    which was including module.h, but that will be fixed up shortly.

    By fixing these now, we can avoid seeing things like:

    arch/x86/kernel/rtc.c:29: warning: type defaults to ‘int’ in declaration of ‘EXPORT_SYMBOL’
    arch/x86/kernel/pci-dma.c:20: warning: type defaults to ‘int’ in declaration of ‘EXPORT_SYMBOL’
    arch/x86/kernel/e820.c:69: warning: type defaults to ‘int’ in declaration of ‘EXPORT_SYMBOL_GPL’

    [ with input from Randy Dunlap and also
    from Stephen Rothwell ]

    Signed-off-by: Paul Gortmaker

    Paul Gortmaker
     
  • Drop the edac_mce custom hook in favor of the generic notifier
    mechanism. Also, do not log the error to mcelog if the notified agent
    was able to decode it.

    Signed-off-by: Borislav Petkov
    Acked-by: Ingo Molnar
    Signed-off-by: Mauro Carvalho Chehab

    Borislav Petkov
     

28 Oct, 2011

1 commit

  • * 'x86-microcode-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
    x86, microcode, AMD: Add microcode revision to /proc/cpuinfo
    x86, microcode: Correct microcode revision format
    coretemp: Get microcode revision from cpu_data
    x86, intel: Use c->microcode for Atom errata check
    x86, intel: Output microcode revision in /proc/cpuinfo
    x86, microcode: Don't request microcode from userspace unnecessarily

    Fix up trivial conflicts in arch/x86/kernel/cpu/amd.c (conflict between
    moving AMD BSP code to cpu_dev helper function and adding AMD microcode
    revision to /proc/cpuinfo code)

    Linus Torvalds
     

19 Oct, 2011

1 commit


14 Oct, 2011

1 commit

  • I got a request to make it easier to determine the microcode
    update level on Intel CPUs. This patch adds a new "microcode"
    field to /proc/cpuinfo.

    The microcode level is also outputed on fatal machine checks
    together with the other CPUID model information.

    I removed the respective code from the microcode update driver,
    it just reads the field from cpu_data. Also when the microcode
    is updated it fills in the new values too.

    I had to add a memory barrier to native_cpuid to prevent it
    being optimized away when the result is not used.

    This turns out to clean up further code which already got this
    information manually. This is done in followon patches.

    Signed-off-by: Andi Kleen
    Acked-by: H. Peter Anvin
    Link: http://lkml.kernel.org/r/1318466795-7393-1-git-send-email-andi@firstfloor.org
    Signed-off-by: Ingo Molnar

    Andi Kleen
     

10 Oct, 2011

1 commit

  • Just convert all the files that have an nmi handler to the new routines.
    Most of it is straight forward conversion. A couple of places needed some
    tweaking like kgdb which separates the debug notifier from the nmi handler
    and mce removes a call to notify_die.

    [Thanks to Ying for finding out the history behind that mce call

    https://lkml.org/lkml/2010/5/27/114

    And Boris responding that he would like to remove that call because of it

    https://lkml.org/lkml/2011/9/21/163]

    The things that get converted are the registeration/unregistration routines
    and the nmi handler itself has its args changed along with code removal
    to check which list it is on (most are on one NMI list except for kgdb
    which has both an NMI routine and an NMI Unknown routine).

    Signed-off-by: Don Zickus
    Signed-off-by: Peter Zijlstra
    Acked-by: Corey Minyard
    Cc: Jason Wessel
    Cc: Andi Kleen
    Cc: Robert Richter
    Cc: Huang Ying
    Cc: Corey Minyard
    Cc: Jack Steiner
    Link: http://lkml.kernel.org/r/1317409584-23662-4-git-send-email-dzickus@redhat.com
    Signed-off-by: Ingo Molnar

    Don Zickus
     

14 Sep, 2011

1 commit

  • del_timer_sync() can cause a deadlock when called in interrupt context.
    It is used with on_each_cpu() in some parts for sysfs files like bank*,
    check_interval, cmci_disabled and ignore_ce.

    However, use of on_each_cpu() results in calling the function passed
    as the argument in interrupt context. This causes a flood of nested
    warnings from del_timer_sync() (it runs on each CPU) caused even by a
    simple file access like:

    $ echo 300 > /sys/devices/system/machinecheck/machinecheck0/check_interval

    Fortunately, these MCE-specific files are rarely used and AFAIK only few
    MCE geeks experience this warning.

    To remove the warning, move timer deletion outside of the interrupt
    context.

    Signed-off-by: Hidetoshi Seto
    Signed-off-by: Borislav Petkov

    Hidetoshi Seto
     

16 Jun, 2011

8 commits

  • There are many functions named mce_* so use a new prefix for the subset
    of functions related to sysfs support.

    And since f3c6ea1b06c71b43f751b36bd99345369fe911af introduces
    syscore_ops, use the prefix mce_syscore for some functions related to
    power management which were in sysdev_class before.

    Before: After:
    mce_device mce_sysdev
    mce_sysclass mce_sysdev_class
    mce_attrs mce_sysdev_attrs
    mce_dev_initialized mce_sysdev_initialized
    mce_create_device mce_sysdev_create
    mce_remove_device mce_sysdev_remove

    mce_suspend mce_syscore_suspend
    mce_shutdown mce_syscore_shutdown
    mce_resume mce_syscore_resume

    Signed-off-by: Hidetoshi Seto
    Acked-by: Tony Luck
    Link: http://lkml.kernel.org/r/4DEED81B.8020506@jp.fujitsu.com
    Signed-off-by: Borislav Petkov

    Hidetoshi Seto
     
  • There are many functions named mce_* so use a new prefix for the subset
    of functions dealing with the character device /dev/mcelog.

    This change doesn't impact the mce-inject module because the exported
    symbol mce_chrdev_ops already has the prefix, therefore it is left
    unchanged.

    Before: After:
    mce_wait mce_chrdev_wait
    mce_state_lock mce_chrdev_state_lock
    open_count mce_chrdev_open_count
    open_exclu mce_chrdev_open_exclu
    mce_open mce_chrdev_open
    mce_release mce_chrdev_release
    mce_read_mutex mce_chrdev_read_mutex
    mce_read mce_chrdev_read
    mce_poll mce_chrdev_poll
    mce_ioctl mce_chrdev_ioctl
    mce_log_device mce_chrdev_device

    Signed-off-by: Hidetoshi Seto
    Acked-by: Tony Luck
    Link: http://lkml.kernel.org/r/4DEED7CD.3040500@jp.fujitsu.com
    Signed-off-by: Borislav Petkov

    Hidetoshi Seto
     
  • Use a temporary local variable m to simplify the code. No change in
    logic.

    Signed-off-by: Hidetoshi Seto
    Acked-by: Tony Luck
    Link: http://lkml.kernel.org/r/4DEED7A8.8020307@jp.fujitsu.com
    Signed-off-by: Borislav Petkov

    Hidetoshi Seto
     
  • Use temporary local variable sysdev to simplify the code. No change in
    logic.

    Signed-off-by: Hidetoshi Seto
    Acked-by: Tony Luck
    Link: http://lkml.kernel.org/r/4DEED777.7080205@jp.fujitsu.com
    Signed-off-by: Borislav Petkov

    Hidetoshi Seto
     
  • Because "ancient CPUs" like p5 and winchip don't have X86_FEATURE_MCA
    (I suppose so), mcheck_cpu_init() on such CPUs will return at check of
    mce_available() after __mcheck_cpu_ancient_init().

    It is hard to know this implicit behavior without knowing the CPUs
    well. So make it clear that we leave mcheck_cpu_init() when the CPU is
    initialized in __mcheck_cpu_ancient_init().

    Signed-off-by: Hidetoshi Seto
    Acked-by: Tony Luck
    Link: http://lkml.kernel.org/r/4DEED74B.20502@jp.fujitsu.com
    Signed-off-by: Borislav Petkov

    Hidetoshi Seto
     
  • This patch introduces mce_gather_info() which is to be called at the
    beginning of error handling and gathers minimum error information from
    proper error registers (and saved registers).

    As the result of mce_get_rip() is integrated, unnecessary zeroing
    is removed. This also takes care of saving RIP which is required to
    make some decision about error severity for SRAR errors, instead of
    retrieving it later in the handler.

    Signed-off-by: Hidetoshi Seto
    Acked-by: Tony Luck
    Link: http://lkml.kernel.org/r/4DEED71A.1060906@jp.fujitsu.com
    Signed-off-by: Borislav Petkov

    Hidetoshi Seto
     
  • Follow other MCi register defines. Plus define MCI_MISC_ADDR_LSB() and
    MCI_MISC_ADDR_MODE().

    Signed-off-by: Hidetoshi Seto
    Acked-by: Tony Luck
    Link: http://lkml.kernel.org/r/4DEED6E8.9090509@jp.fujitsu.com
    Signed-off-by: Borislav Petkov

    Hidetoshi Seto
     
  • The MCE handler uses a special vector for self IPI to invoke
    post-emergency processing in an interrupt context, e.g. call an
    NMI-unsafe function, wakeup loggers, schedule time-consuming work for
    recovery, etc.

    This mechanism is now generalized by the following commit:

    > e360adbe29241a0194e10e20595360dd7b98a2b3
    > Author: Peter Zijlstra
    > Date: Thu Oct 14 14:01:34 2010 +0800
    >
    > irq_work: Add generic hardirq context callbacks
    >
    > Provide a mechanism that allows running code in IRQ context. It is
    > most useful for NMI code that needs to interact with the rest of the
    > system -- like wakeup a task to drain buffers.
    :

    So change to use provided generic mechanism.

    Signed-off-by: Hidetoshi Seto
    Acked-by: Tony Luck
    Link: http://lkml.kernel.org/r/4DEED6B2.6080005@jp.fujitsu.com
    Signed-off-by: Borislav Petkov

    Hidetoshi Seto
     

21 Apr, 2011

1 commit

  • The default notifier doesn't make a lot of sense to call in the
    correctable errors case. Drop it and emit the mcelog decoding
    hint only in the uncorrectable errors case and when no notifier
    is registered. Also, limit issuing the "mcelog --ascii" message
    in the rare case when we dump unreported CEs before panicking.

    While at it, remove unused old x86_mce_decode_callback from the
    header.

    Signed-off-by: Borislav Petkov
    Signed-off-by: Prarit Bhargava
    Cc: Tony Luck
    Cc: Nagananda Chumbalkar
    Cc: Russ Anderson
    Link: http://lkml.kernel.org/r/20110420102349.GB1361@aftab
    Signed-off-by: Ingo Molnar

    Borislav Petkov
     

20 Apr, 2011

1 commit

  • Correctable errors are considered something rather normal on
    modern hardware these days. Even more importantly, correctable
    errors mean exactly that - they've been corrected by the
    hardware - and there's no need to taint the kernel since
    execution hasn't been compromised so far.

    Also, drop tainting in the thermal throttling code for a similar
    reason: crossing a thermal threshold does not mean corruption.

    Signed-off-by: Borislav Petkov
    Acked-by: Tony Luck
    Acked-by: Nagananda Chumbalkar
    Cc: Prarit Bhargava
    Cc: Russ Anderson
    Cc: Linus Torvalds
    Cc: Andrew Morton
    Link: http://lkml.kernel.org/r/1303135222-17118-1-git-send-email-bp@amd64.org
    Signed-off-by: Ingo Molnar

    Borislav Petkov
     

01 Apr, 2011

1 commit

  • The MCE subsystem needs to sample an RCU-protected index outside of
    any protection for that index. If this was a pointer, we would use
    rcu_access_pointer(), but there is no corresponding rcu_access_index().
    This commit therefore creates an rcu_access_index() and applies it
    to MCE.

    Signed-off-by: Paul E. McKenney
    Tested-by: Zdenek Kabelac

    Paul E. McKenney
     

24 Mar, 2011

1 commit

  • Some subsystems in the x86 tree need to carry out suspend/resume and
    shutdown operations with one CPU on-line and interrupts disabled and
    they define sysdev classes and sysdevs or sysdev drivers for this
    purpose. This leads to unnecessarily complicated code and excessive
    memory usage, so switch them to using struct syscore_ops objects for
    this purpose instead.

    Generally, there are three categories of subsystems that use
    sysdevs for implementing PM operations: (1) subsystems whose
    suspend/resume callbacks ignore their arguments entirely (the
    majority), (2) subsystems whose suspend/resume callbacks use their
    struct sys_device argument, but don't really need to do that,
    because they can be implemented differently in an arguably simpler
    way (io_apic.c), and (3) subsystems whose suspend/resume callbacks
    use their struct sys_device argument, but the value of that argument
    is always the same and could be ignored (microcode_core.c). In all
    of these cases the subsystems in question may be readily converted to
    using struct syscore_ops objects for power management and shutdown.

    Signed-off-by: Rafael J. Wysocki
    Reviewed-by: Thomas Gleixner
    Acked-by: Ingo Molnar

    Rafael J. Wysocki
     

18 Mar, 2011

1 commit


30 Dec, 2010

2 commits

  • Replace all uses of current_cpu_data with this_cpu operations on the
    per cpu structure cpu_info. The scala accesses are replaced with the
    matching this_cpu ops which results in smaller and more efficient
    code.

    In the long run, it might be a good idea to remove cpu_data() macro
    too and use per_cpu macro directly.

    tj: updated description

    Cc: Yinghai Lu
    Cc: Ingo Molnar
    Acked-by: H. Peter Anvin
    Acked-by: Tejun Heo
    Signed-off-by: Christoph Lameter
    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • Go through x86 code and replace __get_cpu_var and get_cpu_var
    instances that refer to a scalar and are not used for address
    determinations.

    Cc: Yinghai Lu
    Cc: Ingo Molnar
    Acked-by: Tejun Heo
    Acked-by: "H. Peter Anvin"
    Signed-off-by: Christoph Lameter
    Signed-off-by: Tejun Heo

    Tejun Heo
     

15 Oct, 2010

1 commit

  • All file_operations should get a .llseek operation so we can make
    nonseekable_open the default for future file operations without a
    .llseek pointer.

    The three cases that we can automatically detect are no_llseek, seq_lseek
    and default_llseek. For cases where we can we can automatically prove that
    the file offset is always ignored, we use noop_llseek, which maintains
    the current behavior of not returning an error from a seek.

    New drivers should normally not use noop_llseek but instead use no_llseek
    and call nonseekable_open at open time. Existing drivers can be converted
    to do the same when the maintainer knows for certain that no user code
    relies on calling seek on the device file.

    The generated code is often incorrectly indented and right now contains
    comments that clarify for each added line why a specific variant was
    chosen. In the version that gets submitted upstream, the comments will
    be gone and I will manually fix the indentation, because there does not
    seem to be a way to do that using coccinelle.

    Some amount of new code is currently sitting in linux-next that should get
    the same modifications, which I will do at the end of the merge window.

    Many thanks to Julia Lawall for helping me learn to write a semantic
    patch that does all this.

    ===== begin semantic patch =====
    // This adds an llseek= method to all file operations,
    // as a preparation for making no_llseek the default.
    //
    // The rules are
    // - use no_llseek explicitly if we do nonseekable_open
    // - use seq_lseek for sequential files
    // - use default_llseek if we know we access f_pos
    // - use noop_llseek if we know we don't access f_pos,
    // but we still want to allow users to call lseek
    //
    @ open1 exists @
    identifier nested_open;
    @@
    nested_open(...)
    {

    }

    @ open exists@
    identifier open_f;
    identifier i, f;
    identifier open1.nested_open;
    @@
    int open_f(struct inode *i, struct file *f)
    {

    }

    @ read disable optional_qualifier exists @
    identifier read_f;
    identifier f, p, s, off;
    type ssize_t, size_t, loff_t;
    expression E;
    identifier func;
    @@
    ssize_t read_f(struct file *f, char *p, size_t s, loff_t *off)
    {

    }

    @ read_no_fpos disable optional_qualifier exists @
    identifier read_f;
    identifier f, p, s, off;
    type ssize_t, size_t, loff_t;
    @@
    ssize_t read_f(struct file *f, char *p, size_t s, loff_t *off)
    {
    ... when != off
    }

    @ write @
    identifier write_f;
    identifier f, p, s, off;
    type ssize_t, size_t, loff_t;
    expression E;
    identifier func;
    @@
    ssize_t write_f(struct file *f, const char *p, size_t s, loff_t *off)
    {

    }

    @ write_no_fpos @
    identifier write_f;
    identifier f, p, s, off;
    type ssize_t, size_t, loff_t;
    @@
    ssize_t write_f(struct file *f, const char *p, size_t s, loff_t *off)
    {
    ... when != off
    }

    @ fops0 @
    identifier fops;
    @@
    struct file_operations fops = {
    ...
    };

    @ has_llseek depends on fops0 @
    identifier fops0.fops;
    identifier llseek_f;
    @@
    struct file_operations fops = {
    ...
    .llseek = llseek_f,
    ...
    };

    @ has_read depends on fops0 @
    identifier fops0.fops;
    identifier read_f;
    @@
    struct file_operations fops = {
    ...
    .read = read_f,
    ...
    };

    @ has_write depends on fops0 @
    identifier fops0.fops;
    identifier write_f;
    @@
    struct file_operations fops = {
    ...
    .write = write_f,
    ...
    };

    @ has_open depends on fops0 @
    identifier fops0.fops;
    identifier open_f;
    @@
    struct file_operations fops = {
    ...
    .open = open_f,
    ...
    };

    // use no_llseek if we call nonseekable_open
    ////////////////////////////////////////////
    @ nonseekable1 depends on !has_llseek && has_open @
    identifier fops0.fops;
    identifier nso ~= "nonseekable_open";
    @@
    struct file_operations fops = {
    ... .open = nso, ...
    +.llseek = no_llseek, /* nonseekable */
    };

    @ nonseekable2 depends on !has_llseek @
    identifier fops0.fops;
    identifier open.open_f;
    @@
    struct file_operations fops = {
    ... .open = open_f, ...
    +.llseek = no_llseek, /* open uses nonseekable */
    };

    // use seq_lseek for sequential files
    /////////////////////////////////////
    @ seq depends on !has_llseek @
    identifier fops0.fops;
    identifier sr ~= "seq_read";
    @@
    struct file_operations fops = {
    ... .read = sr, ...
    +.llseek = seq_lseek, /* we have seq_read */
    };

    // use default_llseek if there is a readdir
    ///////////////////////////////////////////
    @ fops1 depends on !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier readdir_e;
    @@
    // any other fop is used that changes pos
    struct file_operations fops = {
    ... .readdir = readdir_e, ...
    +.llseek = default_llseek, /* readdir is present */
    };

    // use default_llseek if at least one of read/write touches f_pos
    /////////////////////////////////////////////////////////////////
    @ fops2 depends on !fops1 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier read.read_f;
    @@
    // read fops use offset
    struct file_operations fops = {
    ... .read = read_f, ...
    +.llseek = default_llseek, /* read accesses f_pos */
    };

    @ fops3 depends on !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier write.write_f;
    @@
    // write fops use offset
    struct file_operations fops = {
    ... .write = write_f, ...
    + .llseek = default_llseek, /* write accesses f_pos */
    };

    // Use noop_llseek if neither read nor write accesses f_pos
    ///////////////////////////////////////////////////////////

    @ fops4 depends on !fops1 && !fops2 && !fops3 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier read_no_fpos.read_f;
    identifier write_no_fpos.write_f;
    @@
    // write fops use offset
    struct file_operations fops = {
    ...
    .write = write_f,
    .read = read_f,
    ...
    +.llseek = noop_llseek, /* read and write both use no f_pos */
    };

    @ depends on has_write && !has_read && !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier write_no_fpos.write_f;
    @@
    struct file_operations fops = {
    ... .write = write_f, ...
    +.llseek = noop_llseek, /* write uses no f_pos */
    };

    @ depends on has_read && !has_write && !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    identifier read_no_fpos.read_f;
    @@
    struct file_operations fops = {
    ... .read = read_f, ...
    +.llseek = noop_llseek, /* read uses no f_pos */
    };

    @ depends on !has_read && !has_write && !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
    identifier fops0.fops;
    @@
    struct file_operations fops = {
    ...
    +.llseek = noop_llseek, /* no read or write fn */
    };
    ===== End semantic patch =====

    Signed-off-by: Arnd Bergmann
    Cc: Julia Lawall
    Cc: Christoph Hellwig

    Arnd Bergmann
     

07 Aug, 2010

2 commits


03 Aug, 2010

1 commit


15 Jun, 2010

1 commit

  • The mce processing applies rcu_dereference_check() to integers used as
    array indices. This patch therefore moves mce to the new RCU API
    rcu_dereference_index_check() that avoids the sparse processing that
    would otherwise result in compiler errors.

    Signed-off-by: Paul E. McKenney
    Cc: Andi Kleen
    Cc: Thomas Gleixner
    Cc: Ingo Molnar
    Cc: "H. Peter Anvin"

    Paul E. McKenney