• Harish Chegondi's avatar
    IB/hfi1: Fix the bail out code in pin_vector_pages() function · 04a646df
    Harish Chegondi authored
    In pin_vector_pages() function, if there is any error while pinning the
    pages or while adding a pinned buffer to the cache, the bail out code
    needs to unpin any pinned pages that are not in the cache and adjust the
    n_locked counter that counts the total pages pinned. The current bail
    out code doesn't seem to be doing it right in two cases:
    
    1. Before pinning required pages for a buffer, the SDMA pinned buffer
    cache is searched to see if the virtual address range that needs to be
    pinned is already pinned. If there isn't a hit in the cache, a new node
    is created for the buffer and is added to the cache after the buffer is
    pinned. If adding the new node to the cache fails, the n_locked count is
    decremented properly but the pinned pages are not freed. This commit
    fixes this issue.
    
    2. If there is a hit in the SDMA cache, but the cached buffer doesn't
    have enough pages to cover the entire address range that needs to be
    pinned, the node for the cached buffer is extracted from the cache,
    remaining pages needed are pinned and added to the node. The node is
    finally added back into the cache. If there is an error pinning the
    extra pages, the bail out code frees all the pages in the node but the
    n_locked count is not being decremented by the no of pages in the node
    that are freed. This commit fixes this issue.
    
    This commit fixes the above two issues by creating a new function that
    frees the pages in a node and decrements the n_locked count by the
    number of pages freed.
    Reviewed-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
    Signed-off-by: default avatarHarish Chegondi <harish.chegondi@intel.com>
    Signed-off-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
    Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
    04a646df
user_sdma.c 46.8 KB