Commit 2d52e2e3 authored by Thangaraj Samynathan's avatar Thangaraj Samynathan Committed by Jakub Kicinski
Browse files

net: lan743x: Fix memleak issue when GSO enabled



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: 23f0703c ("lan743x: Add main source files for new lan743x driver")
Signed-off-by: default avatarThangaraj Samynathan <thangaraj.s@microchip.com>
Reviewed-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Link: https://patch.msgid.link/20250429052527.10031-1-thangaraj.s@microchip.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent e98386d7
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -1815,6 +1815,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);
@@ -1884,6 +1885,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;
	}

@@ -1924,16 +1926,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;
+1 −0
Original line number Diff line number Diff line
@@ -980,6 +980,7 @@ struct lan743x_tx {
	u32		frame_first;
	u32		frame_data0;
	u32		frame_tail;
	u32		frame_last;

	struct lan743x_tx_buffer_info *buffer_info;