On Mon, Jun 30, 2025 at 02:59:54PM +0200, David Hildenbrand wrote: > We can just look at the balloon device (stored in page->private), to see > if the page is still part of the balloon. > > As isolated balloon pages cannot get released (they are taken off the > balloon list while isolated), we don't have to worry about this case in > the putback and migration callback. Add a WARN_ON_ONCE for now. > > Signed-off-by: David Hildenbrand <da...@redhat.com>
Seems reasonable, one comment below re: comment. Reviewed-by: Lorenzo Stoakes <lorenzo.stoa...@oracle.com> > --- > include/linux/balloon_compaction.h | 4 +--- > mm/balloon_compaction.c | 11 +++++++++++ > 2 files changed, 12 insertions(+), 3 deletions(-) > > diff --git a/include/linux/balloon_compaction.h > b/include/linux/balloon_compaction.h > index bfc6e50bd004b..9bce8e9f5018c 100644 > --- a/include/linux/balloon_compaction.h > +++ b/include/linux/balloon_compaction.h > @@ -136,10 +136,8 @@ static inline gfp_t balloon_mapping_gfp_mask(void) > */ > static inline void balloon_page_finalize(struct page *page) > { > - if (IS_ENABLED(CONFIG_BALLOON_COMPACTION)) { > - __ClearPageMovable(page); > + if (IS_ENABLED(CONFIG_BALLOON_COMPACTION)) > set_page_private(page, 0); > - } > /* PageOffline is sticky until the page is freed to the buddy. */ > } > > diff --git a/mm/balloon_compaction.c b/mm/balloon_compaction.c > index ec176bdb8a78b..e4f1a122d786b 100644 > --- a/mm/balloon_compaction.c > +++ b/mm/balloon_compaction.c > @@ -206,6 +206,9 @@ static bool balloon_page_isolate(struct page *page, > isolate_mode_t mode) > struct balloon_dev_info *b_dev_info = balloon_page_device(page); > unsigned long flags; > > + if (!b_dev_info) > + return false; > + > spin_lock_irqsave(&b_dev_info->pages_lock, flags); > list_del(&page->lru); > b_dev_info->isolated_pages++; > @@ -219,6 +222,10 @@ static void balloon_page_putback(struct page *page) > struct balloon_dev_info *b_dev_info = balloon_page_device(page); > unsigned long flags; > > + /* Isolated balloon pages cannot get deflated. */ > + if (WARN_ON_ONCE(!b_dev_info)) > + return; > + > spin_lock_irqsave(&b_dev_info->pages_lock, flags); > list_add(&page->lru, &b_dev_info->pages); > b_dev_info->isolated_pages--; > @@ -234,6 +241,10 @@ static int balloon_page_migrate(struct page *newpage, > struct page *page, > VM_BUG_ON_PAGE(!PageLocked(page), page); > VM_BUG_ON_PAGE(!PageLocked(newpage), newpage); > > + /* Isolated balloon pages cannot get deflated. */ Hm do you mean migrated? > + if (WARN_ON_ONCE(!balloon)) > + return -EAGAIN; > + > return balloon->migratepage(balloon, newpage, page, mode); > } > > -- > 2.49.0 >