virtio_balloon: specify page reporting order if needed
authorGavin Shan <gshan@redhat.com>
Tue, 29 Jun 2021 02:35:25 +0000 (19:35 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 29 Jun 2021 17:53:47 +0000 (10:53 -0700)
The page reporting won't be triggered if the freeing page can't come up
with a free area, whose size is equal or bigger than the threshold (page
reporting order).  The default page reporting order, equal to
@pageblock_order, is too huge on some architectures to trigger page
reporting.  One example is ARM64 when 64KB base page size is used.

      PAGE_SIZE:          64KB
      pageblock_order:    13       (512MB)
      MAX_ORDER:          14

This specifies the page reporting order to 5 (2MB) for this specific case
so that page reporting can be triggered.

Link: https://lkml.kernel.org/r/20210625014710.42954-5-gshan@redhat.com
Signed-off-by: Gavin Shan <gshan@redhat.com>
Reviewed-by: Alexander Duyck <alexanderduyck@fb.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: Anshuman Khandual <anshuman.khandual@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/virtio/virtio_balloon.c

index 510e931..47dce91 100644 (file)
@@ -993,6 +993,23 @@ static int virtballoon_probe(struct virtio_device *vdev)
                        goto out_unregister_oom;
                }
 
+               /*
+                * The default page reporting order is @pageblock_order, which
+                * corresponds to 512MB in size on ARM64 when 64KB base page
+                * size is used. The page reporting won't be triggered if the
+                * freeing page can't come up with a free area like that huge.
+                * So we specify the page reporting order to 5, corresponding
+                * to 2MB. It helps to avoid THP splitting if 4KB base page
+                * size is used by host.
+                *
+                * Ideally, the page reporting order is selected based on the
+                * host's base page size. However, it needs more work to report
+                * that value. The hard-coded order would be fine currently.
+                */
+#if defined(CONFIG_ARM64) && defined(CONFIG_ARM64_64K_PAGES)
+               vb->pr_dev_info.order = 5;
+#endif
+
                err = page_reporting_register(&vb->pr_dev_info);
                if (err)
                        goto out_unregister_oom;