lkml.org 
[lkml]   [2009]   [Jul]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: [PATCH] mm: Warn once when a page is freed with PG_mlocked set V2
    Date
    > 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/





    \
     
     \ /
      Last update: 2009-07-16 09:41    [W:0.038 / U:0.176 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site