From: Oscar Salvador <osalvador@suse.de>
To: Mike Kravetz <mike.kravetz@oracle.com>
Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org,
Michal Hocko <mhocko@kernel.org>,
Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>,
Muchun Song <songmuchun@bytedance.com>,
David Hildenbrand <david@redhat.com>,
Matthew Wilcox <willy@infradead.org>,
Miaohe Lin <linmiaohe@huawei.com>,
Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH v3 3/5] hugetlb: only set HPageMigratable for migratable hstates
Date: Tue, 26 Jan 2021 09:20:18 +0100 [thread overview]
Message-ID: <20210126082018.GB9519@linux> (raw)
In-Reply-To: <20210122195231.324857-4-mike.kravetz@oracle.com>
On Fri, Jan 22, 2021 at 11:52:29AM -0800, Mike Kravetz wrote:
> The HP_Migratable flag indicates a page is a candidate for migration.
> Only set the flag if the page's hstate supports migration. This allows
> the migration paths to detect non-migratable pages earlier. If migration
> is not supported for the hstate, HP_Migratable will not be set, the page
> will not be isolated and no attempt will be made to migrate. We should
> never get to unmap_and_move_huge_page for a page where migration is not
> supported, so throw a warning if we do.
>
> Signed-off-by: Mike Kravetz <mike.kravetz@oracle.com>
I wish there was a better way to do this like opencode it at fault path,
but as you mentioned that is troublesome.
I am not a big fan of the name either, too long for my taste but I cannot
come up with anything better so:
Reviewed-by: Oscar Salvador <osalvador@suse.de>
> ---
> fs/hugetlbfs/inode.c | 2 +-
> include/linux/hugetlb.h | 9 +++++++++
> mm/hugetlb.c | 8 ++++----
> mm/migrate.c | 9 ++++-----
> 4 files changed, 18 insertions(+), 10 deletions(-)
>
> diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
> index e1d7ed2a53a9..93f7b8d3c5fd 100644
> --- a/fs/hugetlbfs/inode.c
> +++ b/fs/hugetlbfs/inode.c
> @@ -735,7 +735,7 @@ static long hugetlbfs_fallocate(struct file *file, int mode, loff_t offset,
>
> mutex_unlock(&hugetlb_fault_mutex_table[hash]);
>
> - SetHPageMigratable(page);
> + SetHPageMigratableIfSupported(page);
> /*
> * unlock_page because locked by add_to_page_cache()
> * put_page() due to reference from alloc_huge_page()
> diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
> index 58be44a915d1..cd1960541f2a 100644
> --- a/include/linux/hugetlb.h
> +++ b/include/linux/hugetlb.h
> @@ -740,6 +740,15 @@ static inline bool hugepage_migration_supported(struct hstate *h)
> return arch_hugetlb_migration_supported(h);
> }
>
> +/*
> + * Only set HPageMigratable if migration supported for page
> + */
> +static inline void SetHPageMigratableIfSupported(struct page *page)
> +{
> + if (hugepage_migration_supported(page_hstate(page)))
> + SetHPageMigratable(page);
> +}
> +
> /*
> * Movability check is different as compared to migration check.
> * It determines whether or not a huge page should be placed on
> diff --git a/mm/hugetlb.c b/mm/hugetlb.c
> index f1a3c8230dbf..4da1a29ac5e2 100644
> --- a/mm/hugetlb.c
> +++ b/mm/hugetlb.c
> @@ -4194,7 +4194,7 @@ static vm_fault_t hugetlb_cow(struct mm_struct *mm, struct vm_area_struct *vma,
> make_huge_pte(vma, new_page, 1));
> page_remove_rmap(old_page, true);
> hugepage_add_new_anon_rmap(new_page, vma, haddr);
> - SetHPageMigratable(new_page);
> + SetHPageMigratableIfSupported(new_page);
> /* Make the old page be freed below */
> new_page = old_page;
> }
> @@ -4436,7 +4436,7 @@ static vm_fault_t hugetlb_no_page(struct mm_struct *mm,
> * been isolated for migration.
> */
> if (new_page)
> - SetHPageMigratable(page);
> + SetHPageMigratableIfSupported(page);
>
> unlock_page(page);
> out:
> @@ -4747,7 +4747,7 @@ int hugetlb_mcopy_atomic_pte(struct mm_struct *dst_mm,
> update_mmu_cache(dst_vma, dst_addr, dst_pte);
>
> spin_unlock(ptl);
> - SetHPageMigratable(page);
> + SetHPageMigratableIfSupported(page);
> if (vm_shared)
> unlock_page(page);
> ret = 0;
> @@ -5589,7 +5589,7 @@ void putback_active_hugepage(struct page *page)
> {
> VM_BUG_ON_PAGE(!PageHead(page), page);
> spin_lock(&hugetlb_lock);
> - SetHPageMigratable(page);
> + SetHPageMigratableIfSupported(page);
> list_move_tail(&page->lru, &(page_hstate(page))->hugepage_activelist);
> spin_unlock(&hugetlb_lock);
> put_page(page);
> diff --git a/mm/migrate.c b/mm/migrate.c
> index a3e1acc72ad7..c8d19e83f372 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -1275,13 +1275,12 @@ static int unmap_and_move_huge_page(new_page_t get_new_page,
> struct address_space *mapping = NULL;
>
> /*
> - * Migratability of hugepages depends on architectures and their size.
> - * This check is necessary because some callers of hugepage migration
> - * like soft offline and memory hotremove don't walk through page
> - * tables or check whether the hugepage is pmd-based or not before
> - * kicking migration.
> + * Support for migration should be checked at isolation time.
> + * Therefore, we should never get here if migration is not supported
> + * for the page.
> */
> if (!hugepage_migration_supported(page_hstate(hpage))) {
> + VM_WARN_ON(1);
> list_move_tail(&hpage->lru, ret);
> return -ENOSYS;
> }
> --
> 2.29.2
>
>
--
Oscar Salvador
SUSE L3
next prev parent reply other threads:[~2021-01-26 8:20 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-22 19:52 [PATCH v3 0/5] create hugetlb flags to consolidate state Mike Kravetz
2021-01-22 19:52 ` [PATCH v3 1/5] hugetlb: use page.private for hugetlb specific page flags Mike Kravetz
2021-01-26 8:17 ` Oscar Salvador
2021-01-27 10:20 ` Michal Hocko
2021-01-27 23:01 ` Mike Kravetz
2021-01-27 10:26 ` Michal Hocko
2021-01-22 19:52 ` [PATCH v3 2/5] hugetlb: convert page_huge_active() HPageMigratable flag Mike Kravetz
2021-01-27 10:25 ` Michal Hocko
2021-01-27 23:27 ` Mike Kravetz
2021-01-22 19:52 ` [PATCH v3 3/5] hugetlb: only set HPageMigratable for migratable hstates Mike Kravetz
2021-01-26 8:20 ` Oscar Salvador [this message]
2021-01-27 10:35 ` Michal Hocko
2021-01-27 23:36 ` Mike Kravetz
2021-01-28 5:52 ` Oscar Salvador
2021-01-28 21:37 ` Andrew Morton
2021-01-28 22:00 ` Mike Kravetz
2021-01-28 22:15 ` Andrew Morton
2021-01-29 9:09 ` Michal Hocko
2021-01-29 18:46 ` Mike Kravetz
2021-02-01 11:49 ` Michal Hocko
2021-02-04 1:11 ` Mike Kravetz
2021-01-22 19:52 ` [PATCH v3 4/5] hugetlb: convert PageHugeTemporary() to HPageTemporary flag Mike Kravetz
2021-01-23 3:15 ` [External] " Muchun Song
2021-01-27 10:39 ` Michal Hocko
2021-01-22 19:52 ` [PATCH v3 5/5] hugetlb: convert PageHugeFreed to HPageFreed flag Mike Kravetz
2021-01-27 10:41 ` Michal Hocko
2021-01-27 23:37 ` Mike Kravetz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210126082018.GB9519@linux \
--to=osalvador@suse.de \
--cc=akpm@linux-foundation.org \
--cc=david@redhat.com \
--cc=linmiaohe@huawei.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@kernel.org \
--cc=mike.kravetz@oracle.com \
--cc=n-horiguchi@ah.jp.nec.com \
--cc=songmuchun@bytedance.com \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.