Skip to content
  • Mitko Haralanov's avatar
    IB/hfi1: Extract and reinsert MMU RB node on lookup · f53af85e
    Mitko Haralanov authored
    
    
    The page pinning function, which also maintains the pin cache,
    behaves one of two ways when an exact buffer match is not found:
      1. If no node is not found (a buffer with the same starting address
         is not found in the cache), a new node is created, the buffer
         pages are pinned, and the node is inserted into the RB tree, or
      2. If a node is found but the buffer in that node is a subset of
         the new user buffer, the node is extended with the new buffer
         pages.
    
    Both modes of operation require (re-)insertion into the interval RB
    tree.
    
    When the node being inserted is a new node, the operations are pretty
    simple. However, when the node is already existing and is being
    extended, special care must be taken.
    
    First, we want to guard against an asynchronous attempt to
    delete the node by the MMU invalidation notifier. The simplest way to
    do this is to remove the node from the RB tree, preventing the search
    algorithm from finding it.
    
    Second, the node needs to be re-inserted so it lands in the proper place
    in the tree and the tree is correctly re-balanced. This also requires
    the node to be removed from the RB tree.
    
    This commit adds the hfi1_mmu_rb_extract() function, which will search
    for a node in the interval RB tree matching an address and length and
    remove it from the RB tree if found. This allows for both of the above
    special cases be handled in a single step.
    
    Reviewed-by: default avatarDean Luick <dean.luick@intel.com>
    Signed-off-by: default avatarMitko Haralanov <mitko.haralanov@intel.com>
    Signed-off-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
    Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
    f53af85e