• Bailey Forrest's avatar
    gve: Fix an edge case for TSO skb validity check · 36e3b949
    Bailey Forrest authored
    The NIC requires each TSO segment to not span more than 10
    descriptors. NIC further requires each descriptor to not exceed
    16KB - 1 (GVE_TX_MAX_BUF_SIZE_DQO).
    
    The descriptors for an skb are generated by
    gve_tx_add_skb_no_copy_dqo() for DQO RDA queue format.
    gve_tx_add_skb_no_copy_dqo() loops through each skb frag and
    generates a descriptor for the entire frag if the frag size is
    not greater than GVE_TX_MAX_BUF_SIZE_DQO. If the frag size is
    greater than GVE_TX_MAX_BUF_SIZE_DQO, it is split into descriptor(s)
    of size GVE_TX_MAX_BUF_SIZE_DQO and a descriptor is generated for
    the remainder (frag size % GVE_TX_MAX_BUF_SIZE_DQO).
    
    gve_can_send_tso() checks if the descriptors thus generated for an
    skb would meet the requirement that each TSO-segment not span more
    than 10 descriptors. However, the current code misses an edge case
    when a TSO segment spans multiple descriptors within a large frag.
    This change fixes the edge case.
    
    gve_can_send_tso() relies on the assumption that max gso size (9728)
    is less than GVE_TX_MAX_BUF_SIZE_DQO and therefore within an skb
    fragment a TSO segment can never span more than 2 descriptors.
    
    Fixes: a57e5de4 ("gve: DQO: Add TX path")
    Signed-off-by: default avatarPraveen Kaligineedi <pkaligineedi@google.com>
    Signed-off-by: default avatarBailey Forrest <bcf@google.com>
    Reviewed-by: default avatarJeroen de Borst <jeroendb@google.com>
    Cc: stable@vger.kernel.org
    Reviewed-by: default avatarWillem de Bruijn <willemb@google.com>
    Link: https://patch.msgid.link/20240724143431.3343722-1-pkaligineedi@google.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    36e3b949
gve_tx_dqo.c 35.6 KB