diff options
author | Balbir Singh <bsingharora@gmail.com> | 2018-12-28 09:33:24 +0100 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-12-28 21:11:46 +0100 |
commit | 5eb570a8d9248e0c1358078a59916d0e337e695b (patch) | |
tree | 9163f5c55857e2439bd9c2d37919a6e79d08218e /mm/sparse.c | |
parent | mm/page_owner: clamp read count to PAGE_SIZE (diff) | |
download | linux-5eb570a8d9248e0c1358078a59916d0e337e695b.tar.xz linux-5eb570a8d9248e0c1358078a59916d0e337e695b.zip |
mm/hotplug: optimize clear_hwpoisoned_pages()
In hot remove, we try to clear poisoned pages, but a small optimization to
check if num_poisoned_pages is 0 helps remove the iteration through
nr_pages.
[akpm@linux-foundation.org: tweak comment text]
Link: http://lkml.kernel.org/r/20181102120001.4526-1-bsingharora@gmail.com
Signed-off-by: Balbir Singh <bsingharora@gmail.com>
Acked-by: Michal Hocko <mhocko@suse.com>
Acked-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/sparse.c')
-rw-r--r-- | mm/sparse.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/mm/sparse.c b/mm/sparse.c index 3abc8cc50201..691544a2814c 100644 --- a/mm/sparse.c +++ b/mm/sparse.c @@ -740,6 +740,15 @@ static void clear_hwpoisoned_pages(struct page *memmap, int nr_pages) if (!memmap) return; + /* + * A further optimization is to have per section refcounted + * num_poisoned_pages. But that would need more space per memmap, so + * for now just do a quick global check to speed up this routine in the + * absence of bad pages. + */ + if (atomic_long_read(&num_poisoned_pages) == 0) + return; + for (i = 0; i < nr_pages; i++) { if (PageHWPoison(&memmap[i])) { atomic_long_sub(1, &num_poisoned_pages); |