]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: lan743x: Fix memleak issue when GSO enabled
authorThangaraj Samynathan <thangaraj.s@microchip.com>
Tue, 29 Apr 2025 05:25:27 +0000 (10:55 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 9 May 2025 07:44:01 +0000 (09:44 +0200)
[ Upstream commit 2d52e2e38b85c8b7bc00dca55c2499f46f8c8198 ]

Always map the `skb` to the LS descriptor. Previously skb was
mapped to EXT descriptor when the number of fragments is zero with
GSO enabled. Mapping the skb to EXT descriptor prevents it from
being freed, leading to a memory leak

Fixes: 23f0703c125b ("lan743x: Add main source files for new lan743x driver")
Signed-off-by: Thangaraj Samynathan <thangaraj.s@microchip.com>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Link: https://patch.msgid.link/20250429052527.10031-1-thangaraj.s@microchip.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/microchip/lan743x_main.c
drivers/net/ethernet/microchip/lan743x_main.h

index 92010bfe5e4133c024a0344c6daa698f9bc3157c..5d2ceff72784f23d4af0a57b0a80900a2b631c69 100644 (file)
@@ -1949,6 +1949,7 @@ static void lan743x_tx_frame_add_lso(struct lan743x_tx *tx,
        if (nr_frags <= 0) {
                tx->frame_data0 |= TX_DESC_DATA0_LS_;
                tx->frame_data0 |= TX_DESC_DATA0_IOC_;
+               tx->frame_last = tx->frame_first;
        }
        tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail];
        tx_descriptor->data0 = cpu_to_le32(tx->frame_data0);
@@ -2018,6 +2019,7 @@ static int lan743x_tx_frame_add_fragment(struct lan743x_tx *tx,
                tx->frame_first = 0;
                tx->frame_data0 = 0;
                tx->frame_tail = 0;
+               tx->frame_last = 0;
                return -ENOMEM;
        }
 
@@ -2058,16 +2060,18 @@ static void lan743x_tx_frame_end(struct lan743x_tx *tx,
            TX_DESC_DATA0_DTYPE_DATA_) {
                tx->frame_data0 |= TX_DESC_DATA0_LS_;
                tx->frame_data0 |= TX_DESC_DATA0_IOC_;
+               tx->frame_last = tx->frame_tail;
        }
 
-       tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail];
-       buffer_info = &tx->buffer_info[tx->frame_tail];
+       tx_descriptor = &tx->ring_cpu_ptr[tx->frame_last];
+       buffer_info = &tx->buffer_info[tx->frame_last];
        buffer_info->skb = skb;
        if (time_stamp)
                buffer_info->flags |= TX_BUFFER_INFO_FLAG_TIMESTAMP_REQUESTED;
        if (ignore_sync)
                buffer_info->flags |= TX_BUFFER_INFO_FLAG_IGNORE_SYNC;
 
+       tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail];
        tx_descriptor->data0 = cpu_to_le32(tx->frame_data0);
        tx->frame_tail = lan743x_tx_next_index(tx, tx->frame_tail);
        tx->last_tail = tx->frame_tail;
index 3b2c6046eb3ad55f20b66c6df766dca4be11200f..b6c83c68241e63fe463e0bd4797c91a2b4ccaa4d 100644 (file)
@@ -974,6 +974,7 @@ struct lan743x_tx {
        u32             frame_first;
        u32             frame_data0;
        u32             frame_tail;
+       u32             frame_last;
 
        struct lan743x_tx_buffer_info *buffer_info;