diff options
Diffstat (limited to 'include/linux/sched/mm.h')
| -rw-r--r-- | include/linux/sched/mm.h | 48 | 
1 files changed, 40 insertions, 8 deletions
diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h index 3bfa6a0cbba4..0cd9f10423fb 100644 --- a/include/linux/sched/mm.h +++ b/include/linux/sched/mm.h @@ -148,17 +148,25 @@ static inline bool in_vfork(struct task_struct *tsk)   * Applies per-task gfp context to the given allocation flags.   * PF_MEMALLOC_NOIO implies GFP_NOIO   * PF_MEMALLOC_NOFS implies GFP_NOFS + * PF_MEMALLOC_NOCMA implies no allocation from CMA region.   */  static inline gfp_t current_gfp_context(gfp_t flags)  { -	/* -	 * NOIO implies both NOIO and NOFS and it is a weaker context -	 * so always make sure it makes precedence -	 */ -	if (unlikely(current->flags & PF_MEMALLOC_NOIO)) -		flags &= ~(__GFP_IO | __GFP_FS); -	else if (unlikely(current->flags & PF_MEMALLOC_NOFS)) -		flags &= ~__GFP_FS; +	if (unlikely(current->flags & +		     (PF_MEMALLOC_NOIO | PF_MEMALLOC_NOFS | PF_MEMALLOC_NOCMA))) { +		/* +		 * NOIO implies both NOIO and NOFS and it is a weaker context +		 * so always make sure it makes precedence +		 */ +		if (current->flags & PF_MEMALLOC_NOIO) +			flags &= ~(__GFP_IO | __GFP_FS); +		else if (current->flags & PF_MEMALLOC_NOFS) +			flags &= ~__GFP_FS; +#ifdef CONFIG_CMA +		if (current->flags & PF_MEMALLOC_NOCMA) +			flags &= ~__GFP_MOVABLE; +#endif +	}  	return flags;  } @@ -248,6 +256,30 @@ static inline void memalloc_noreclaim_restore(unsigned int flags)  	current->flags = (current->flags & ~PF_MEMALLOC) | flags;  } +#ifdef CONFIG_CMA +static inline unsigned int memalloc_nocma_save(void) +{ +	unsigned int flags = current->flags & PF_MEMALLOC_NOCMA; + +	current->flags |= PF_MEMALLOC_NOCMA; +	return flags; +} + +static inline void memalloc_nocma_restore(unsigned int flags) +{ +	current->flags = (current->flags & ~PF_MEMALLOC_NOCMA) | flags; +} +#else +static inline unsigned int memalloc_nocma_save(void) +{ +	return 0; +} + +static inline void memalloc_nocma_restore(unsigned int flags) +{ +} +#endif +  #ifdef CONFIG_MEMCG  /**   * memalloc_use_memcg - Starts the remote memcg charging scope.  |