lkml.org 
[lkml]   [2020]   [Nov]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 05/48] gianfar: Account for Tx PTP timestamp in the skb headroom
    Date
    From: Claudiu Manoil <claudiu.manoil@nxp.com>

    [ Upstream commit d6a076d68c6b5d6a5800f3990a513facb7016dea ]

    When PTP timestamping is enabled on Tx, the controller
    inserts the Tx timestamp at the beginning of the frame
    buffer, between SFD and the L2 frame header. This means
    that the skb provided by the stack is required to have
    enough headroom otherwise a new skb needs to be created
    by the driver to accommodate the timestamp inserted by h/w.
    Up until now the driver was relying on the second option,
    using skb_realloc_headroom() to create a new skb to accommodate
    PTP frames. Turns out that this method is not reliable, as
    reallocation of skbs for PTP frames along with the required
    overhead (skb_set_owner_w, consume_skb) is causing random
    crashes in subsequent skb_*() calls, when multiple concurrent
    TCP streams are run at the same time on the same device
    (as seen in James' report).
    Note that these crashes don't occur with a single TCP stream,
    nor with multiple concurrent UDP streams, but only when multiple
    TCP streams are run concurrently with the PTP packet flow
    (doing skb reallocation).
    This patch enforces the first method, by requesting enough
    headroom from the stack to accommodate PTP frames, and so avoiding
    skb_realloc_headroom() & co, and the crashes no longer occur.
    There's no reason not to set needed_headroom to a large enough
    value to accommodate PTP frames, so in this regard this patch
    is a fix.

    Reported-by: James Jurack <james.jurack@ametek.com>
    Fixes: bee9e58c9e98 ("gianfar:don't add FCB length to hard_header_len")
    Signed-off-by: Claudiu Manoil <claudiu.manoil@nxp.com>
    Link: https://lore.kernel.org/r/20201020173605.1173-1-claudiu.manoil@nxp.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/ethernet/freescale/gianfar.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    --- a/drivers/net/ethernet/freescale/gianfar.c
    +++ b/drivers/net/ethernet/freescale/gianfar.c
    @@ -1388,7 +1388,7 @@ static int gfar_probe(struct platform_de

    if (dev->features & NETIF_F_IP_CSUM ||
    priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER)
    - dev->needed_headroom = GMAC_FCB_LEN;
    + dev->needed_headroom = GMAC_FCB_LEN + GMAC_TXPAL_LEN;

    /* Initializing some of the rx/tx queue level parameters */
    for (i = 0; i < priv->num_tx_queues; i++) {

    \
     
     \ /
      Last update: 2020-11-09 14:07    [W:5.048 / U:0.808 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site