Skip to contentSkip to conversation

Patch "ixgbe: Fix skb list corruption on Power systems" has been added to the 4.14-stable tree

PATCH [email protected] 1 participant 1 message Nov 27, 2017

Subsystems (3)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

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

ixgbe: Fix skb list corruption on Power systems

to the 4.14-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:
ixgbe-fix-skb-list-corruption-on-power-systems.patch
and it can be found in the queue-4.14 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From 0a9a17e3bb4564caf4bfe2a6783ae1287667d188 Mon Sep 17 00:00:00 2001

From: Brian King <[email protected]>
Date: Fri, 17 Nov 2017 11:05:43 -0600
Subject: ixgbe: Fix skb list corruption on Power systems

From: Brian King <[email protected]>

commit 0a9a17e3bb4564caf4bfe2a6783ae1287667d188 upstream.

This patch fixes an issue seen on Power systems with ixgbe which results in skb list corruption and an eventual kernel oops. The following is what was observed:

CPU 1                                   CPU2
============================            ============================
1: ixgbe_xmit_frame_ring                ixgbe_clean_tx_irq
2:  first->skb = skb                     eop_desc = tx_buffer->next_to_watch
3:  ixgbe_tx_map                         read_barrier_depends()
4:   wmb                                 check adapter written status bit
5:   first->next_to_watch = tx_desc      napi_consume_skb(tx_buffer->skb ..);

6: writel(i, tx_ring->tail);

The read_barrier_depends is insufficient to ensure that tx_buffer->skb does not get loaded prior to tx_buffer->next_to_watch, which then results in loading a stale skb pointer. This patch replaces the read_barrier_depends with smp_rmb to ensure loads are ordered with respect to the load of tx_buffer->next_to_watch.

---
 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +1 -1
@@ -1192,7 +1192,7 @@ static bool ixgbe_clean_tx_irq(struct ix
 			break;
 
 		/* prevent any other reads prior to eop_desc */
-		read_barrier_depends();
+		smp_rmb();
 
 		/* if DD is not set pending work has not been completed */
 		if (!(eop_desc->wb.status & cpu_to_le32(IXGBE_TXD_STAT_DD)))

Patches currently in stable-queue which might be from [email protected] are

queue-4.14/i40evf-use-smp_rmb-rather-than-read_barrier_depends.patch queue-4.14/igb-use-smp_rmb-rather-than-read_barrier_depends.patch queue-4.14/ixgbevf-use-smp_rmb-rather-than-read_barrier_depends.patch queue-4.14/igbvf-use-smp_rmb-rather-than-read_barrier_depends.patch queue-4.14/fm10k-use-smp_rmb-rather-than-read_barrier_depends.patch queue-4.14/ixgbe-fix-skb-list-corruption-on-power-systems.patch queue-4.14/i40e-use-smp_rmb-rather-than-read_barrier_depends.patch