lkml.org 
[lkml]   [2011]   [Jan]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/5] tm: Utilize the dma_addr_t array for pages that are to in DMA32 pool.
    Date
    We only use the "if (pool == NULL)" path for right now.

    Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    ---
    drivers/gpu/drm/ttm/ttm_page_alloc.c | 26 +++++++++++++++++++++++---
    1 files changed, 23 insertions(+), 3 deletions(-)

    diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
    index 6859288..5d09677 100644
    --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
    +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
    @@ -683,14 +683,22 @@ int ttm_get_pages(struct list_head *pages, int flags,
    gfp_flags |= GFP_HIGHUSER;

    for (r = 0; r < count; ++r) {
    - p = alloc_page(gfp_flags);
    + if ((flags & TTM_PAGE_FLAG_DMA32) && dma_address) {
    + void *addr;
    + addr = dma_alloc_coherent(NULL, PAGE_SIZE,
    + &dma_address[r],
    + gfp_flags);
    + if (addr == NULL)
    + return -ENOMEM;
    + p = virt_to_page(addr);
    + } else
    + p = alloc_page(gfp_flags);
    if (!p) {

    printk(KERN_ERR TTM_PFX
    "Unable to allocate page.");
    return -ENOMEM;
    }
    -
    list_add(&p->lru, pages);
    }
    return 0;
    @@ -739,12 +747,24 @@ void ttm_put_pages(struct list_head *pages, unsigned page_count, int flags,
    unsigned long irq_flags;
    struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
    struct page *p, *tmp;
    + unsigned r;

    if (pool == NULL) {
    /* No pool for this memory type so free the pages */

    + r = page_count-1;
    list_for_each_entry_safe(p, tmp, pages, lru) {
    - __free_page(p);
    + if ((flags & TTM_PAGE_FLAG_DMA32) && dma_address) {
    + void *addr = page_address(p);
    + WARN_ON(!addr || !dma_address[r]);
    + if (addr)
    + dma_free_coherent(NULL, PAGE_SIZE,
    + addr,
    + dma_address[r]);
    + dma_address[r] = 0;
    + } else
    + __free_page(p);
    + r--;
    }
    /* Make the pages list empty */
    INIT_LIST_HEAD(pages);
    --
    1.7.1


    \
     
     \ /
      Last update: 2011-01-07 18:17    [W:2.940 / U:0.364 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site