hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/mm/page_alloc.c
....@@ -1614,11 +1614,16 @@
16141614 unsigned long flags;
16151615 int migratetype;
16161616 unsigned long pfn = page_to_pfn(page);
1617
+ bool skip_free_unref_page = false;
16171618
16181619 if (!free_pages_prepare(page, order, true, fpi_flags))
16191620 return;
16201621
16211622 migratetype = get_pfnblock_migratetype(page, pfn);
1623
+ trace_android_vh_free_unref_page_bypass(page, order, migratetype, &skip_free_unref_page);
1624
+ if (skip_free_unref_page)
1625
+ return;
1626
+
16221627 local_irq_save(flags);
16231628 __count_vm_events(PGFREE, 1 << order);
16241629 free_one_page(page_zone(page), page, pfn, order, migratetype,
....@@ -2797,6 +2802,7 @@
27972802 struct page *page;
27982803 int order;
27992804 bool ret;
2805
+ bool skip_unreserve_highatomic = false;
28002806
28012807 for_each_zone_zonelist_nodemask(zone, z, zonelist, ac->highest_zoneidx,
28022808 ac->nodemask) {
....@@ -2806,6 +2812,11 @@
28062812 */
28072813 if (!force && zone->nr_reserved_highatomic <=
28082814 pageblock_nr_pages)
2815
+ continue;
2816
+
2817
+ trace_android_vh_unreserve_highatomic_bypass(force, zone,
2818
+ &skip_unreserve_highatomic);
2819
+ if (skip_unreserve_highatomic)
28092820 continue;
28102821
28112822 spin_lock_irqsave(&zone->lock, flags);
....@@ -3053,6 +3064,10 @@
30533064 struct list_head *list = &pcp->lists[migratetype];
30543065
30553066 if (list_empty(list)) {
3067
+ trace_android_vh_rmqueue_bulk_bypass(order, pcp, migratetype, list);
3068
+ if (!list_empty(list))
3069
+ return list;
3070
+
30563071 pcp->count += rmqueue_bulk(zone, order,
30573072 pcp->batch, list,
30583073 migratetype, alloc_flags);
....@@ -3349,8 +3364,15 @@
33493364 {
33503365 unsigned long flags;
33513366 unsigned long pfn = page_to_pfn(page);
3367
+ int migratetype;
3368
+ bool skip_free_unref_page = false;
33523369
33533370 if (!free_unref_page_prepare(page, pfn))
3371
+ return;
3372
+
3373
+ migratetype = get_pfnblock_migratetype(page, pfn);
3374
+ trace_android_vh_free_unref_page_bypass(page, 0, migratetype, &skip_free_unref_page);
3375
+ if (skip_free_unref_page)
33543376 return;
33553377
33563378 local_irq_save(flags);
....@@ -4828,6 +4850,7 @@
48284850 unsigned int zonelist_iter_cookie;
48294851 int reserve_flags;
48304852 unsigned long vh_record;
4853
+ bool should_alloc_retry = false;
48314854
48324855 trace_android_vh_alloc_pages_slowpath_begin(gfp_mask, order, &vh_record);
48334856 /*
....@@ -4967,6 +4990,12 @@
49674990
49684991 if (page)
49694992 goto got_pg;
4993
+
4994
+ trace_android_vh_should_alloc_pages_retry(gfp_mask, order,
4995
+ &alloc_flags, ac->migratetype, ac->preferred_zoneref->zone,
4996
+ &page, &should_alloc_retry);
4997
+ if (should_alloc_retry)
4998
+ goto retry;
49704999
49715000 /* Try direct reclaim and then allocating */
49725001 page = __alloc_pages_direct_reclaim(gfp_mask, order, alloc_flags, ac,
....@@ -5240,10 +5269,13 @@
52405269
52415270 void __free_pages(struct page *page, unsigned int order)
52425271 {
5272
+ /* get PageHead before we drop reference */
5273
+ int head = PageHead(page);
5274
+
52435275 trace_android_vh_free_pages(page, order);
52445276 if (put_page_testzero(page))
52455277 free_the_page(page, order);
5246
- else if (!PageHead(page))
5278
+ else if (!head)
52475279 while (order-- > 0)
52485280 free_the_page(page + (1 << order), order);
52495281 }
....@@ -6158,7 +6190,21 @@
61586190 int nid;
61596191 int __maybe_unused cpu;
61606192 pg_data_t *self = data;
6193
+ unsigned long flags;
61616194
6195
+ /*
6196
+ * Explicitly disable this CPU's interrupts before taking seqlock
6197
+ * to prevent any IRQ handler from calling into the page allocator
6198
+ * (e.g. GFP_ATOMIC) that could hit zonelist_iter_begin and livelock.
6199
+ */
6200
+ local_irq_save(flags);
6201
+ /*
6202
+ * Explicitly disable this CPU's synchronous printk() before taking
6203
+ * seqlock to prevent any printk() from trying to hold port->lock, for
6204
+ * tty_insert_flip_string_and_push_buffer() on other CPU might be
6205
+ * calling kmalloc(GFP_ATOMIC | __GFP_NOWARN) with port->lock held.
6206
+ */
6207
+ printk_deferred_enter();
61626208 write_seqlock(&zonelist_update_seq);
61636209
61646210 #ifdef CONFIG_NUMA
....@@ -6193,6 +6239,8 @@
61936239 }
61946240
61956241 write_sequnlock(&zonelist_update_seq);
6242
+ printk_deferred_exit();
6243
+ local_irq_restore(flags);
61966244 }
61976245
61986246 static noinline void __init
....@@ -6612,6 +6660,7 @@
66126660 static void pageset_update(struct per_cpu_pages *pcp, unsigned long high,
66136661 unsigned long batch)
66146662 {
6663
+ trace_android_vh_pageset_update(&high, &batch);
66156664 /* start with a fail safe value for batch */
66166665 pcp->batch = 1;
66176666 smp_wmb();