Messages in this thread | | | From | KOSAKI Motohiro <> | Subject | Re: [PATCH] mm: Warn once when a page is freed with PG_mlocked set V2 | Date | Thu, 16 Jul 2009 16:37:57 +0900 (JST) |
| |
> From eee677ddea61b1331a3bd8e402a0d02437fe872a Mon Sep 17 00:00:00 2001 > From: Johannes Weiner <hannes@cmpxchg.org> > Date: Wed, 15 Jul 2009 23:40:28 +0200 > Subject: [patch] mm: non-atomic test-clear of PG_mlocked on free > > By the time PG_mlocked is cleared in the page freeing path, nobody > else is looking at our page->flags anymore. > > It is thus safe to make the test-and-clear non-atomic and thereby > removing an unnecessary and expensive operation from a hotpath.
I like this patch. but can you please separate two following patches? - introduce __TESTCLEARFLAG() - non-atomic test-clear of PG_mlocked on free
> > Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> > --- > include/linux/page-flags.h | 12 +++++++++--- > mm/page_alloc.c | 4 ++-- > 2 files changed, 11 insertions(+), 5 deletions(-) > > diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h > index e2e5ce5..10e6011 100644 > --- a/include/linux/page-flags.h > +++ b/include/linux/page-flags.h > @@ -158,6 +158,9 @@ static inline int TestSetPage##uname(struct page *page) \ > static inline int TestClearPage##uname(struct page *page) \ > { return test_and_clear_bit(PG_##lname, &page->flags); } > > +#define __TESTCLEARFLAG(uname, lname) \ > +static inline int __TestClearPage##uname(struct page *page) \ > + { return __test_and_clear_bit(PG_##lname, &page->flags); } > > #define PAGEFLAG(uname, lname) TESTPAGEFLAG(uname, lname) \ > SETPAGEFLAG(uname, lname) CLEARPAGEFLAG(uname, lname) > @@ -184,6 +187,9 @@ static inline void __ClearPage##uname(struct page *page) { } > #define TESTCLEARFLAG_FALSE(uname) \ > static inline int TestClearPage##uname(struct page *page) { return 0; } > > +#define __TESTCLEARFLAG_FALSE(uname) \ > +static inline int __TestClearPage##uname(struct page *page) { return 0; } > + > struct page; /* forward declaration */ > > TESTPAGEFLAG(Locked, locked) TESTSETFLAG(Locked, locked) > @@ -250,11 +256,11 @@ PAGEFLAG(Unevictable, unevictable) __CLEARPAGEFLAG(Unevictable, unevictable) > #ifdef CONFIG_HAVE_MLOCKED_PAGE_BIT > #define MLOCK_PAGES 1 > PAGEFLAG(Mlocked, mlocked) __CLEARPAGEFLAG(Mlocked, mlocked) > - TESTSCFLAG(Mlocked, mlocked) > + TESTSCFLAG(Mlocked, mlocked) __TESTCLEARFLAG(Mlocked, mlocked) > #else > #define MLOCK_PAGES 0 > -PAGEFLAG_FALSE(Mlocked) > - SETPAGEFLAG_NOOP(Mlocked) TESTCLEARFLAG_FALSE(Mlocked) > +PAGEFLAG_FALSE(Mlocked) SETPAGEFLAG_NOOP(Mlocked) > + TESTCLEARFLAG_FALSE(Mlocked) __TESTCLEARFLAG_FALSE(Mlocked) > #endif > > #ifdef CONFIG_IA64_UNCACHED_ALLOCATOR > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index caa9268..b0c8758 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -557,7 +557,7 @@ static void __free_pages_ok(struct page *page, unsigned int order) > unsigned long flags; > int i; > int bad = 0; > - int wasMlocked = TestClearPageMlocked(page); > + int wasMlocked = __TestClearPageMlocked(page); > > kmemcheck_free_shadow(page, order); > > @@ -1021,7 +1021,7 @@ static void free_hot_cold_page(struct page *page, int cold) > struct zone *zone = page_zone(page); > struct per_cpu_pages *pcp; > unsigned long flags; > - int wasMlocked = TestClearPageMlocked(page); > + int wasMlocked = __TestClearPageMlocked(page); > > kmemcheck_free_shadow(page, 0); > > -- > 1.6.3 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/
| |