1. 12 Feb, 2015 4 commits
  2. 10 Jan, 2015 32 commits
  3. 09 Jan, 2015 1 commit
    • Linus Torvalds's avatar
      Merge branch 'akpm' (patches from Andrew) · b3d574ae
      Linus Torvalds authored
      Merge misc fixes from Andrew Morton:
       "12 fixes"
      
      * emailed patches from Andrew Morton <akpm@linux-foundation.org>:
        mm, vmscan: prevent kswapd livelock due to pfmemalloc-throttled process being killed
        memcg: fix destination cgroup leak on task charges migration
        mm: memcontrol: switch soft limit default back to infinity
        mm/debug_pagealloc: remove obsolete Kconfig options
        vfs: renumber FMODE_NONOTIFY and add to uniqueness check
        arch/blackfin/mach-bf533/boards/stamp.c: add linux/delay.h
        ocfs2: fix the wrong directory passed to ocfs2_lookup_ino_from_name() when link file
        MAINTAINERS: update rydberg's addresses
        mm: protect set_page_dirty() from ongoing truncation
        mm: prevent endless growth of anon_vma hierarchy
        exit: fix race between wait_consider_task() and wait_task_zombie()
        ocfs2: remove bogus check in dlm_process_recovery_data
      b3d574ae
  4. 08 Jan, 2015 3 commits
    • Vlastimil Babka's avatar
      mm, vmscan: prevent kswapd livelock due to pfmemalloc-throttled process being killed · 9e5e3661
      Vlastimil Babka authored
      Charles Shirron and Paul Cassella from Cray Inc have reported kswapd
      stuck in a busy loop with nothing left to balance, but
      kswapd_try_to_sleep() failing to sleep.  Their analysis found the cause
      to be a combination of several factors:
      
      1. A process is waiting in throttle_direct_reclaim() on pgdat->pfmemalloc_wait
      
      2. The process has been killed (by OOM in this case), but has not yet been
         scheduled to remove itself from the waitqueue and die.
      
      3. kswapd checks for throttled processes in prepare_kswapd_sleep():
      
              if (waitqueue_active(&pgdat->pfmemalloc_wait)) {
                      wake_up(&pgdat->pfmemalloc_wait);
      		return false; // kswapd will not go to sleep
      	}
      
         However, for a process that was already killed, wake_up() does not remove
         the process from the waitqueue, since try_to_wake_up() checks its state
         first and returns false when the process is no longer waiting.
      
      4. kswapd is running on the same CPU as the only CPU that the process is
         allowed to run on (through cpus_allowed, or possibly single-cpu system).
      
      5. CONFIG_PREEMPT_NONE=y kernel is used. If there's nothing to balance, kswapd
         encounters no voluntary preemption points and repeatedly fails
         prepare_kswapd_sleep(), blocking the process from running and removing
         itself from the waitqueue, which would let kswapd sleep.
      
      So, the source of the problem is that we prevent kswapd from going to
      sleep until there are processes waiting on the pfmemalloc_wait queue,
      and a process waiting on a queue is guaranteed to be removed from the
      queue only when it gets scheduled.  This was done to make sure that no
      process is left sleeping on pfmemalloc_wait when kswapd itself goes to
      sleep.
      
      However, it isn't necessary to postpone kswapd sleep until the
      pfmemalloc_wait queue actually empties.  To prevent processes from being
      left sleeping, it's actually enough to guarantee that all processes
      waiting on pfmemalloc_wait queue have been woken up by the time we put
      kswapd to sleep.
      
      This patch therefore fixes this issue by substituting 'wake_up' with
      'wake_up_all' and removing 'return false' in the code snippet from
      prepare_kswapd_sleep() above.  Note that if any process puts itself in
      the queue after this waitqueue_active() check, or after the wake up
      itself, it means that the process will also wake up kswapd - and since
      we are under prepare_to_wait(), the wake up won't be missed.  Also we
      update the comment prepare_kswapd_sleep() to hopefully more clearly
      describe the races it is preventing.
      
      Fixes: 5515061d ("mm: throttle direct reclaimers if PF_MEMALLOC reserves are low and swap is backed by network storage")
      Signed-off-by: default avatarVlastimil Babka <vbabka@suse.cz>
      Signed-off-by: default avatarVladimir Davydov <vdavydov@parallels.com>
      Cc: Mel Gorman <mgorman@suse.de>
      Cc: Johannes Weiner <hannes@cmpxchg.org>
      Acked-by: default avatarMichal Hocko <mhocko@suse.cz>
      Acked-by: default avatarRik van Riel <riel@redhat.com>
      Cc: <stable@vger.kernel.org>	[3.6+]
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      9e5e3661
    • Vladimir Davydov's avatar
      memcg: fix destination cgroup leak on task charges migration · 4bdfc1c4
      Vladimir Davydov authored
      We are supposed to take one css reference per each memory page and per
      each swap entry accounted to a memory cgroup.  However, during task
      charges migration we take a reference to the destination cgroup twice
      per each swap entry: first in mem_cgroup_do_precharge()->try_charge()
      and then in mem_cgroup_move_swap_account(), permanently leaking the
      destination cgroup.
      
      The hunk taking the second reference seems to be a leftover from the
      pre-00501b53 ("mm: memcontrol: rewrite charge API") era.  Remove it
      to fix the leak.
      
      Fixes: e8ea14cc (mm: memcontrol: take a css reference for each charged page)
      Signed-off-by: default avatarVladimir Davydov <vdavydov@parallels.com>
      Cc: Johannes Weiner <hannes@cmpxchg.org>
      Acked-by: default avatarMichal Hocko <mhocko@suse.cz>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      4bdfc1c4
    • Johannes Weiner's avatar
      mm: memcontrol: switch soft limit default back to infinity · 24d404dc
      Johannes Weiner authored
      Commit 3e32cb2e ("mm: memcontrol: lockless page counters")
      accidentally switched the soft limit default from infinity to zero,
      which turns all memcgs with even a single page into soft limit excessors
      and engages soft limit reclaim on all of them during global memory
      pressure.  This makes global reclaim generally more aggressive, but also
      inverts the meaning of existing soft limit configurations where unset
      soft limits are usually more generous than set ones.
      Signed-off-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
      Acked-by: default avatarMichal Hocko <mhocko@suse.cz>
      Acked-by: default avatarVladimir Davydov <vdavydov@parallels.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      24d404dc