Messages in this thread | | | Subject | Re: [RFC PATCH] mm/page_reporting: Adjust threshold according to MAX_ORDER | From | Gavin Shan <> | Date | Fri, 11 Jun 2021 12:54:51 +1000 |
| |
On 6/2/21 10:03 AM, Andrew Morton wrote: > On Tue, 1 Jun 2021 11:33:19 +0800 Gavin Shan <gshan@redhat.com> wrote: > >> The PAGE_REPORTING_MIN_ORDER is equal to @pageblock_order, taken as >> minimal order (threshold) to trigger page reporting. The page reporting >> is never triggered with the following configurations and settings on >> aarch64. In the particular scenario, the page reporting won't be triggered >> until the largest (2 ^ (MAX_ORDER-1)) free area is achieved from the >> page freeing. The condition is very hard, or even impossible to be met. >> >> CONFIG_ARM64_PAGE_SHIFT: 16 >> CONFIG_HUGETLB_PAGE: Y >> CONFIG_HUGETLB_PAGE_SIZE_VARIABLE: N >> pageblock_order: 13 >> CONFIG_FORCE_MAX_ZONEORDER: 14 >> MAX_ORDER: 14 >> >> The issue can be reproduced in VM, running kernel with above configurations >> and settings. The 'memhog' is used inside the VM to access 512MB anonymous >> area. The QEMU's RSS doesn't drop accordingly after 'memhog' exits. >> >> /home/gavin/sandbox/qemu.main/build/qemu-system-aarch64 \ >> -accel kvm -machine virt,gic-version=host \ >> -cpu host -smp 8,sockets=2,cores=4,threads=1 -m 4096M,maxmem=64G \ >> -object memory-backend-ram,id=mem0,size=2048M \ >> -object memory-backend-ram,id=mem1,size=2048M \ >> -numa node,nodeid=0,cpus=0-3,memdev=mem0 \ >> -numa node,nodeid=1,cpus=4-7,memdev=mem1 \ >> : \ >> -device virtio-balloon-pci,id=balloon0,free-page-reporting=yes >> >> This tries to fix the issue by adjusting the threshold to the smaller value >> of @pageblock_order and (MAX_ORDER/2). With this applied, the QEMU's RSS >> drops after 'memhog' exits. >> > > Sounds promising, but... > >> --- a/mm/page_reporting.h >> +++ b/mm/page_reporting.h >> @@ -10,9 +10,10 @@ >> #include <linux/pgtable.h> >> #include <linux/scatterlist.h> >> >> -#define PAGE_REPORTING_MIN_ORDER pageblock_order >> - >> #ifdef CONFIG_PAGE_REPORTING >> +#define PAGE_REPORTING_MIN_ORDER \ >> + min_t(unsigned int, pageblock_order, (MAX_ORDER / 2)) >> + >> DECLARE_STATIC_KEY_FALSE(page_reporting_enabled); >> void __page_reporting_notify(void); > > Could you please redo this as a regular old static function in > page_reporting.c? Bonus points for commenting its design ;) >
Thanks for your time to review, Andrew. Sorry for the delay and late reply. Yes, I will do if needed after the discussion with David is finalized.
Thanks, Gavin
| |