• Bailey Forrest's avatar
    gve: DQO: Add TX path · a57e5de4
    Bailey Forrest authored
    TX SKBs will have their buffers DMA mapped with the device. Each buffer
    will have at least one TX descriptor associated. Each SKB will also have
    a metadata descriptor.
    
    Each TX queue maintains an array of `gve_tx_pending_packet_dqo` objects.
    Every TX SKB will have an associated pending_packet object. A TX SKB's
    descriptors will use its pending_packet's index as the completion tag,
    which will be returned on the TX completion queue.
    
    The device implements a "flow-miss model". Most packets will simply
    receive a packet completion. The flow-miss system may choose to process
    a packet based on its contents. A TX packet which experiences a flow
    miss would receive a miss completion followed by a later reinjection
    completion. The miss-completion is received when the packet starts to be
    processed by the flow-miss system and the reinjection completion is
    received when the flow-miss system completes processing the packet and
    sends it on the wire.
    
    Notable mentions:
    
    - Buffers may be freed after receiving the miss-completion, but in order
      to avoid packet reordering, we do not complete the SKB until receiving
      the reinjection completion.
    
    - The driver must robustly handle the unlikely scenario where a miss
      completion does not have an associated reinjection completion. This is
      accomplished by maintaining a list of packets which have a pending
      reinjection completion. After a short timeout (5 seconds), the
      SKB and buffers are released and the pending_packet is moved to a
      second list which has a longer timeout (60 seconds), where the
      pending_packet will not be reused. When the longer timeout elapses,
      the driver may assume the reinjection completion would never be
      received and the pending_packet may be reused.
    
    - Completion handling is triggered by an interrupt and is done in the
      NAPI poll function. Because the TX path and completion exist in
      different threading contexts they maintain their own lists for free
      pending_packet objects. The TX path uses a lock-free approach to steal
      the list from the completion path.
    
    - Both the TSO context and general context descriptors have metadata
      bytes. The device requires that if multiple descriptors contain the
      same field, each descriptor must have the same value set for that
      field.
    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>
    a57e5de4
gve_tx_dqo.c 28.2 KB