Patch "ixgbevf: Require large buffers for build_skb on 82599VF" has been added to the 4.19-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    ixgbevf: Require large buffers for build_skb on 82599VF

to the 4.19-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     ixgbevf-require-large-buffers-for-build_skb-on-82599.patch
and it can be found in the queue-4.19 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 10d5b1260cabc01fa416e7808fa5d2cb6330b5ef
Author: Samuel Mendoza-Jonas <samjonas@xxxxxxxxxx>
Date:   Thu Feb 3 14:49:16 2022 -0800

    ixgbevf: Require large buffers for build_skb on 82599VF
    
    [ Upstream commit fe68195daf34d5dddacd3f93dd3eafc4beca3a0e ]
    
    From 4.17 onwards the ixgbevf driver uses build_skb() to build an skb
    around new data in the page buffer shared with the ixgbe PF.
    This uses either a 2K or 3K buffer, and offsets the DMA mapping by
    NET_SKB_PAD + NET_IP_ALIGN. When using a smaller buffer RXDCTL is set to
    ensure the PF does not write a full 2K bytes into the buffer, which is
    actually 2K minus the offset.
    
    However on the 82599 virtual function, the RXDCTL mechanism is not
    available. The driver attempts to work around this by using the SET_LPE
    mailbox method to lower the maximm frame size, but the ixgbe PF driver
    ignores this in order to keep the PF and all VFs in sync[0].
    
    This means the PF will write up to the full 2K set in SRRCTL, causing it
    to write NET_SKB_PAD + NET_IP_ALIGN bytes past the end of the buffer.
    With 4K pages split into two buffers, this means it either writes
    NET_SKB_PAD + NET_IP_ALIGN bytes past the first buffer (and into the
    second), or NET_SKB_PAD + NET_IP_ALIGN bytes past the end of the DMA
    mapping.
    
    Avoid this by only enabling build_skb when using "large" buffers (3K).
    These are placed in each half of an order-1 page, preventing the PF from
    writing past the end of the mapping.
    
    [0]: Technically it only ever raises the max frame size, see
    ixgbe_set_vf_lpe() in ixgbe_sriov.c
    
    Fixes: f15c5ba5b6cd ("ixgbevf: add support for using order 1 pages to receive large frames")
    Signed-off-by: Samuel Mendoza-Jonas <samjonas@xxxxxxxxxx>
    Tested-by: Konrad Jankowski <konrad0.jankowski@xxxxxxxxx>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@xxxxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
index 7f94b445595ce..befb906acb205 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
@@ -1964,14 +1964,15 @@ static void ixgbevf_set_rx_buffer_len(struct ixgbevf_adapter *adapter,
 	if (adapter->flags & IXGBEVF_FLAGS_LEGACY_RX)
 		return;
 
-	set_ring_build_skb_enabled(rx_ring);
+	if (PAGE_SIZE < 8192)
+		if (max_frame > IXGBEVF_MAX_FRAME_BUILD_SKB)
+			set_ring_uses_large_buffer(rx_ring);
 
-	if (PAGE_SIZE < 8192) {
-		if (max_frame <= IXGBEVF_MAX_FRAME_BUILD_SKB)
-			return;
+	/* 82599 can't rely on RXDCTL.RLPML to restrict the size of the frame */
+	if (adapter->hw.mac.type == ixgbe_mac_82599_vf && !ring_uses_large_buffer(rx_ring))
+		return;
 
-		set_ring_uses_large_buffer(rx_ring);
-	}
+	set_ring_build_skb_enabled(rx_ring);
 }
 
 /**



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux