Message ID | 20201211202140.396852-3-pasha.tatashin@soleen.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | prohibit pinning pages in ZONE_MOVABLE | expand |
On Fri 11-12-20 15:21:36, Pavel Tatashin wrote: > PF_MEMALLOC_NOCMA is used ot guarantee that the allocator will not return > pages that might belong to CMA region. This is currently used for long > term gup to make sure that such pins are not going to be done on any CMA > pages. > > When PF_MEMALLOC_NOCMA has been introduced we haven't realized that it is > focusing on CMA pages too much and that there is larger class of pages that > need the same treatment. MOVABLE zone cannot contain any long term pins as > well so it makes sense to reuse and redefine this flag for that usecase as > well. Rename the flag to PF_MEMALLOC_PIN which defines an allocation > context which can only get pages suitable for long-term pins. > > Also re-name: > memalloc_nocma_save()/memalloc_nocma_restore > to > memalloc_pin_save()/memalloc_pin_restore() > and make the new functions common. > > Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com> > Reviewed-by: John Hubbard <jhubbard@nvidia.com> Acked-by: Michal Hocko <mhocko@suse.com> with one comment below [...] > --- a/include/linux/sched.h > +++ b/include/linux/sched.h > @@ -1576,7 +1576,7 @@ extern struct pid *cad_pid; > #define PF_SWAPWRITE 0x00800000 /* Allowed to write to swap */ > #define PF_NO_SETAFFINITY 0x04000000 /* Userland is not allowed to meddle with cpus_mask */ > #define PF_MCE_EARLY 0x08000000 /* Early kill for mce process policy */ > -#define PF_MEMALLOC_NOCMA 0x10000000 /* All allocation request will have _GFP_MOVABLE cleared */ > +#define PF_MEMALLOC_PIN 0x10000000 /* All allocation request will have _GFP_MOVABLE cleared */ This comment is not really helpeful. I would go with /* Allocation context constrained to zones which allow long term * pinning. */ Something similar would be useful for memalloc_pin* functions as well.
On Mon, Dec 14, 2020 at 9:03 AM Michal Hocko <mhocko@suse.com> wrote: > > On Fri 11-12-20 15:21:36, Pavel Tatashin wrote: > > PF_MEMALLOC_NOCMA is used ot guarantee that the allocator will not return > > pages that might belong to CMA region. This is currently used for long > > term gup to make sure that such pins are not going to be done on any CMA > > pages. > > > > When PF_MEMALLOC_NOCMA has been introduced we haven't realized that it is > > focusing on CMA pages too much and that there is larger class of pages that > > need the same treatment. MOVABLE zone cannot contain any long term pins as > > well so it makes sense to reuse and redefine this flag for that usecase as > > well. Rename the flag to PF_MEMALLOC_PIN which defines an allocation > > context which can only get pages suitable for long-term pins. > > > > Also re-name: > > memalloc_nocma_save()/memalloc_nocma_restore > > to > > memalloc_pin_save()/memalloc_pin_restore() > > and make the new functions common. > > > > Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com> > > Reviewed-by: John Hubbard <jhubbard@nvidia.com> > > Acked-by: Michal Hocko <mhocko@suse.com> Thank you. > > with one comment below > [...] > > --- a/include/linux/sched.h > > +++ b/include/linux/sched.h > > @@ -1576,7 +1576,7 @@ extern struct pid *cad_pid; > > #define PF_SWAPWRITE 0x00800000 /* Allowed to write to swap */ > > #define PF_NO_SETAFFINITY 0x04000000 /* Userland is not allowed to meddle with cpus_mask */ > > #define PF_MCE_EARLY 0x08000000 /* Early kill for mce process policy */ > > -#define PF_MEMALLOC_NOCMA 0x10000000 /* All allocation request will have _GFP_MOVABLE cleared */ > > +#define PF_MEMALLOC_PIN 0x10000000 /* All allocation request will have _GFP_MOVABLE cleared */ > > This comment is not really helpeful. I would go with > /* Allocation context constrained to zones which allow long term > * pinning. > */ > > Something similar would be useful for memalloc_pin* functions as well. I will add it. > -- > Michal Hocko > SUSE Labs
diff --git a/include/linux/sched.h b/include/linux/sched.h index e5ad6d354b7b..f3226ef7134f 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1576,7 +1576,7 @@ extern struct pid *cad_pid; #define PF_SWAPWRITE 0x00800000 /* Allowed to write to swap */ #define PF_NO_SETAFFINITY 0x04000000 /* Userland is not allowed to meddle with cpus_mask */ #define PF_MCE_EARLY 0x08000000 /* Early kill for mce process policy */ -#define PF_MEMALLOC_NOCMA 0x10000000 /* All allocation request will have _GFP_MOVABLE cleared */ +#define PF_MEMALLOC_PIN 0x10000000 /* All allocation request will have _GFP_MOVABLE cleared */ #define PF_FREEZER_SKIP 0x40000000 /* Freezer should not count it as freezable */ #define PF_SUSPEND_TASK 0x80000000 /* This thread called freeze_processes() and should not be frozen */ diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h index 1ae08b8462a4..5f4dd3274734 100644 --- a/include/linux/sched/mm.h +++ b/include/linux/sched/mm.h @@ -270,29 +270,18 @@ 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) +static inline unsigned int memalloc_pin_save(void) { - unsigned int flags = current->flags & PF_MEMALLOC_NOCMA; + unsigned int flags = current->flags & PF_MEMALLOC_PIN; - current->flags |= PF_MEMALLOC_NOCMA; + current->flags |= PF_MEMALLOC_PIN; return flags; } -static inline void memalloc_nocma_restore(unsigned int flags) +static inline void memalloc_pin_restore(unsigned int flags) { - current->flags = (current->flags & ~PF_MEMALLOC_NOCMA) | flags; + current->flags = (current->flags & ~PF_MEMALLOC_PIN) | 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 DECLARE_PER_CPU(struct mem_cgroup *, int_active_memcg); diff --git a/mm/gup.c b/mm/gup.c index 87452fcad048..007060e66a48 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -1671,7 +1671,7 @@ static long __gup_longterm_locked(struct mm_struct *mm, long rc; if (gup_flags & FOLL_LONGTERM) - flags = memalloc_nocma_save(); + flags = memalloc_pin_save(); rc = __get_user_pages_locked(mm, start, nr_pages, pages, vmas, NULL, gup_flags); @@ -1680,7 +1680,7 @@ static long __gup_longterm_locked(struct mm_struct *mm, if (rc > 0) rc = check_and_migrate_cma_pages(mm, start, rc, pages, vmas, gup_flags); - memalloc_nocma_restore(flags); + memalloc_pin_restore(flags); } return rc; } diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 3bcc0bc7e02a..012246234eb5 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -1033,10 +1033,10 @@ static void enqueue_huge_page(struct hstate *h, struct page *page) static struct page *dequeue_huge_page_node_exact(struct hstate *h, int nid) { struct page *page; - bool nocma = !!(current->flags & PF_MEMALLOC_NOCMA); + bool pin = !!(current->flags & PF_MEMALLOC_PIN); list_for_each_entry(page, &h->hugepage_freelists[nid], lru) { - if (nocma && is_migrate_cma_page(page)) + if (pin && is_migrate_cma_page(page)) continue; if (PageHWPoison(page)) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 774542e1483e..ec05396a597b 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -3808,8 +3808,8 @@ static inline unsigned int current_alloc_flags(gfp_t gfp_mask, #ifdef CONFIG_CMA unsigned int pflags = current->flags; - if (!(pflags & PF_MEMALLOC_NOCMA) && - gfp_migratetype(gfp_mask) == MIGRATE_MOVABLE) + if (!(pflags & PF_MEMALLOC_PIN) && + gfp_migratetype(gfp_mask) == MIGRATE_MOVABLE) alloc_flags |= ALLOC_CMA; #endif