FAILED: patch "[PATCH] qed: fix LL2 RX buffer allocation" failed to apply to 4.19-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-4.19.y
git checkout FETCH_HEAD
git cherry-pick -x 2f3389c73832ad90b63208c0fc281ad080114c7a
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023102029-display-provolone-fab2@gregkh' --subject-prefix 'PATCH 4.19.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 2f3389c73832ad90b63208c0fc281ad080114c7a Mon Sep 17 00:00:00 2001
From: Manish Chopra <[email protected]>
Date: Fri, 13 Oct 2023 18:48:12 +0530
Subject: [PATCH] qed: fix LL2 RX buffer allocation
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Driver allocates the LL2 rx buffers from kmalloc() area to construct the skb using slab_build_skb()
The required size allocation seems to have overlooked for accounting both skb_shared_info size and device placement padding bytes which results into the below panic when doing skb_put() for a standard MTU sized frame.
skbuff: skb_over_panic: text:ffffffffc0b0225f len:1514 put:1514 head:ff3dabceaf39c000 data:ff3dabceaf39c042 tail:0x62c end:0x566 dev:<NULL>
…
skb_panic+0x48/0x4a skb_put.cold+0x10/0x10 qed_ll2b_complete_rx_packet+0x14f/0x260 [qed] qed_ll2_rxq_handle_completion.constprop.0+0x169/0x200 [qed] qed_ll2_rxq_completion+0xba/0x320 [qed] qed_int_sp_dpc+0x1a7/0x1e0 [qed]
This patch fixes this by accouting skb_shared_info and device placement padding size bytes when allocating the buffers.
drivers/net/ethernet/qlogic/qed/qed_ll2.c +5 -2
@@ -113,7 +113,10 @@ static void qed_ll2b_complete_tx_packet(void *cxt,static int qed_ll2_alloc_buffer (struct qed_dev *cdev,u8 **data,dma_addr_t *phys_addr) { - *data =kmalloc (cdev->ll2->rx_size,GFP_ATOMIC ); +size_t size = cdev->ll2->rx_size +NET_SKB_PAD + +SKB_DATA_ALIGN (sizeof (struct skb_shared_info )); + + *data =kmalloc (size,GFP_ATOMIC );if (!(*data)) {DP_INFO (cdev,"Failed to allocate LL2 buffer data\n" );return -ENOMEM ;
@@ -2589,7 +2592,7 @@ static int qed_ll2_start(struct qed_dev *cdev, struct qed_ll2_params *params)INIT_LIST_HEAD (&cdev->ll2->list);spin_lock_init (&cdev->ll2->lock); - cdev->ll2->rx_size =NET_SKB_PAD +ETH_HLEN + + cdev->ll2->rx_size =PRM_DMA_PAD_BYTES_NUM +ETH_HLEN +L1_CACHE_BYTES + params->mtu;/* Allocate memory for LL2.