diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 5a7fee9f503e..bd099c69b855 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -25,6 +25,7 @@ #include #include #include +#include /* * Export tracepoints that act as a bare tracehook (ie: have no trace event @@ -86,3 +87,6 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_iowait); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_sugov_update); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_sched_setaffinity); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_update_cpus_allowed); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_skip_swapcache_flags); +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 e80b7d2f5b38..918647ffa7df 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -462,16 +462,7 @@ static inline bool gfpflags_normal_context(const gfp_t gfp_flags) | 1 << (___GFP_MOVABLE | ___GFP_DMA32 | ___GFP_DMA | ___GFP_HIGHMEM) \ ) -static inline enum zone_type gfp_zone(gfp_t flags) -{ - enum zone_type z; - int bit = (__force int) (flags & GFP_ZONEMASK); - - z = (GFP_ZONE_TABLE >> (bit * GFP_ZONES_SHIFT)) & - ((1 << GFP_ZONES_SHIFT) - 1); - VM_BUG_ON((GFP_ZONE_BAD >> bit) & 1); - return z; -} +enum zone_type gfp_zone(gfp_t flags); /* * There is only one page-allocator function, and two main namespaces to diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 0bdba743b8bc..14da3ab2cfa2 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -296,10 +296,7 @@ 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) -{ - return mapping_gfp_mask(x) | __GFP_NORETRY | __GFP_NOWARN; -} +gfp_t readahead_gfp_mask(struct address_space *x); typedef int filler_t(void *, struct page *); diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h new file mode 100644 index 000000000000..b7fb70f6d8d7 --- /dev/null +++ b/include/trace/hooks/mm.h @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM mm + +#define TRACE_INCLUDE_PATH trace/hooks + +#if !defined(_TRACE_HOOK_MM_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HOOK_MM_H + +#include + +#include +#include + +#if defined(CONFIG_TRACEPOINTS) && defined(CONFIG_ANDROID_VENDOR_HOOKS) + +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_ARGS(flags), 1); + +#else + +#define trace_android_rvh_set_skip_swapcache_flags(gfp_flags) +#define trace_android_rvh_set_gfp_zone_flags(gfp_flags) +#define trace_android_rvh_set_readahead_gfp_mask(gfp_flags) + +#endif + +#endif /* _TRACE_HOOK_MM_H */ + +/* This part must be outside protection */ +#include diff --git a/mm/memory.c b/mm/memory.c index 693729d1e0b8..49fbc88d8d8c 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -73,6 +73,7 @@ #include #include #include +#include #include @@ -3293,8 +3294,10 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) if (data_race(si->flags & SWP_SYNCHRONOUS_IO) && __swap_count(entry) == 1) { /* skip swapcache */ - page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, - vmf->address); + gfp_t flags = GFP_HIGHUSER_MOVABLE; + + trace_android_rvh_set_skip_swapcache_flags(&flags); + page = alloc_page_vma(flags, vma, vmf->address); if (page) { int err; diff --git a/mm/mmzone.c b/mm/mmzone.c index 4686fdc23bb9..f04cbef1eb88 100644 --- a/mm/mmzone.c +++ b/mm/mmzone.c @@ -9,6 +9,7 @@ #include #include #include +#include struct pglist_data *first_online_pgdat(void) { @@ -113,3 +114,19 @@ int page_cpupid_xchg_last(struct page *page, int cpupid) return last_cpupid; } #endif + +enum zone_type gfp_zone(gfp_t flags) +{ + enum zone_type z; + gfp_t local_flags = flags; + int bit; + + trace_android_rvh_set_gfp_zone_flags(&local_flags); + + bit = (__force int) ((local_flags) & GFP_ZONEMASK); + + z = (GFP_ZONE_TABLE >> (bit * GFP_ZONES_SHIFT)) & + ((1 << GFP_ZONES_SHIFT) - 1); + VM_BUG_ON((GFP_ZONE_BAD >> bit) & 1); + return z; +} diff --git a/mm/readahead.c b/mm/readahead.c index c5b0457415be..a6bfa987a04a 100644 --- a/mm/readahead.c +++ b/mm/readahead.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "internal.h" @@ -114,6 +115,15 @@ int read_cache_pages(struct address_space *mapping, struct list_head *pages, EXPORT_SYMBOL(read_cache_pages); +gfp_t readahead_gfp_mask(struct address_space *x) +{ + gfp_t mask = mapping_gfp_mask(x) | __GFP_NORETRY | __GFP_NOWARN; + + trace_android_rvh_set_readahead_gfp_mask(&mask); + return mask; +} +EXPORT_SYMBOL_GPL(readahead_gfp_mask); + static void read_pages(struct readahead_control *rac, struct list_head *pages, bool skip_page) {