diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 6eb65dad7151..57886c84a772 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -265,3 +265,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rwsem_write_finished); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alter_rwsem_list_add); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_thermal_power_cap); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_tk_based_time_sync); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_kswapd_per_node); diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 08af8f6ec69e..427a1e6f1c29 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -39,6 +39,8 @@ */ #define PAGE_ALLOC_COSTLY_ORDER 3 +#define MAX_KSWAPD_THREADS 16 + enum migratetype { MIGRATE_UNMOVABLE, MIGRATE_MOVABLE, @@ -843,6 +845,7 @@ typedef struct pglist_data { wait_queue_head_t pfmemalloc_wait; struct task_struct *kswapd; /* Protected by mem_hotplug_begin/end() */ + struct task_struct *mkswapd[MAX_KSWAPD_THREADS]; int kswapd_order; enum zone_type kswapd_highest_zoneidx; diff --git a/include/trace/hooks/vmscan.h b/include/trace/hooks/vmscan.h index 0e815b872f7f..f77873285bb8 100644 --- a/include/trace/hooks/vmscan.h +++ b/include/trace/hooks/vmscan.h @@ -13,6 +13,9 @@ DECLARE_RESTRICTED_HOOK(android_rvh_set_balance_anon_file_reclaim, TP_PROTO(bool *balance_anon_file_reclaim), TP_ARGS(balance_anon_file_reclaim), 1); +DECLARE_HOOK(android_vh_kswapd_per_node, + TP_PROTO(int nid, bool *skip, bool run), + TP_ARGS(nid, skip, run)); #endif /* _TRACE_HOOK_VMSCAN_H */ /* This part must be outside protection */ #include diff --git a/mm/vmscan.c b/mm/vmscan.c index 0bf4b853757d..5cbc0bdaa341 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -4473,10 +4473,14 @@ unsigned long shrink_all_memory(unsigned long nr_to_reclaim) void kswapd_run(int nid) { pg_data_t *pgdat = NODE_DATA(nid); + bool skip = false; if (pgdat->kswapd) return; + trace_android_vh_kswapd_per_node(nid, &skip, true); + if (skip) + return; pgdat->kswapd = kthread_run(kswapd, pgdat, "kswapd%d", nid); if (IS_ERR(pgdat->kswapd)) { /* failure at boot is fatal */ @@ -4493,7 +4497,11 @@ void kswapd_run(int nid) void kswapd_stop(int nid) { struct task_struct *kswapd = NODE_DATA(nid)->kswapd; + bool skip = false; + trace_android_vh_kswapd_per_node(nid, &skip, false); + if (skip) + return; if (kswapd) { kthread_stop(kswapd); NODE_DATA(nid)->kswapd = NULL;