lkml.org 
[lkml]   [2008]   [Mar]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] [7/13] Implement compat hooks for GFP_DMA
    Date

    Add code to the normal allocation path to call the mask allocator
    transparently for GFP_DMA allocations.

    This is only a temporary measure and will go away as soon as all
    the drivers are converted to use the mask allocator or one
    of its callers (like PCI DMA API) directly.

    But currently it is the only sane way to do a bisectable step by
    step conversion of the GFP_DMA users in tree.

    Right now the special pagevec free function won't handle mask allocated
    pages.

    Signed-off-by: Andi Kleen <ak@suse.de>

    ---
    include/linux/page-flags.h | 4 ++++
    mm/page_alloc.c | 18 ++++++++++++++++++
    2 files changed, 22 insertions(+)

    Index: linux/mm/page_alloc.c
    ===================================================================
    --- linux.orig/mm/page_alloc.c
    +++ linux/mm/page_alloc.c
    @@ -499,6 +499,12 @@ static void __free_pages_ok(struct page
    int i;
    int reserved = 0;

    + /* Compat code for now. Will go away */
    + if (unlikely(PageMaskAlloc(page))) {
    + __free_pages_mask(page, PAGE_SIZE << order);
    + return;
    + }
    +
    for (i = 0 ; i < (1 << order) ; ++i)
    reserved += free_pages_check(page + i, 1 << PG_mask_alloc);
    if (reserved)
    @@ -1422,6 +1428,13 @@ __alloc_pages(gfp_t gfp_mask, unsigned i
    if (should_fail_alloc_page(gfp_mask, order))
    return NULL;

    +#ifdef CONFIG_MASK_ALLOC
    + /* Compat code for now. Will go away. */
    + if (unlikely(gfp_mask & GFP_DMA))
    + return alloc_pages_mask(gfp_mask & ~__GFP_DMA,
    + PAGE_SIZE << order, TRAD_DMA_MASK);
    +#endif
    +
    restart:
    z = zonelist->zones; /* the list of zones suitable for gfp_mask */

    @@ -1635,6 +1648,11 @@ void __pagevec_free(struct pagevec *pvec

    void __free_pages(struct page *page, unsigned int order)
    {
    + /* Compat code for now. Will go away */
    + if (unlikely(PageMaskAlloc(page))) {
    + __free_pages_mask(page, PAGE_SIZE << order);
    + return;
    + }
    if (put_page_testzero(page)) {
    if (order == 0)
    free_hot_page(page);
    Index: linux/include/linux/page-flags.h
    ===================================================================
    --- linux.orig/include/linux/page-flags.h
    +++ linux/include/linux/page-flags.h
    @@ -257,9 +257,13 @@ static inline void SetPageUptodate(struc
    #define __SetPageCompound(page) __set_bit(PG_compound, &(page)->flags)
    #define __ClearPageCompound(page) __clear_bit(PG_compound, &(page)->flags)

    +#ifdef CONFIG_MASK_ALLOC
    #define PageMaskAlloc(page) test_bit(PG_mask_alloc, &(page)->flags)
    #define __SetPageMaskAlloc(page) __set_bit(PG_mask_alloc, &(page)->flags)
    #define __ClearPageMaskAlloc(page) __clear_bit(PG_mask_alloc, &(page)->flags)
    +#else
    +#define PageMaskAlloc(page) 0
    +#endif

    /*
    * PG_reclaim is used in combination with PG_compound to mark the

    \
     
     \ /
      Last update: 2008-03-07 10:19    [W:0.024 / U:0.352 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site