Thread (68 messages) 68 messages, 6 authors, 2023-11-21

Re: [PATCH RFC 20/37] mm: compaction: Reserve metadata storage in compaction_alloc()

From: Peter Collingbourne <hidden>
Date: 2023-11-21 04:49:44
Also in: kvmarm, linux-arch, linux-fsdevel, linux-mm, linux-trace-kernel, lkml

Hi Alexandru,

On Wed, Aug 23, 2023 at 6:16 AM Alexandru Elisei
[off-list ref] wrote:
quoted hunk ↗ jump to hunk
If the source page being migrated has metadata associated with it, make
sure to reserve the metadata storage when choosing a suitable destination
page from the free list.

Signed-off-by: Alexandru Elisei <redacted>
---
 mm/compaction.c | 9 +++++++++
 mm/internal.h   | 1 +
 2 files changed, 10 insertions(+)
diff --git a/mm/compaction.c b/mm/compaction.c
index cc0139fa0cb0..af2ee3085623 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -570,6 +570,7 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,
        bool locked = false;
        unsigned long blockpfn = *start_pfn;
        unsigned int order;
+       int ret;

        /* Strict mode is for isolation, speed is secondary */
        if (strict)
@@ -626,6 +627,11 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,

                /* Found a free page, will break it into order-0 pages */
                order = buddy_order(page);
+               if (metadata_storage_enabled() && cc->reserve_metadata) {
+                       ret = reserve_metadata_storage(page, order, cc->gfp_mask);
At this point the zone lock is held and preemption is disabled, which
makes it invalid to call reserve_metadata_storage.

Peter
quoted hunk ↗ jump to hunk
+                       if (ret)
+                               goto isolate_fail;
+               }
                isolated = __isolate_free_page(page, order);
                if (!isolated)
                        break;
@@ -1757,6 +1763,9 @@ static struct folio *compaction_alloc(struct folio *src, unsigned long data)
        struct compact_control *cc = (struct compact_control *)data;
        struct folio *dst;

+       if (metadata_storage_enabled())
+               cc->reserve_metadata = folio_has_metadata(src);
+
        if (list_empty(&cc->freepages)) {
                isolate_freepages(cc);
diff --git a/mm/internal.h b/mm/internal.h
index d28ac0085f61..046cc264bfbe 100644
--- a/mm/internal.h
+++ b/mm/internal.h
@@ -492,6 +492,7 @@ struct compact_control {
                                         */
        bool alloc_contig;              /* alloc_contig_range allocation */
        bool source_has_metadata;       /* source pages have associated metadata */
+       bool reserve_metadata;
 };

 /*
--
2.41.0
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help