lkml.org 
[lkml]   [2014]   [Mar]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 2/6] mm: add get_pageblock_migratetype_nolock() for cases where locking is undesirable
    On Fri, Feb 28, 2014 at 03:15:00PM +0100, Vlastimil Babka wrote:
    > In order to prevent race with set_pageblock_migratetype, most of calls to
    > get_pageblock_migratetype have been moved under zone->lock. For the remaining
    > call sites, the extra locking is undesirable, notably in free_hot_cold_page().
    >
    > This patch introduces a _nolock version to be used on these call sites, where
    > a wrong value does not affect correctness. The function makes sure that the
    > value does not exceed valid migratetype numbers. Such too-high values are
    > assumed to be a result of race and caller-supplied fallback value is returned
    > instead.
    >
    > Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
    > ---
    > include/linux/mmzone.h | 24 ++++++++++++++++++++++++
    > mm/compaction.c | 14 +++++++++++---
    > mm/memory-failure.c | 3 ++-
    > mm/page_alloc.c | 22 +++++++++++++++++-----
    > mm/vmstat.c | 2 +-
    > 5 files changed, 55 insertions(+), 10 deletions(-)
    >
    > diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
    > index fac5509..7c3f678 100644
    > --- a/include/linux/mmzone.h
    > +++ b/include/linux/mmzone.h
    > @@ -75,6 +75,30 @@ enum {
    >
    > extern int page_group_by_mobility_disabled;
    >
    > +/*
    > + * When called without zone->lock held, a race with set_pageblock_migratetype
    > + * may result in bogus values. Use this variant only when this does not affect
    > + * correctness, and taking zone->lock would be costly. Values >= MIGRATE_TYPES
    > + * are considered to be a result of this race and the value of race_fallback
    > + * argument is returned instead.
    > + */
    > +static inline int get_pageblock_migratetype_nolock(struct page *page,
    > + int race_fallback)
    > +{
    > + int ret = get_pageblock_flags_group(page, PB_migrate, PB_migrate_end);
    > +
    > + if (unlikely(ret >= MIGRATE_TYPES))
    > + ret = race_fallback;
    > +
    > + return ret;
    > +}

    How about below forms?

    get_pageblock_migratetype_locked(struct page *page)
    get_pageblock_migratetype(struct page *page, int race_fallback)

    get_pageblock_migratetype() and _nolock looks error-prone because developer
    who try to use get_pageblock_migratetype() may not know that it needs lock.

    Thanks.


    \
     
     \ /
      Last update: 2014-03-09 16:06    [W:4.411 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site