mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02:00
BACKPORT: FROMGIT: mm: arch: remove indirection level in alloc_zeroed_user_highpage_movable()
In an upcoming change we would like to add a flag to
GFP_HIGHUSER_MOVABLE so that it would no longer be an OR
of GFP_HIGHUSER and __GFP_MOVABLE. This poses a problem for
alloc_zeroed_user_highpage_movable() which passes __GFP_MOVABLE
into an arch-specific __alloc_zeroed_user_highpage() hook which ORs
in GFP_HIGHUSER.
Since __alloc_zeroed_user_highpage() is only ever called from
alloc_zeroed_user_highpage_movable(), we can remove one level
of indirection here. Remove __alloc_zeroed_user_highpage(),
make alloc_zeroed_user_highpage_movable() the hook, and use
GFP_HIGHUSER_MOVABLE in the hook implementations so that they will
pick up the new flag that we are going to add.
Signed-off-by: Peter Collingbourne <pcc@google.com>
Link: https://linux-review.googlesource.com/id/Ic6361c657b2cdcd896adbe0cf7cb5a7fbb1ed7bf
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Link: https://lore.kernel.org/r/20210602235230.3928842-2-pcc@google.com
Signed-off-by: Will Deacon <will@kernel.org>
(cherry-picked from commit 92638b4e1b
https://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git for-next/mte)
[pcc: keep setting GFP_CMA in generic, x86 and arm64 to correspond with downstream GFP_CMA patch]
Change-Id: Ic6361c657b2cdcd896adbe0cf7cb5a7fbb1ed7bf
Bug: 186816853
This commit is contained in:
parent
5083a1ca9d
commit
79cb255c79
|
|
@ -17,9 +17,9 @@
|
||||||
extern void clear_page(void *page);
|
extern void clear_page(void *page);
|
||||||
#define clear_user_page(page, vaddr, pg) clear_page(page)
|
#define clear_user_page(page, vaddr, pg) clear_page(page)
|
||||||
|
|
||||||
#define __alloc_zeroed_user_highpage(movableflags, vma, vaddr) \
|
#define alloc_zeroed_user_highpage_movable(vma, vaddr) \
|
||||||
alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vmaddr)
|
alloc_page_vma(GFP_HIGHUSER_MOVABLE | __GFP_ZERO, vma, vmaddr)
|
||||||
#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
|
#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE_MOVABLE
|
||||||
|
|
||||||
extern void copy_page(void * _to, void * _from);
|
extern void copy_page(void * _to, void * _from);
|
||||||
#define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
|
#define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
|
||||||
|
|
|
||||||
|
|
@ -28,9 +28,9 @@ void copy_user_highpage(struct page *to, struct page *from,
|
||||||
void copy_highpage(struct page *to, struct page *from);
|
void copy_highpage(struct page *to, struct page *from);
|
||||||
#define __HAVE_ARCH_COPY_HIGHPAGE
|
#define __HAVE_ARCH_COPY_HIGHPAGE
|
||||||
|
|
||||||
#define __alloc_zeroed_user_highpage(movableflags, vma, vaddr) \
|
#define alloc_zeroed_user_highpage_movable(vma, vaddr) \
|
||||||
alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vaddr)
|
alloc_page_vma(GFP_HIGHUSER_MOVABLE | __GFP_ZERO | __GFP_CMA, vma, vaddr)
|
||||||
#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
|
#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE_MOVABLE
|
||||||
|
|
||||||
#define clear_user_page(page, vaddr, pg) clear_page(page)
|
#define clear_user_page(page, vaddr, pg) clear_page(page)
|
||||||
#define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
|
#define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
|
||||||
|
|
|
||||||
|
|
@ -82,16 +82,16 @@ do { \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
#define __alloc_zeroed_user_highpage(movableflags, vma, vaddr) \
|
#define alloc_zeroed_user_highpage_movable(vma, vaddr) \
|
||||||
({ \
|
({ \
|
||||||
struct page *page = alloc_page_vma( \
|
struct page *page = alloc_page_vma( \
|
||||||
GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vaddr); \
|
GFP_HIGHUSER_MOVABLE | __GFP_ZERO, vma, vaddr); \
|
||||||
if (page) \
|
if (page) \
|
||||||
flush_dcache_page(page); \
|
flush_dcache_page(page); \
|
||||||
page; \
|
page; \
|
||||||
})
|
})
|
||||||
|
|
||||||
#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
|
#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE_MOVABLE
|
||||||
|
|
||||||
#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
|
#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,9 +13,9 @@ extern unsigned long memory_end;
|
||||||
#define clear_user_page(page, vaddr, pg) clear_page(page)
|
#define clear_user_page(page, vaddr, pg) clear_page(page)
|
||||||
#define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
|
#define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
|
||||||
|
|
||||||
#define __alloc_zeroed_user_highpage(movableflags, vma, vaddr) \
|
#define alloc_zeroed_user_highpage_movable(vma, vaddr) \
|
||||||
alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vaddr)
|
alloc_page_vma(GFP_HIGHUSER_MOVABLE | __GFP_ZERO, vma, vaddr)
|
||||||
#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
|
#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE_MOVABLE
|
||||||
|
|
||||||
#define __pa(vaddr) ((unsigned long)(vaddr))
|
#define __pa(vaddr) ((unsigned long)(vaddr))
|
||||||
#define __va(paddr) ((void *)((unsigned long)(paddr)))
|
#define __va(paddr) ((void *)((unsigned long)(paddr)))
|
||||||
|
|
|
||||||
|
|
@ -68,9 +68,9 @@ static inline void copy_page(void *to, void *from)
|
||||||
#define clear_user_page(page, vaddr, pg) clear_page(page)
|
#define clear_user_page(page, vaddr, pg) clear_page(page)
|
||||||
#define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
|
#define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
|
||||||
|
|
||||||
#define __alloc_zeroed_user_highpage(movableflags, vma, vaddr) \
|
#define alloc_zeroed_user_highpage_movable(vma, vaddr) \
|
||||||
alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vaddr)
|
alloc_page_vma(GFP_HIGHUSER_MOVABLE | __GFP_ZERO, vma, vaddr)
|
||||||
#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
|
#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE_MOVABLE
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These are used to make use of C type-checking..
|
* These are used to make use of C type-checking..
|
||||||
|
|
|
||||||
|
|
@ -34,9 +34,9 @@ static inline void copy_user_page(void *to, void *from, unsigned long vaddr,
|
||||||
copy_page(to, from);
|
copy_page(to, from);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __alloc_zeroed_user_highpage(movableflags, vma, vaddr) \
|
#define alloc_zeroed_user_highpage_movable(vma, vaddr) \
|
||||||
alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vaddr)
|
alloc_page_vma(GFP_HIGHUSER_MOVABLE | __GFP_ZERO | __GFP_CMA, vma, vaddr)
|
||||||
#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
|
#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE_MOVABLE
|
||||||
|
|
||||||
#ifndef __pa
|
#ifndef __pa
|
||||||
#define __pa(x) __phys_addr((unsigned long)(x))
|
#define __pa(x) __phys_addr((unsigned long)(x))
|
||||||
|
|
|
||||||
|
|
@ -232,36 +232,7 @@ static inline void clear_user_highpage(struct page *page, unsigned long vaddr)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
|
#ifndef __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE_MOVABLE
|
||||||
/**
|
|
||||||
* __alloc_zeroed_user_highpage - Allocate a zeroed HIGHMEM page for a VMA with caller-specified movable GFP flags
|
|
||||||
* @movableflags: The GFP flags related to the pages future ability to move like __GFP_MOVABLE
|
|
||||||
* @vma: The VMA the page is to be allocated for
|
|
||||||
* @vaddr: The virtual address the page will be inserted into
|
|
||||||
*
|
|
||||||
* This function will allocate a page for a VMA but the caller is expected
|
|
||||||
* to specify via movableflags whether the page will be movable in the
|
|
||||||
* future or not
|
|
||||||
*
|
|
||||||
* An architecture may override this function by defining
|
|
||||||
* __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE and providing their own
|
|
||||||
* implementation.
|
|
||||||
*/
|
|
||||||
static inline struct page *
|
|
||||||
__alloc_zeroed_user_highpage(gfp_t movableflags,
|
|
||||||
struct vm_area_struct *vma,
|
|
||||||
unsigned long vaddr)
|
|
||||||
{
|
|
||||||
struct page *page = alloc_page_vma(GFP_HIGHUSER | movableflags,
|
|
||||||
vma, vaddr);
|
|
||||||
|
|
||||||
if (page)
|
|
||||||
clear_user_highpage(page, vaddr);
|
|
||||||
|
|
||||||
return page;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* alloc_zeroed_user_highpage_movable - Allocate a zeroed HIGHMEM page for a VMA that the caller knows can move
|
* alloc_zeroed_user_highpage_movable - Allocate a zeroed HIGHMEM page for a VMA that the caller knows can move
|
||||||
* @vma: The VMA the page is to be allocated for
|
* @vma: The VMA the page is to be allocated for
|
||||||
|
|
@ -269,15 +240,23 @@ __alloc_zeroed_user_highpage(gfp_t movableflags,
|
||||||
*
|
*
|
||||||
* This function will allocate a page for a VMA that the caller knows will
|
* This function will allocate a page for a VMA that the caller knows will
|
||||||
* be able to migrate in the future using move_pages() or reclaimed
|
* be able to migrate in the future using move_pages() or reclaimed
|
||||||
|
*
|
||||||
|
* An architecture may override this function by defining
|
||||||
|
* __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE_MOVABLE and providing their own
|
||||||
|
* implementation.
|
||||||
*/
|
*/
|
||||||
static inline struct page *
|
static inline struct page *
|
||||||
alloc_zeroed_user_highpage_movable(struct vm_area_struct *vma,
|
alloc_zeroed_user_highpage_movable(struct vm_area_struct *vma,
|
||||||
unsigned long vaddr)
|
unsigned long vaddr)
|
||||||
{
|
{
|
||||||
return __alloc_zeroed_user_highpage(
|
struct page *page = alloc_page_vma(GFP_HIGHUSER_MOVABLE | __GFP_CMA, vma, vaddr);
|
||||||
__GFP_MOVABLE|__GFP_CMA, vma,
|
|
||||||
vaddr);
|
if (page)
|
||||||
|
clear_user_highpage(page, vaddr);
|
||||||
|
|
||||||
|
return page;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static inline void clear_highpage(struct page *page)
|
static inline void clear_highpage(struct page *page)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user