mm/page_alloc: tweak comments in has_unmovable_pages()
authorDavid Hildenbrand <david@redhat.com>
Tue, 13 Oct 2020 23:55:17 +0000 (16:55 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 14 Oct 2020 01:38:32 +0000 (18:38 -0700)
Patch series "mm / virtio-mem: support ZONE_MOVABLE", v5.

When introducing virtio-mem, the semantics of ZONE_MOVABLE were rather
unclear, which is why we special-cased ZONE_MOVABLE such that partially
plugged blocks would never end up in ZONE_MOVABLE.

Now that the semantics are much clearer (and are documented in patch #6),
let's support partially plugged memory blocks in ZONE_MOVABLE, allowing
partially plugged memory blocks to be online to ZONE_MOVABLE and also
unplugging from such memory blocks.  This avoids surprises when onlining
of memory blocks suddenly fails, just because they are not completely
populated by virtio-mem (yet).

This is especially helpful for testing, but also paves the way for
virtio-mem optimizations, allowing more memory to get reliably unplugged.

Cleanup has_unmovable_pages() and set_migratetype_isolate(), providing
better documentation of how ZONE_MOVABLE interacts with different kind of
unmovable pages (memory offlining vs.  alloc_contig_range()).

This patch (of 6):

Let's move the split comment regarding bootmem allocations and memory
holes, especially in the context of ZONE_MOVABLE, to the PageReserved()
check.

Signed-off-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Reviewed-by: Baoquan He <bhe@redhat.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: Mike Kravetz <mike.kravetz@oracle.com>
Cc: Pankaj Gupta <pankaj.gupta.linux@gmail.com>
Cc: Jason Wang <jasowang@redhat.com>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Qian Cai <cai@lca.pw>
Link: http://lkml.kernel.org/r/20200816125333.7434-1-david@redhat.com
Link: http://lkml.kernel.org/r/20200816125333.7434-2-david@redhat.com
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/page_alloc.c

index 780c8f0..ff0b14b 100644 (file)
@@ -8235,14 +8235,6 @@ struct page *has_unmovable_pages(struct zone *zone, struct page *page,
        unsigned long iter = 0;
        unsigned long pfn = page_to_pfn(page);
 
-       /*
-        * TODO we could make this much more efficient by not checking every
-        * page in the range if we know all of them are in MOVABLE_ZONE and
-        * that the movable zone guarantees that pages are migratable but
-        * the later is not the case right now unfortunatelly. E.g. movablecore
-        * can still lead to having bootmem allocations in zone_movable.
-        */
-
        if (is_migrate_cma_page(page)) {
                /*
                 * CMA allocations (alloc_contig_range) really need to mark
@@ -8261,6 +8253,12 @@ struct page *has_unmovable_pages(struct zone *zone, struct page *page,
 
                page = pfn_to_page(pfn + iter);
 
+               /*
+                * Both, bootmem allocations and memory holes are marked
+                * PG_reserved and are unmovable. We can even have unmovable
+                * allocations inside ZONE_MOVABLE, for example when
+                * specifying "movablecore".
+                */
                if (PageReserved(page))
                        return page;
 
@@ -8334,14 +8332,6 @@ struct page *has_unmovable_pages(struct zone *zone, struct page *page,
                 * it.  But now, memory offline itself doesn't call
                 * shrink_node_slabs() and it still to be fixed.
                 */
-               /*
-                * If the page is not RAM, page_count()should be 0.
-                * we don't need more check. This is an _used_ not-movable page.
-                *
-                * The problematic thing here is PG_reserved pages. PG_reserved
-                * is set to both of a memory hole page and a _used_ kernel
-                * page at boot.
-                */
                return page;
        }
        return NULL;