• Bailey Forrest's avatar
    gve: DQO: Add RX path · 9b8dd5e5
    Bailey Forrest authored
    The RX queue has an array of `gve_rx_buf_state_dqo` objects. All
    allocated pages have an associated buf_state object. When a buffer is
    posted on the RX buffer queue, the buffer ID will be the buf_state's
    index into the RX queue's array.
    
    On packet reception, the RX queue will have one descriptor for each
    buffer associated with a received packet. Each RX descriptor will have
    a buffer_id that was posted on the buffer queue.
    
    Notable mentions:
    
    - We use a default buffer size of 2048 bytes. Based on page size, we
      may post separate sections of a single page as separate buffers.
    
    - The driver holds an extra reference on pages passed up the receive
      path with an skb and keeps these pages on a list. When posting new
      buffers to the NIC, we check if any of these pages has only our
      reference, or another buffer sized segment of the page has no
      references. If so, it is free to reuse. This page recycling approach
      is a common netdev optimization that reduces page alloc/free calls.
    
    - Pages in the free list have a page_count bias in order to avoid an
      atomic increment of pagecount every time we attempt to reuse a page.
      # references = page_count() - bias
    
    - In order to track when a page is safe to reuse, we keep track of the
      last offset which had a single SKB reference. When this occurs, it
      implies that every single other offset is reusable. Otherwise, we
      don't know if offsets can be safely reused.
    
    - We maintain two free lists of pages. List #1 (recycled_buf_states)
      contains pages we know can be reused right away. List #2
      (used_buf_states) contains pages which cannot be used right away. We
      only attempt to get pages from list #2 when list #1 is empty. We only
      attempt to use a small fixed number pages from list #2 before giving
      up and allocating a new page. Both lists are FIFOs in hope that by the
      time we attempt to reuse a page, the references were dropped.
    Signed-off-by: default avatarBailey Forrest <bcf@google.com>
    Reviewed-by: default avatarWillem de Bruijn <willemb@google.com>
    Reviewed-by: default avatarCatherine Sullivan <csully@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    9b8dd5e5
gve_utils.h 816 Bytes