diff options
| -rw-r--r-- | drivers/mtd/mtdcore.c | 6 | ||||
| -rw-r--r-- | include/linux/gfp.h | 5 | ||||
| -rw-r--r-- | include/trace/events/gfpflags.h | 1 | ||||
| -rw-r--r-- | mm/page_alloc.c | 7 | 
4 files changed, 13 insertions, 6 deletions
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index 374c46dff7d..ec794a72975 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c @@ -1077,7 +1077,8 @@ EXPORT_SYMBOL_GPL(mtd_writev);   * until the request succeeds or until the allocation size falls below   * the system page size. This attempts to make sure it does not adversely   * impact system performance, so when allocating more than one page, we - * ask the memory allocator to avoid re-trying. + * ask the memory allocator to avoid re-trying, swapping, writing back + * or performing I/O.   *   * Note, this function also makes sure that the allocated buffer is aligned to   * the MTD device's min. I/O unit, i.e. the "mtd->writesize" value. @@ -1091,7 +1092,8 @@ EXPORT_SYMBOL_GPL(mtd_writev);   */  void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size)  { -	gfp_t flags = __GFP_NOWARN | __GFP_WAIT | __GFP_NORETRY; +	gfp_t flags = __GFP_NOWARN | __GFP_WAIT | +		       __GFP_NORETRY | __GFP_NO_KSWAPD;  	size_t min_alloc = max_t(size_t, mtd->writesize, PAGE_SIZE);  	void *kbuf; diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 02c1c9710be..d0a79678f16 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -31,6 +31,7 @@ struct vm_area_struct;  #define ___GFP_THISNODE		0x40000u  #define ___GFP_RECLAIMABLE	0x80000u  #define ___GFP_NOTRACK		0x200000u +#define ___GFP_NO_KSWAPD	0x400000u  #define ___GFP_OTHER_NODE	0x800000u  #define ___GFP_WRITE		0x1000000u @@ -85,6 +86,7 @@ struct vm_area_struct;  #define __GFP_RECLAIMABLE ((__force gfp_t)___GFP_RECLAIMABLE) /* Page is reclaimable */  #define __GFP_NOTRACK	((__force gfp_t)___GFP_NOTRACK)  /* Don't track with kmemcheck */ +#define __GFP_NO_KSWAPD	((__force gfp_t)___GFP_NO_KSWAPD)  #define __GFP_OTHER_NODE ((__force gfp_t)___GFP_OTHER_NODE) /* On behalf of other node */  #define __GFP_WRITE	((__force gfp_t)___GFP_WRITE)	/* Allocator intends to dirty page */ @@ -114,7 +116,8 @@ struct vm_area_struct;  				 __GFP_MOVABLE)  #define GFP_IOFS	(__GFP_IO | __GFP_FS)  #define GFP_TRANSHUGE	(GFP_HIGHUSER_MOVABLE | __GFP_COMP | \ -			 __GFP_NOMEMALLOC | __GFP_NORETRY | __GFP_NOWARN) +			 __GFP_NOMEMALLOC | __GFP_NORETRY | __GFP_NOWARN | \ +			 __GFP_NO_KSWAPD)  #ifdef CONFIG_NUMA  #define GFP_THISNODE	(__GFP_THISNODE | __GFP_NOWARN | __GFP_NORETRY) diff --git a/include/trace/events/gfpflags.h b/include/trace/events/gfpflags.h index 9391706e925..d6fd8e5b14b 100644 --- a/include/trace/events/gfpflags.h +++ b/include/trace/events/gfpflags.h @@ -36,6 +36,7 @@  	{(unsigned long)__GFP_RECLAIMABLE,	"GFP_RECLAIMABLE"},	\  	{(unsigned long)__GFP_MOVABLE,		"GFP_MOVABLE"},		\  	{(unsigned long)__GFP_NOTRACK,		"GFP_NOTRACK"},		\ +	{(unsigned long)__GFP_NO_KSWAPD,	"GFP_NO_KSWAPD"},	\  	{(unsigned long)__GFP_OTHER_NODE,	"GFP_OTHER_NODE"}	\  	) : "GFP_NOWAIT" diff --git a/mm/page_alloc.c b/mm/page_alloc.c index bcb72c6e2b2..92871579cbe 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2416,8 +2416,9 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,  		goto nopage;  restart: -	wake_all_kswapd(order, zonelist, high_zoneidx, -					zone_idx(preferred_zone)); +	if (!(gfp_mask & __GFP_NO_KSWAPD)) +		wake_all_kswapd(order, zonelist, high_zoneidx, +						zone_idx(preferred_zone));  	/*  	 * OK, we're below the kswapd watermark and have kicked background @@ -2494,7 +2495,7 @@ rebalance:  	 * system then fail the allocation instead of entering direct reclaim.  	 */  	if ((deferred_compaction || contended_compaction) && -	    (gfp_mask & (__GFP_MOVABLE|__GFP_REPEAT)) == __GFP_MOVABLE) +						(gfp_mask & __GFP_NO_KSWAPD))  		goto nopage;  	/* Try direct reclaim and then allocating */  |