lkml.org 
[lkml]   [2020]   [May]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] staging: gasket: Convert get_user_pages*() --> pin_user_pages*()
    Date
    This code was using get_user_pages_fast(), in a "Case 2" scenario
    (DMA/RDMA), using the categorization from [1]. That means that it's
    time to convert the get_user_pages_fast() + put_page() calls to
    pin_user_pages_fast() + unpin_user_page() calls.

    There is some helpful background in [2]: basically, this is a small
    part of fixing a long-standing disconnect between pinning pages, and
    file systems' use of those pages.

    [1] Documentation/core-api/pin_user_pages.rst

    [2] "Explicit pinning of user-space pages":
    https://lwn.net/Articles/807108/

    Signed-off-by: Souptick Joarder <jrdr.linux@gmail.com>
    Cc: John Hubbard <jhubbard@nvidia.com>

    Hi,

    I'm compile tested this, but unable to run-time test, so any testing
    help is much appriciated.
    ---
    drivers/staging/gasket/gasket_page_table.c | 6 +++---
    1 file changed, 3 insertions(+), 3 deletions(-)

    diff --git a/drivers/staging/gasket/gasket_page_table.c b/drivers/staging/gasket/gasket_page_table.c
    index f6d7157..d712ad4 100644
    --- a/drivers/staging/gasket/gasket_page_table.c
    +++ b/drivers/staging/gasket/gasket_page_table.c
    @@ -449,7 +449,7 @@ static bool gasket_release_page(struct page *page)

    if (!PageReserved(page))
    SetPageDirty(page);
    - put_page(page);
    + unpin_user_page(page);

    return true;
    }
    @@ -486,12 +486,12 @@ static int gasket_perform_mapping(struct gasket_page_table *pg_tbl,
    ptes[i].dma_addr = pg_tbl->coherent_pages[0].paddr +
    off + i * PAGE_SIZE;
    } else {
    - ret = get_user_pages_fast(page_addr - offset, 1,
    + ret = pin_user_pages_fast(page_addr - offset, 1,
    FOLL_WRITE, &page);

    if (ret <= 0) {
    dev_err(pg_tbl->device,
    - "get user pages failed for addr=0x%lx, offset=0x%lx [ret=%d]\n",
    + "pin user pages failed for addr=0x%lx, offset=0x%lx [ret=%d]\n",
    page_addr, offset, ret);
    return ret ? ret : -ENOMEM;
    }
    --
    1.9.1
    \
     
     \ /
      Last update: 2020-05-27 22:55    [W:4.144 / U:1.516 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site