From 342be123fd886c8a7f3a91234b028ac127fd483f Mon Sep 17 00:00:00 2001 From: Chris Goldsworthy Date: Mon, 9 Nov 2020 22:26:47 -0800 Subject: [PATCH] ANDROID: mm: Create hooks for ZONE_MOVABLE allocs Create a vendor hook inside of gfp_zone() to modify which allocations get to enter ZONE_MOVABLE, by zeroing out __GFP_HIGHMEM inside of the trace hook based on certain conditions. Separately, create a trace hook in the readahead path to affect the behavior of the tracehook in gfp_zone(). In 5.15, we had set_skip_swapcache_flags trace-hook in do_swap_page() but commit ac26e9c7b809 ("ANDROID: cma: allow to use CMA in swap-in path") added __GFP_CMA explicitly, so the set_skip_swapcache_flags trace hook is no longer needed. Note: To comply with vendor hook guidlines, avoid including types.h in trace/hooks/mm.h and use unsigned int for gfp_t. Bug: 158645321 Change-Id: Idfa6b0b06b1b819d706c847e702bc94ddf7aa55a Signed-off-by: Chris Goldsworthy Signed-off-by: Sukadev Bhattiprolu --- android/abi_gki_aarch64_qcom | 4 ++++ drivers/android/vendor_hooks.c | 2 ++ include/linux/gfp.h | 4 +++- include/linux/pagemap.h | 4 +++- include/trace/hooks/mm.h | 15 +++++---------- mm/memory.c | 7 ++++--- mm/mmzone.c | 8 ++++++++ mm/readahead.c | 10 ++++++++++ 8 files changed, 39 insertions(+), 15 deletions(-) diff --git a/android/abi_gki_aarch64_qcom b/android/abi_gki_aarch64_qcom index 9360b5a9d4fc..3d5fce8c5b36 100644 --- a/android/abi_gki_aarch64_qcom +++ b/android/abi_gki_aarch64_qcom @@ -3509,6 +3509,8 @@ __traceiter_android_rvh_select_task_rq_rt __traceiter_android_rvh_set_balance_anon_file_reclaim __traceiter_android_rvh_set_cpus_allowed_by_task + __traceiter_android_rvh_set_gfp_zone_flags + __traceiter_android_rvh_set_readahead_gfp_mask __traceiter_android_rvh_setscheduler __traceiter_android_rvh_set_task_cpu __traceiter_android_rvh_set_user_nice @@ -3639,6 +3641,8 @@ __tracepoint_android_rvh_select_task_rq_rt __tracepoint_android_rvh_set_balance_anon_file_reclaim __tracepoint_android_rvh_set_cpus_allowed_by_task + __tracepoint_android_rvh_set_gfp_zone_flags + __tracepoint_android_rvh_set_readahead_gfp_mask __tracepoint_android_rvh_setscheduler __tracepoint_android_rvh_set_task_cpu __tracepoint_android_rvh_set_user_nice diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index ff2f09788ce9..add813b07bb6 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -187,3 +187,5 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_typec_store_partner_src_caps); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_typec_tcpm_get_timer); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_typec_tcpm_modify_src_caps); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_typec_tcpm_log); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_gfp_zone_flags); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_readahead_gfp_mask); diff --git a/include/linux/gfp.h b/include/linux/gfp.h index d81540c187ed..e652b9bbb262 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -123,7 +123,7 @@ static inline bool gfpflags_allow_blocking(const gfp_t gfp_flags) | 1 << (___GFP_MOVABLE | ___GFP_DMA32 | ___GFP_DMA | ___GFP_HIGHMEM) \ ) -static inline enum zone_type gfp_zone(gfp_t flags) +static inline enum zone_type __gfp_zone(gfp_t flags) { enum zone_type z; int bit = (__force int) (flags & GFP_ZONEMASK); @@ -134,6 +134,8 @@ static inline enum zone_type gfp_zone(gfp_t flags) return z; } +enum zone_type gfp_zone(gfp_t flags); + /* * There is only one page-allocator function, and two main namespaces to * it. The alloc_page*() variants return 'struct page *' and as such diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index bbccb4044222..df232c0003de 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -485,11 +485,13 @@ static inline struct page *page_cache_alloc(struct address_space *x) return __page_cache_alloc(mapping_gfp_mask(x)); } -static inline gfp_t readahead_gfp_mask(struct address_space *x) +static inline gfp_t __readahead_gfp_mask(struct address_space *x) { return mapping_gfp_mask(x) | __GFP_NORETRY | __GFP_NOWARN; } +gfp_t readahead_gfp_mask(struct address_space *x); + typedef int filler_t(struct file *, struct folio *); pgoff_t page_cache_next_miss(struct address_space *mapping, diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index a5e9bfb9817c..c7153c4496d5 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -16,19 +16,14 @@ DECLARE_RESTRICTED_HOOK(android_rvh_shmem_get_folio, TP_PROTO(struct shmem_inode_info *info, struct folio **folio), TP_ARGS(info, folio), 2); -/* - -DECLARE_RESTRICTED_HOOK(android_rvh_set_skip_swapcache_flags, - TP_PROTO(gfp_t *flags), - TP_ARGS(flags), 1); DECLARE_RESTRICTED_HOOK(android_rvh_set_gfp_zone_flags, - TP_PROTO(gfp_t *flags), - TP_ARGS(flags), 1); -DECLARE_RESTRICTED_HOOK(android_rvh_set_readahead_gfp_mask, - TP_PROTO(gfp_t *flags), + TP_PROTO(unsigned int *flags), /* gfp_t *flags */ + TP_ARGS(flags), 1); + +DECLARE_RESTRICTED_HOOK(android_rvh_set_readahead_gfp_mask, + TP_PROTO(unsigned int *flags), /* gfp_t *flags */ TP_ARGS(flags), 1); -*/ #endif /* _TRACE_HOOK_MM_H */ /* This part must be outside protection */ diff --git a/mm/memory.c b/mm/memory.c index 100f71762761..f24a9093b55a 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -3802,8 +3802,8 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) if (data_race(si->flags & SWP_SYNCHRONOUS_IO) && __swap_count(entry) == 1) { /* skip swapcache */ - folio = vma_alloc_folio(GFP_HIGHUSER_MOVABLE, 0, - vma, vmf->address, false); + folio = vma_alloc_folio(GFP_HIGHUSER_MOVABLE|__GFP_CMA, + 0, vma, vmf->address, false); page = &folio->page; if (folio) { __folio_set_locked(folio); @@ -3829,7 +3829,8 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) folio->private = NULL; } } else { - page = swapin_readahead(entry, GFP_HIGHUSER_MOVABLE, + page = swapin_readahead(entry, + GFP_HIGHUSER_MOVABLE|__GFP_CMA, vmf); if (page) folio = page_folio(page); diff --git a/mm/mmzone.c b/mm/mmzone.c index 68e1511be12d..1cb88733d3dd 100644 --- a/mm/mmzone.c +++ b/mm/mmzone.c @@ -9,6 +9,7 @@ #include #include #include +#include struct pglist_data *first_online_pgdat(void) { @@ -110,3 +111,10 @@ int page_cpupid_xchg_last(struct page *page, int cpupid) return last_cpupid; } #endif + +enum zone_type gfp_zone(gfp_t flags) +{ + trace_android_rvh_set_gfp_zone_flags(&flags); + + return __gfp_zone(flags); +} diff --git a/mm/readahead.c b/mm/readahead.c index b10f0cf81d80..844e8134ba96 100644 --- a/mm/readahead.c +++ b/mm/readahead.c @@ -129,6 +129,7 @@ #include #include #include +#include #include "internal.h" @@ -144,6 +145,15 @@ file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping) } EXPORT_SYMBOL_GPL(file_ra_state_init); +gfp_t readahead_gfp_mask(struct address_space *x) +{ + gfp_t mask = __readahead_gfp_mask(x); + + trace_android_rvh_set_readahead_gfp_mask(&mask); + return mask; +} +EXPORT_SYMBOL_GPL(readahead_gfp_mask); + static void read_pages(struct readahead_control *rac) { const struct address_space_operations *aops = rac->mapping->a_ops;