[lkml]   [2007]   [Mar]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[PATCH 1/3] add pfn_valid_within helper for sub-MAX_ORDER hole detection

    Generally we work under the assumption that memory the mem_map
    array is contigious and valid out to MAX_ORDER_NR_PAGES block
    of pages, ie. that if we have validated any page within this
    MAX_ORDER_NR_PAGES block we need not check any other. This is not
    true when CONFIG_HOLES_IN_ZONE is set and we must check each and
    every reference we make from a pfn.

    Add a pfn_valid_within() helper which should be used when scanning
    pages within a MAX_ORDER_NR_PAGES block when we have already
    checked the validility of the block normally with pfn_valid().
    This can then be optimised away when we do not have holes within
    a MAX_ORDER_NR_PAGES block of pages.

    Signed-off-by: Andy Whitcroft <>
    Acked-by: Mel Gorman <>
    diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
    index 7206c77..8c87d79 100644
    --- a/include/linux/mmzone.h
    +++ b/include/linux/mmzone.h
    @@ -837,6 +837,18 @@ void sparse_init(void);
    void memory_present(int nid, unsigned long start, unsigned long end);
    unsigned long __init node_memmap_size_bytes(int, unsigned long, unsigned long);

    + * If it is possible to have holes within a MAX_ORDER_NR_PAGES, then we
    + * need to check pfn validility within that MAX_ORDER_NR_PAGES block.
    + * pfn_valid_within() should be used in this case; we optimise this away
    + * when we have no holes within a MAX_ORDER_NR_PAGES block.
    + */
    +#define pfn_valid_within(pfn) pfn_valid(pfn)
    +#define pfn_valid_within(pfn) (1)
    #endif /* !__ASSEMBLY__ */
    #endif /* __KERNEL__ */
    #endif /* _LINUX_MMZONE_H */
    diff --git a/mm/page_alloc.c b/mm/page_alloc.c
    index 3d7a9e2..695b5a6 100644
    --- a/mm/page_alloc.c
    +++ b/mm/page_alloc.c
    @@ -206,10 +206,8 @@ static int page_outside_zone_boundaries(struct zone *zone, struct page *page)

    static int page_is_consistent(struct zone *zone, struct page *page)
    - if (!pfn_valid(page_to_pfn(page)))
    + if (!pfn_valid_within(page_to_pfn(page)))
    return 0;
    if (zone != page_zone(page))
    return 0;

    @@ -411,10 +409,8 @@ __find_combined_index(unsigned long page_idx, unsigned int order)
    static inline int page_is_buddy(struct page *page, struct page *buddy,
    int order)
    - if (!pfn_valid(page_to_pfn(buddy)))
    + if (!pfn_valid_within(page_to_pfn(buddy)))
    return 0;

    if (page_zone_id(page) != page_zone_id(buddy))
    return 0;
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to
    More majordomo info at
    Please read the FAQ at
     \ /
      Last update: 2007-03-21 20:19    [W:0.020 / U:35.428 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site