Re: [PATCH V6 1/4] mm/cma: Add PF flag to force non cma alloc

2019-01-08 Thread Andrea Arcangeli
On Tue, Jan 08, 2019 at 10:21:07AM +0530, Aneesh Kumar K.V wrote:
> This patch add PF_MEMALLOC_NOCMA which make sure any allocation in that 
> context
> is marked non movable and hence cannot be satisfied by CMA region.
> 
> This is useful with get_user_pages_cma_migrate where we take a page pin by
> migrating pages from CMA region. Marking the section PF_MEMALLOC_NOCMA ensures
> that we avoid uncessary page migration later.
> 
> Suggested-by: Andrea Arcangeli 
> Signed-off-by: Aneesh Kumar K.V 

Reviewed-by: Andrea Arcangeli 


[PATCH V6 1/4] mm/cma: Add PF flag to force non cma alloc

2019-01-07 Thread Aneesh Kumar K.V
This patch add PF_MEMALLOC_NOCMA which make sure any allocation in that context
is marked non movable and hence cannot be satisfied by CMA region.

This is useful with get_user_pages_cma_migrate where we take a page pin by
migrating pages from CMA region. Marking the section PF_MEMALLOC_NOCMA ensures
that we avoid uncessary page migration later.

Suggested-by: Andrea Arcangeli 
Signed-off-by: Aneesh Kumar K.V 
---
 include/linux/sched.h|  1 +
 include/linux/sched/mm.h | 36 
 2 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/include/linux/sched.h b/include/linux/sched.h
index 89541d248893..047c8c469774 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1406,6 +1406,7 @@ extern struct pid *cad_pid;
 #define PF_RANDOMIZE   0x0040  /* Randomize virtual address 
space */
 #define PF_SWAPWRITE   0x0080  /* Allowed to write to swap */
 #define PF_MEMSTALL0x0100  /* Stalled due to lack of 
memory */
+#define PF_MEMALLOC_NOCMA  0x0200  /* All allocation request will 
have _GFP_MOVABLE cleared */
 #define PF_NO_SETAFFINITY  0x0400  /* Userland is not allowed to 
meddle with cpus_allowed */
 #define PF_MCE_EARLY   0x0800  /* Early kill for mce process 
policy */
 #define PF_MUTEX_TESTER0x2000  /* Thread belongs to 
the rt mutex tester */
diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h
index 3bfa6a0cbba4..b336e7e2ca49 100644
--- a/include/linux/sched/mm.h
+++ b/include/linux/sched/mm.h
@@ -148,17 +148,24 @@ 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;
+
+   if (current->flags & PF_MEMALLOC_NOCMA)
+   flags &= ~__GFP_MOVABLE;
+   }
return flags;
 }
 
@@ -248,6 +255,19 @@ static inline void memalloc_noreclaim_restore(unsigned int 
flags)
current->flags = (current->flags & ~PF_MEMALLOC) | flags;
 }
 
+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;
+}
+
 #ifdef CONFIG_MEMCG
 /**
  * memalloc_use_memcg - Starts the remote memcg charging scope.
-- 
2.20.1