1. 03 Feb, 2012 27 commits
  2. 26 Jan, 2012 13 commits
    • Greg Kroah-Hartman's avatar
      Linux 3.2.2 · 3499d642
      Greg Kroah-Hartman authored
      3499d642
    • Hugh Dickins's avatar
      SHM_UNLOCK: fix Unevictable pages stranded after swap · 4556a6d9
      Hugh Dickins authored
      commit 24513264 upstream.
      
      Commit cc39c6a9 ("mm: account skipped entries to avoid looping in
      find_get_pages") correctly fixed an infinite loop; but left a problem
      that find_get_pages() on shmem would return 0 (appearing to callers to
      mean end of tree) when it meets a run of nr_pages swap entries.
      
      The only uses of find_get_pages() on shmem are via pagevec_lookup(),
      called from invalidate_mapping_pages(), and from shmctl SHM_UNLOCK's
      scan_mapping_unevictable_pages().  The first is already commented, and
      not worth worrying about; but the second can leave pages on the
      Unevictable list after an unusual sequence of swapping and locking.
      
      Fix that by using shmem_find_get_pages_and_swap() (then ignoring the
      swap) instead of pagevec_lookup().
      
      But I don't want to contaminate vmscan.c with shmem internals, nor
      shmem.c with LRU locking.  So move scan_mapping_unevictable_pages() into
      shmem.c, renaming it shmem_unlock_mapping(); and rename
      check_move_unevictable_page() to check_move_unevictable_pages(), looping
      down an array of pages, oftentimes under the same lock.
      
      Leave out the "rotate unevictable list" block: that's a leftover from
      when this was used for /proc/sys/vm/scan_unevictable_pages, whose flawed
      handling involved looking at pages at tail of LRU.
      
      Was there significance to the sequence first ClearPageUnevictable, then
      test page_evictable, then SetPageUnevictable here? I think not, we're
      under LRU lock, and have no barriers between those.
      Signed-off-by: default avatarHugh Dickins <hughd@google.com>
      Reviewed-by: default avatarKOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
      Cc: Minchan Kim <minchan.kim@gmail.com>
      Cc: Rik van Riel <riel@redhat.com>
      Cc: Shaohua Li <shaohua.li@intel.com>
      Cc: Eric Dumazet <eric.dumazet@gmail.com>
      Cc: Johannes Weiner <hannes@cmpxchg.org>
      Cc: Michel Lespinasse <walken@google.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
      
      4556a6d9
    • Hugh Dickins's avatar
      SHM_UNLOCK: fix long unpreemptible section · 2a4073c2
      Hugh Dickins authored
      commit 85046579 upstream.
      
      scan_mapping_unevictable_pages() is used to make SysV SHM_LOCKed pages
      evictable again once the shared memory is unlocked.  It does this with
      pagevec_lookup()s across the whole object (which might occupy most of
      memory), and takes 300ms to unlock 7GB here.  A cond_resched() every
      PAGEVEC_SIZE pages would be good.
      
      However, KOSAKI-san points out that this is called under shmem.c's
      info->lock, and it's also under shm.c's shm_lock(), both spinlocks.
      There is no strong reason for that: we need to take these pages off the
      unevictable list soonish, but those locks are not required for it.
      
      So move the call to scan_mapping_unevictable_pages() from shmem.c's
      unlock handling up to shm.c's unlock handling.  Remove the recently
      added barrier, not needed now we have spin_unlock() before the scan.
      
      Use get_file(), with subsequent fput(), to make sure we have a reference
      to mapping throughout scan_mapping_unevictable_pages(): that's something
      that was previously guaranteed by the shm_lock().
      
      Remove shmctl's lru_add_drain_all(): we don't fault in pages at SHM_LOCK
      time, and we lazily discover them to be Unevictable later, so it serves
      no purpose for SHM_LOCK; and serves no purpose for SHM_UNLOCK, since
      pages still on pagevec are not marked Unevictable.
      
      The original code avoided redundant rescans by checking VM_LOCKED flag
      at its level: now avoid them by checking shp's SHM_LOCKED.
      
      The original code called scan_mapping_unevictable_pages() on a locked
      area at shm_destroy() time: perhaps we once had accounting cross-checks
      which required that, but not now, so skip the overhead and just let
      inode eviction deal with them.
      
      Put check_move_unevictable_page() and scan_mapping_unevictable_pages()
      under CONFIG_SHMEM (with stub for the TINY case when ramfs is used),
      more as comment than to save space; comment them used for SHM_UNLOCK.
      Signed-off-by: default avatarHugh Dickins <hughd@google.com>
      Reviewed-by: default avatarKOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
      Cc: Minchan Kim <minchan.kim@gmail.com>
      Cc: Rik van Riel <riel@redhat.com>
      Cc: Shaohua Li <shaohua.li@intel.com>
      Cc: Eric Dumazet <eric.dumazet@gmail.com>
      Cc: Johannes Weiner <hannes@cmpxchg.org>
      Cc: Michel Lespinasse <walken@google.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
      2a4073c2
    • Stanislaw Gruszka's avatar
      iwlegacy: 3945: fix hw passive scan on radar channels · 671f9c9e
      Stanislaw Gruszka authored
      commit 68acc4af upstream.
      
      Patch fix firmware error on "iw dev wlan0 scan passive" for
      hardware scanning (with disable_hw_scan=0 module parameter).
      
       iwl3945 0000:03:00.0: Microcode SW error detected. Restarting 0x82000008.
       iwl3945 0000:03:00.0: Loaded firmware version: 15.32.2.9
       iwl3945 0000:03:00.0: Start IWL Error Log Dump:
       iwl3945 0000:03:00.0: Status: 0x0002A2E4, count: 1
       iwl3945 0000:03:00.0: Desc       Time       asrtPC blink2 ilink1  nmiPC   Line
       iwl3945 0000:03:00.0: SYSASSERT     (0x5) 0041263900 0x13756 0x0031C 0x00000 764
       iwl3945 0000:03:00.0: Error Reply type 0x000002FC cmd C_SCAN (0x80) seq 0x443E ser 0x00340000
       iwl3945 0000:03:00.0: Command C_SCAN failed: FW Error
       iwl3945 0000:03:00.0: Can't stop Rx DMA.
      
      We have disable ability to change passive scanning to active on
      particular channel when traffic is detected on that channel. Otherwise
      firmware will report error, when we try to do passive scan on radar
      channels.
      Reported-and-debugged-by: default avatarPedro Francisco <pedrogfrancisco@gmail.com>
      Signed-off-by: default avatarStanislaw Gruszka <sgruszka@redhat.com>
      Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
      671f9c9e
    • Wey-Yi Guy's avatar
      iwlagn: check for SMPS mode · fd7c0921
      Wey-Yi Guy authored
      commit b2ccccdc upstream.
      
      Check and report WARN only when its invalid
      
      Resolves:
      https://bugzilla.kernel.org/show_bug.cgi?id=42621
      https://bugzilla.redhat.com/show_bug.cgi?id=766071Signed-off-by: default avatarWey-Yi Guy <wey-yi.w.guy@intel.com>
      Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
      fd7c0921
    • Michal Hocko's avatar
      mm: fix NULL ptr dereference in __count_immobile_pages · 3a508e6e
      Michal Hocko authored
      commit 687875fb upstream.
      
      Fix the following NULL ptr dereference caused by
      
        cat /sys/devices/system/memory/memory0/removable
      
      Pid: 13979, comm: sed Not tainted 3.0.13-0.5-default #1 IBM BladeCenter LS21 -[7971PAM]-/Server Blade
      RIP: __count_immobile_pages+0x4/0x100
      Process sed (pid: 13979, threadinfo ffff880221c36000, task ffff88022e788480)
      Call Trace:
        is_pageblock_removable_nolock+0x34/0x40
        is_mem_section_removable+0x74/0xf0
        show_mem_removable+0x41/0x70
        sysfs_read_file+0xfe/0x1c0
        vfs_read+0xc7/0x130
        sys_read+0x53/0xa0
        system_call_fastpath+0x16/0x1b
      
      We are crashing because we are trying to dereference NULL zone which
      came from pfn=0 (struct page ffffea0000000000). According to the boot
      log this page is marked reserved:
      e820 update range: 0000000000000000 - 0000000000010000 (usable) ==> (reserved)
      
      and early_node_map confirms that:
      early_node_map[3] active PFN ranges
          1: 0x00000010 -> 0x0000009c
          1: 0x00000100 -> 0x000bffa3
          1: 0x00100000 -> 0x00240000
      
      The problem is that memory_present works in PAGE_SECTION_MASK aligned
      blocks so the reserved range sneaks into the the section as well.  This
      also means that free_area_init_node will not take care of those reserved
      pages and they stay uninitialized.
      
      When we try to read the removable status we walk through all available
      sections and hope that the zone is valid for all pages in the section.
      But this is not true in this case as the zone and nid are not initialized.
      
      We have only one node in this particular case and it is marked as node=1
      (rather than 0) and that made the problem visible because page_to_nid will
      return 0 and there are no zones on the node.
      
      Let's check that the zone is valid and that the given pfn falls into its
      boundaries and mark the section not removable.  This might cause some
      false positives, probably, but we do not have any sane way to find out
      whether the page is reserved by the platform or it is just not used for
      whatever other reasons.
      Signed-off-by: default avatarMichal Hocko <mhocko@suse.cz>
      Acked-by: default avatarMel Gorman <mgorman@suse.de>
      Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
      Cc: Andrea Arcangeli <aarcange@redhat.com>
      Cc: David Rientjes <rientjes@google.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
      3a508e6e
    • Will Deacon's avatar
      proc: clear_refs: do not clear reserved pages · bd1dc8b1
      Will Deacon authored
      commit 85e72aa5 upstream.
      
      /proc/pid/clear_refs is used to clear the Referenced and YOUNG bits for
      pages and corresponding page table entries of the task with PID pid, which
      includes any special mappings inserted into the page tables in order to
      provide things like vDSOs and user helper functions.
      
      On ARM this causes a problem because the vectors page is mapped as a
      global mapping and since ec706dab ("ARM: add a vma entry for the user
      accessible vector page"), a VMA is also inserted into each task for this
      page to aid unwinding through signals and syscall restarts.  Since the
      vectors page is required for handling faults, clearing the YOUNG bit (and
      subsequently writing a faulting pte) means that we lose the vectors page
      *globally* and cannot fault it back in.  This results in a system deadlock
      on the next exception.
      
      To see this problem in action, just run:
      
      	$ echo 1 > /proc/self/clear_refs
      
      on an ARM platform (as any user) and watch your system hang.  I think this
      has been the case since 2.6.37
      
      This patch avoids clearing the aforementioned bits for reserved pages,
      therefore leaving the vectors page intact on ARM.  Since reserved pages
      are not candidates for swap, this change should not have any impact on the
      usefulness of clear_refs.
      Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
      Reported-by: default avatarMoussa Ba <moussaba@micron.com>
      Acked-by: default avatarHugh Dickins <hughd@google.com>
      Cc: David Rientjes <rientjes@google.com>
      Cc: Russell King <rmk@arm.linux.org.uk>
      Acked-by: default avatarNicolas Pitre <nico@linaro.org>
      Cc: Matt Mackall <mpm@selenic.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
      bd1dc8b1
    • Ananth N Mavinakayanahalli's avatar
      kprobes: initialize before using a hlist · 6ee7663e
      Ananth N Mavinakayanahalli authored
      commit d496aab5 upstream.
      
      Commit ef53d9c5 ("kprobes: improve kretprobe scalability with hashed
      locking") introduced a bug where we can potentially leak
      kretprobe_instances since we initialize a hlist head after having used
      it.
      
      Initialize the hlist head before using it.
      
      Reported by: Jim Keniston <jkenisto@us.ibm.com>
      Acked-by: default avatarJim Keniston <jkenisto@us.ibm.com>
      Signed-off-by: default avatarAnanth N Mavinakayanahalli <ananth@in.ibm.com>
      Acked-by: default avatarMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
      Cc: Srinivasa D S <srinivasa@in.ibm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
      6ee7663e
    • Jeff Layton's avatar
      cifs: lower default wsize when unix extensions are not used · bdac3a10
      Jeff Layton authored
      commit ce91acb3 upstream.
      
      We've had some reports of servers (namely, the Solaris in-kernel CIFS
      server) that don't deal properly with writes that are "too large" even
      though they set CAP_LARGE_WRITE_ANDX. Change the default to better
      mirror what windows clients do.
      
      Cc: Pavel Shilovsky <piastry@etersoft.ru>
      Reported-by: default avatarNick Davis <phireph0x@yahoo.com>
      Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
      Signed-off-by: default avatarSteve French <smfrench@gmail.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
      bdac3a10
    • Dan Rosenberg's avatar
      score: fix off-by-one index into syscall table · 5f497271
      Dan Rosenberg authored
      commit c25a785d upstream.
      
      If the provided system call number is equal to __NR_syscalls, the
      current check will pass and a function pointer just after the system
      call table may be called, since sys_call_table is an array with total
      size __NR_syscalls.
      
      Whether or not this is a security bug depends on what the compiler puts
      immediately after the system call table.  It's likely that this won't do
      anything bad because there is an additional NULL check on the syscall
      entry, but if there happens to be a non-NULL value immediately after the
      system call table, this may result in local privilege escalation.
      Signed-off-by: default avatarDan Rosenberg <drosenberg@vsecurity.com>
      Cc: Chen Liqin <liqin.chen@sunplusct.com>
      Cc: Lennox Wu <lennox.wu@gmail.com>
      Cc: Eugene Teo <eugeneteo@kernel.sg>
      Cc: Arnd Bergmann <arnd@arndb.de>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
      5f497271
    • Toshiharu Okada's avatar
      i2c-eg20t: modified the setting of transfer rate. · 8d738500
      Toshiharu Okada authored
      commit ff35e8b1 upstream.
      
      This patch modified the setting value of
      I2C Bus Transfer Rate Setting Counter regisrer.
      Signed-off-by: default avatarToshiharu Okada <toshiharu-linux@dsn.okisemi.com>
      Signed-off-by: default avatarBen Dooks <ben-linux@fluff.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
      8d738500
    • Dave Chinner's avatar
      xfs: fix endian conversion issue in discard code · afa2f5f8
      Dave Chinner authored
      commit b1c770c2 upstream
      
      When finding the longest extent in an AG, we read the value directly
      out of the AGF buffer without endian conversion. This will give an
      incorrect length, resulting in FITRIM operations potentially not
      trimming everything that it should.
      Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
      Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarBen Myers <bpm@sgi.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
      afa2f5f8
    • Stanislaw Gruszka's avatar
      rt2800pci: fix spurious interrupts generation · e9651ec2
      Stanislaw Gruszka authored
      commit dfd00c4c upstream.
      
      Same devices can generate interrupt without properly setting bit in
      INT_SOURCE_CSR register (spurious interrupt), what will cause IRQ line
      will be disabled by interrupts controller driver.
      
      We discovered that clearing INT_MASK_CSR stops such behaviour. We
      previously first read that register, and then clear all know interrupt
      sources bits and do not touch reserved bits. After this patch, we write
      to all register content (I believe writing to reserved bits on that
      register will not cause any problems, I tested that on my rt2800pci
      device).
      
      This fix very bad performance problem, practically making device
      unusable (since worked without interrupts), reported in:
      https://bugzilla.redhat.com/show_bug.cgi?id=658451
      
      We previously tried to workaround that issue in commit
      4ba7d999 "rt2800pci: handle spurious
      interrupts", but it was reverted in commit
      82e5fc2a
      as thing, that will prevent to detect real spurious interrupts.
      Reported-and-tested-by: default avatarAmir Hedayaty <hedayaty@gmail.com>
      Signed-off-by: default avatarStanislaw Gruszka <sgruszka@redhat.com>
      Acked-by: default avatarGertjan van Wingerde <gwingerde@gmail.com>
      Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
      e9651ec2