--- zzzz-none-000/linux-4.19.183/mm/page_alloc.c 2021-03-24 10:07:39.000000000 +0000 +++ bcm63-7530ax-756/linux-4.19.183/mm/page_alloc.c 2023-06-28 08:54:21.000000000 +0000 @@ -2863,15 +2863,24 @@ * Note: this is probably too low level an operation for use in drivers. * Please consult with lkml before using this in your driver. */ -void split_page(struct page *page, unsigned int order) +void split_page(struct page *page, unsigned int order +#if defined(CONFIG_AVM_PAGE_TRACE) + , unsigned long pc +#endif +) { int i; VM_BUG_ON_PAGE(PageCompound(page), page); VM_BUG_ON_PAGE(!page_count(page), page); - for (i = 1; i < (1 << order); i++) + for (i = 1; i < (1 << order); i++) { set_page_refcounted(page + i); +#if defined(CONFIG_AVM_PAGE_TRACE) + avm_set_page_current_pc(page + i, pc); +#endif + } + split_page_owner(page, order); } EXPORT_SYMBOL_GPL(split_page); @@ -4372,7 +4381,11 @@ */ struct page * __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, int preferred_nid, - nodemask_t *nodemask) + nodemask_t *nodemask +#if defined(CONFIG_AVM_PAGE_TRACE) + , unsigned long pc +#endif + ) { struct page *page; unsigned int alloc_flags = ALLOC_WMARK_LOW; @@ -4427,6 +4440,10 @@ trace_mm_page_alloc(page, order, alloc_mask, ac.migratetype); +#if defined(CONFIG_AVM_PAGE_TRACE) + if (likely(page)) + avm_set_page_current_pc(page, pc); +#endif return page; } EXPORT_SYMBOL(__alloc_pages_nodemask); @@ -4591,13 +4608,21 @@ EXPORT_SYMBOL(page_frag_free); static void *make_alloc_exact(unsigned long addr, unsigned int order, - size_t size) + size_t size +#if defined(CONFIG_AVM_PAGE_TRACE) + , unsigned long pc +#endif + ) { if (addr) { unsigned long alloc_end = addr + (PAGE_SIZE << order); unsigned long used = addr + PAGE_ALIGN(size); - split_page(virt_to_page((void *)addr), order); + split_page(virt_to_page((void *)addr), order +#if defined(CONFIG_AVM_PAGE_TRACE) + , pc +#endif + ); while (used < alloc_end) { free_page(used); used += PAGE_SIZE; @@ -4625,7 +4650,11 @@ unsigned long addr; addr = __get_free_pages(gfp_mask, order); - return make_alloc_exact(addr, order, size); + return make_alloc_exact(addr, order, size +#if defined(CONFIG_AVM_PAGE_TRACE) + , _RET_IP_ +#endif + ); } EXPORT_SYMBOL(alloc_pages_exact); @@ -4645,7 +4674,11 @@ struct page *p = alloc_pages_node(nid, gfp_mask, order); if (!p) return NULL; - return make_alloc_exact((unsigned long)page_address(p), order, size); + return make_alloc_exact((unsigned long)page_address(p), order, size +#if defined(CONFIG_AVM_PAGE_TRACE) + , 0L +#endif + ); } /** @@ -4895,6 +4928,29 @@ for_each_online_cpu(cpu) free_pcp += per_cpu_ptr(zone->pageset, cpu)->pcp.count; } +#if defined(CONFIG_AVM_ENHANCED) + { + unsigned int sum_pages; + sum_pages = global_zone_page_state(NR_ACTIVE_ANON)+ + global_zone_page_state(NR_INACTIVE_ANON)+ + global_zone_page_state(NR_ISOLATED_ANON)+ + global_zone_page_state(NR_ACTIVE_FILE)+ + global_zone_page_state(NR_INACTIVE_FILE)+ + global_zone_page_state(NR_ISOLATED_FILE)+ + global_zone_page_state(NR_UNEVICTABLE)+ + global_zone_page_state(NR_FILE_DIRTY)+ + global_zone_page_state(NR_WRITEBACK)+ + global_zone_page_state(NR_UNSTABLE_NFS)+ + global_zone_page_state(NR_FREE_PAGES)+ + global_zone_page_state(NR_SLAB_RECLAIMABLE)+ + global_zone_page_state(NR_SLAB_UNRECLAIMABLE)+ + global_zone_page_state(NR_FILE_MAPPED)+ + global_zone_page_state(NR_SHMEM)+ + global_zone_page_state(NR_PAGETABLE)+ + global_zone_page_state(NR_BOUNCE); + printk("global_page_sum %ukB(%u pages)\n", sum_pages * 4, sum_pages); + } +#endif/*--- #if defined(CONFIG_AVM_ENHANCED) ---*/ printk("active_anon:%lu inactive_anon:%lu isolated_anon:%lu\n" " active_file:%lu inactive_file:%lu isolated_file:%lu\n"