1. 03 Nov, 2009 6 commits
    • Ian Campbell's avatar
      Correct nr_processes() when CPUs have been unplugged · 1d510750
      Ian Campbell authored
      nr_processes() returns the sum of the per cpu counter process_counts for
      all online CPUs. This counter is incremented for the current CPU on
      fork() and decremented for the current CPU on exit(). Since a process
      does not necessarily fork and exit on the same CPU the process_count for
      an individual CPU can be either positive or negative and effectively has
      no meaning in isolation.
      
      Therefore calculating the sum of process_counts over only the online
      CPUs omits the processes which were started or stopped on any CPU which
      has since been unplugged. Only the sum of process_counts across all
      possible CPUs has meaning.
      
      The only caller of nr_processes() is proc_root_getattr() which
      calculates the number of links to /proc as
              stat->nlink = proc_root.nlink + nr_processes();
      
      You don't have to be all that unlucky for the nr_processes() to return a
      negative value leading to a negative number of links (or rather, an
      apparently enormous number of links). If this happens then you can get
      failures where things like "ls /proc" start to fail because they got an
      -EOVERFLOW from some stat() call.
      
      Example with some debugging inserted to show what goes on:
              # ps haux|wc -l
              nr_processes: CPU0:     90
              nr_processes: CPU1:     1030
              nr_processes: CPU2:     -900
              nr_processes: CPU3:     -136
              nr_processes: TOTAL:    84
              proc_root_getattr. nlink 12 + nr_processes() 84 = 96
              84
              # echo 0 >/sys/devices/system/cpu/cpu1/online
              # ps haux|wc -l
              nr_processes: CPU0:     85
              nr_processes: CPU2:     -901
              nr_processes: CPU3:     -137
              nr_processes: TOTAL:    -953
              proc_root_getattr. nlink 12 + nr_processes() -953 = -941
              75
              # stat /proc/
              nr_processes: CPU0:     84
              nr_processes: CPU2:     -901
              nr_processes: CPU3:     -137
              nr_processes: TOTAL:    -954
              proc_root_getattr. nlink 12 + nr_processes() -954 = -942
                File: `/proc/'
                Size: 0               Blocks: 0          IO Block: 1024   directory
              Device: 3h/3d   Inode: 1           Links: 4294966354
              Access: (0555/dr-xr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
              Access: 2009-11-03 09:06:55.000000000 +0000
              Modify: 2009-11-03 09:06:55.000000000 +0000
              Change: 2009-11-03 09:06:55.000000000 +0000
      
      I'm not 100% convinced that the per_cpu regions remain valid for offline
      CPUs, although my testing suggests that they do. If not then I think the
      correct solution would be to aggregate the process_count for a given CPU
      into a global base value in cpu_down().
      
      This bug appears to pre-date the transition to git and it looks like it
      may even have been present in linux-2.6.0-test7-bk3 since it looks like
      the code Rusty patched in http://lwn.net/Articles/64773/
      
       was already
      wrong.
      
      Signed-off-by: default avatarIan Campbell <ian.campbell@citrix.com>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Cc: Rusty Russell <rusty@rustcorp.com.au>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      1d510750
    • Linus Torvalds's avatar
      Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input · 1c211849
      Linus Torvalds authored
      * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
        Input: gpio-keys - use IRQF_SHARED
        Input: winbond-cir - select LEDS_TRIGGERS
        Input: i8042 - try to get stable CTR value when initializing
        Input: atkbd - add a quirk for OQO 01+ multimedia keys
      1c211849
    • Linus Torvalds's avatar
      Merge branch 'fixes-s3c-2632-rc5' of git://git.fluff.org/bjdooks/linux · fcef24d3
      Linus Torvalds authored
      * 'fixes-s3c-2632-rc5' of git://git.fluff.org/bjdooks/linux:
        ARM: S3C2410: Fix sparse warnings in arch/arm/mach-s3c2410/gpio.c
        ARM: S3C2440: mini2440: Fix spare warnings
        ARM: S3C24XX: Fix warnings in arch/arm/plat-s3c24xx/gpio.c
        ARM: S3C2440: mini2440: Fix missing CONFIG_S3C_DEV_USB_HOST
        ARM: S3C24XX: arch/arm/plat-s3c24xx: Move dereference after NULL test
        ARM: S3C: Fix adc function exports
        ARM: S3C2410: Fix link if CONFIG_S3C2410_IOTIMING is not set
        ARM: S3C24XX: Introduce S3C2442B CPU
        ARM: S3C24XX: Define a macro to avoid compilation error
        ARM: S3C: Add info for supporting circular DMA buffers
        ARM: S3C64XX: Set rate of crystal mux
        ARM: S3C64XX: Fix S3C64XX_CLKDIV0_ARM_MASK value
      fcef24d3
    • Linus Torvalds's avatar
      Merge branch 'i2c-fixes' of git://git.fluff.org/bjdooks/linux · 78e1e340
      Linus Torvalds authored
      * 'i2c-fixes' of git://git.fluff.org/bjdooks/linux:
        i2c-mpc: Do not generate STOP after read.
        i2c: imx: disable clock when it's possible to save power.
        i2c: imx: only imx1 needs disable delay
        i2c: imx: check busy bit when START/STOP
      78e1e340
    • Linus Torvalds's avatar
      Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2 · 1cec2cde
      Linus Torvalds authored
      * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2:
        nilfs2: add zero-fill for new btree node buffers
        nilfs2: fix irregular checkpoint creation due to data flush
        nilfs2: fix dirty page accounting leak causing hang at write
      1cec2cde
    • Linus Torvalds's avatar
      Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 · a84216e6
      Linus Torvalds authored
      * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (21 commits)
        mac80211: check interface is down before type change
        cfg80211: fix NULL ptr deref
        libertas if_usb: Fix crash on 64-bit machines
        mac80211: fix reason code output endianness
        mac80211: fix addba timer
        ath9k: fix misplaced semicolon on rate control
        b43: Fix DMA TX bounce buffer copying
        mac80211: fix BSS leak
        rt73usb.c : more ids
        ipw2200: fix oops on missing firmware
        gre: Fix dev_addr clobbering for gretap
        sky2: set carrier off in probe
        net: fix sk_forward_alloc corruption
        pcnet_cs: add cis of PreMax PE-200 ethernet pcmcia card
        r8169: Fix card drop incoming VLAN tagged MTU byte large jumbo frames
        ibmtr: possible Read buffer overflow?
        net: Fix RPF to work with policy routing
        net: fix kmemcheck annotations
        e1000e: rework disable K1 at 1000Mbps for 82577/82578
        e1000e: config PHY via software after resets
        ...
      a84216e6
  2. 02 Nov, 2009 34 commits