--- zzzz-none-000/linux-4.9.276/mm/page_alloc.c 2021-07-20 14:21:16.000000000 +0000 +++ falcon-5530-750/linux-4.9.276/mm/page_alloc.c 2023-04-05 08:19:02.000000000 +0000 @@ -2525,7 +2525,11 @@ * 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; @@ -2538,14 +2542,24 @@ * otherwise free the whole shadow. */ if (kmemcheck_page_is_tracked(page)) - split_page(virt_to_page(page[0].shadow), order); + __split_page(virt_to_page(page[0].shadow), order +#if defined(CONFIG_AVM_PAGE_TRACE) + , pc #endif - - for (i = 1; i < (1 << order); i++) + ); +#endif +#if defined(CONFIG_AVM_PAGE_TRACE) + avm_set_page_current_pc(page, pc); +#endif + 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); +EXPORT_SYMBOL_GPL(__split_page); int __isolate_free_page(struct page *page, unsigned int order) { @@ -3765,7 +3779,11 @@ */ struct page * __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, - struct zonelist *zonelist, nodemask_t *nodemask) + struct zonelist *zonelist, nodemask_t *nodemask +#if defined(CONFIG_AVM_PAGE_TRACE) + , unsigned long pc +#endif + ) { struct page *page; unsigned int alloc_flags = ALLOC_WMARK_LOW; @@ -3857,7 +3875,10 @@ kmemcheck_pagealloc_alloc(page, order, gfp_mask); 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); @@ -4009,13 +4030,21 @@ EXPORT_SYMBOL(__free_page_frag); 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; @@ -4043,7 +4072,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); @@ -4063,7 +4096,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 + ); } /**