Skip to content
  • Mel Gorman's avatar
    mm: allow PF_MEMALLOC from softirq context · 907aed48
    Mel Gorman authored
    
    
    This is needed to allow network softirq packet processing to make use of
    PF_MEMALLOC.
    
    Currently softirq context cannot use PF_MEMALLOC due to it not being
    associated with a task, and therefore not having task flags to fiddle with
    - thus the gfp to alloc flag mapping ignores the task flags when in
    interrupts (hard or soft) context.
    
    Allowing softirqs to make use of PF_MEMALLOC therefore requires some
    trickery.  This patch borrows the task flags from whatever process happens
    to be preempted by the softirq.  It then modifies the gfp to alloc flags
    mapping to not exclude task flags in softirq context, and modify the
    softirq code to save, clear and restore the PF_MEMALLOC flag.
    
    The save and clear, ensures the preempted task's PF_MEMALLOC flag doesn't
    leak into the softirq.  The restore ensures a softirq's PF_MEMALLOC flag
    cannot leak back into the preempted process.  This should be safe due to
    the following reasons
    
    Softirqs can run on multiple CPUs sure but the same task should not be
    	executing the same softirq code. Neither should the softirq
    	handler be preempted by any other softirq handler so the flags
    	should not leak to an unrelated softirq.
    
    Softirqs re-enable hardware interrupts in __do_softirq() so can be
    	preempted by hardware interrupts so PF_MEMALLOC is inherited
    	by the hard IRQ. However, this is similar to a process in
    	reclaim being preempted by a hardirq. While PF_MEMALLOC is
    	set, gfp_to_alloc_flags() distinguishes between hard and
    	soft irqs and avoids giving a hardirq the ALLOC_NO_WATERMARKS
    	flag.
    
    If the softirq is deferred to ksoftirq then its flags may be used
            instead of a normal tasks but as the softirq cannot be preempted,
            the PF_MEMALLOC flag does not leak to other code by accident.
    
    [davem@davemloft.net: Document why PF_MEMALLOC is safe]
    Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    Signed-off-by: default avatarMel Gorman <mgorman@suse.de>
    Cc: David Miller <davem@davemloft.net>
    Cc: Neil Brown <neilb@suse.de>
    Cc: Mike Christie <michaelc@cs.wisc.edu>
    Cc: Eric B Munson <emunson@mgebm.net>
    Cc: Eric Dumazet <eric.dumazet@gmail.com>
    Cc: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Christoph Lameter <cl@linux.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    907aed48