All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jiri Slaby <jslaby@suse.cz>
To: stable@vger.kernel.org
Cc: Sabrina Dubroca <sd@queasysnail.net>,
	Jeff Kirsher <jeffrey.t.kirsher@intel.com>,
	Jiri Slaby <jslaby@suse.cz>
Subject: [patch added to the 3.12 stable tree] e1000: add dummy allocator to fix race condition between mtu change and netpoll
Date: Mon,  4 May 2015 14:37:55 +0200	[thread overview]
Message-ID: <1430743082-6957-64-git-send-email-jslaby@suse.cz> (raw)
In-Reply-To: <1430743082-6957-1-git-send-email-jslaby@suse.cz>

From: Sabrina Dubroca <sd@queasysnail.net>

This patch has been added to the 3.12 stable tree. If you have any
objections, please let us know.

===============

commit 08e8331654d1d7b2c58045e549005bc356aa7810 upstream.

There is a race condition between e1000_change_mtu's cleanups and
netpoll, when we change the MTU across jumbo size:

Changing MTU frees all the rx buffers:
    e1000_change_mtu -> e1000_down -> e1000_clean_all_rx_rings ->
        e1000_clean_rx_ring

Then, close to the end of e1000_change_mtu:
    pr_info -> ... -> netpoll_poll_dev -> e1000_clean ->
        e1000_clean_rx_irq -> e1000_alloc_rx_buffers -> e1000_alloc_frag

And when we come back to do the rest of the MTU change:
    e1000_up -> e1000_configure -> e1000_configure_rx ->
        e1000_alloc_jumbo_rx_buffers

alloc_jumbo finds the buffers already != NULL, since data (shared with
page in e1000_rx_buffer->rxbuf) has been re-alloc'd, but it's garbage,
or at least not what is expected when in jumbo state.

This results in an unusable adapter (packets don't get through), and a
NULL pointer dereference on the next call to e1000_clean_rx_ring
(other mtu change, link down, shutdown):

BUG: unable to handle kernel NULL pointer dereference at           (null)
IP: [<ffffffff81194d6e>] put_compound_page+0x7e/0x330

    [...]

Call Trace:
 [<ffffffff81195445>] put_page+0x55/0x60
 [<ffffffff815d9f44>] e1000_clean_rx_ring+0x134/0x200
 [<ffffffff815da055>] e1000_clean_all_rx_rings+0x45/0x60
 [<ffffffff815df5e0>] e1000_down+0x1c0/0x1d0
 [<ffffffff811e2260>] ? deactivate_slab+0x7f0/0x840
 [<ffffffff815e21bc>] e1000_change_mtu+0xdc/0x170
 [<ffffffff81647050>] dev_set_mtu+0xa0/0x140
 [<ffffffff81664218>] do_setlink+0x218/0xac0
 [<ffffffff814459e9>] ? nla_parse+0xb9/0x120
 [<ffffffff816652d0>] rtnl_newlink+0x6d0/0x890
 [<ffffffff8104f000>] ? kvm_clock_read+0x20/0x40
 [<ffffffff810a2068>] ? sched_clock_cpu+0xa8/0x100
 [<ffffffff81663802>] rtnetlink_rcv_msg+0x92/0x260

By setting the allocator to a dummy version, netpoll can't mess up our
rx buffers.  The allocator is set back to a sane value in
e1000_configure_rx.

Fixes: edbbb3ca1077 ("e1000: implement jumbo receive with partial descriptors")
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
---
 drivers/net/ethernet/intel/e1000/e1000_main.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c
index 15c85d4f3774..b7f68883da64 100644
--- a/drivers/net/ethernet/intel/e1000/e1000_main.c
+++ b/drivers/net/ethernet/intel/e1000/e1000_main.c
@@ -144,6 +144,11 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
 static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
 				     struct e1000_rx_ring *rx_ring,
 				     int *work_done, int work_to_do);
+static void e1000_alloc_dummy_rx_buffers(struct e1000_adapter *adapter,
+					 struct e1000_rx_ring *rx_ring,
+					 int cleaned_count)
+{
+}
 static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
 				   struct e1000_rx_ring *rx_ring,
 				   int cleaned_count);
@@ -3566,8 +3571,11 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
 		msleep(1);
 	/* e1000_down has a dependency on max_frame_size */
 	hw->max_frame_size = max_frame;
-	if (netif_running(netdev))
+	if (netif_running(netdev)) {
+		/* prevent buffers from being reallocated */
+		adapter->alloc_rx_buf = e1000_alloc_dummy_rx_buffers;
 		e1000_down(adapter);
+	}
 
 	/* NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN
 	 * means we reserve 2 more, this pushes us to allocate from the next
-- 
2.3.5


  parent reply	other threads:[~2015-05-04 12:38 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-04 12:36 [patch added to the 3.12 stable tree] drivers: parport: Kconfig: exclude arm64 for PARPORT_PC Jiri Slaby
2015-05-04 12:36 ` [patch added to the 3.12 stable tree] usb: gadget: composite: enable BESL support Jiri Slaby
2015-05-04 12:36 ` [patch added to the 3.12 stable tree] nosave: consolidate __nosave_{begin,end} in <asm/sections.h> Jiri Slaby
2015-05-04 12:36 ` [patch added to the 3.12 stable tree] KVM: s390: Zero out current VMDB of STSI before including level3 data Jiri Slaby
2015-05-04 12:36 ` [patch added to the 3.12 stable tree] s390/hibernate: fix save and restore of kernel text section Jiri Slaby
2015-05-04 12:36 ` [patch added to the 3.12 stable tree] KVM: use slowpath for cross page cached accesses Jiri Slaby
2015-05-04 12:36 ` [patch added to the 3.12 stable tree] MIPS: Hibernate: flush TLB entries earlier Jiri Slaby
2015-05-04 12:36 ` [patch added to the 3.12 stable tree] cdc-wdm: fix endianness bug in debug statements Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] spi: spidev: fix possible arithmetic overflow for multi-transfer message Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] compal-laptop: Check return value of power_supply_register Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] ring-buffer: Replace this_cpu_*() with __this_cpu_*() Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] power_supply: twl4030_madc: Check return value of power_supply_register Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] power_supply: lp8788-charger: Fix leaked power supply on probe fail Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] ARM: 8320/1: fix integer overflow in ELF_ET_DYN_BASE Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] ARM: S3C64XX: Use fixed IRQ bases to avoid conflicts on Cragganmore Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] ARM: dts: dove: Fix uart[23] reg property Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: phy: Find the right match in devm_usb_phy_match Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: define a generic USB_RESUME_TIMEOUT macro Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: host: fusbh200: use new USB_RESUME_TIMEOUT Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: host: uhci: " Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: host: fotg210: " Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: host: r8a66597: " Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: host: isp116x: " Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: host: xhci: " Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: host: sl811: " Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: dwc2: hcd: " Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: core: hub: " Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] ALSA: emu10k1: don't deadlock in proc-functions Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] Input: elantech - fix absolute mode setting on some ASUS laptops Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] fs/binfmt_elf.c: fix bug in loading of PIE binaries Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] ptrace: fix race between ptrace_resume() and wait_task_stopped() Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] rtlwifi: rtl8192cu: Add new USB ID Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] rtlwifi: rtl8192cu: Add new device ID Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] arm64: vdso: fix build error when switching from LE to BE Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] ext4: make fsync to sync parent dir in no-journal for real this time Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] powerpc/perf: Cap 64bit userspace backtraces to PERF_MAX_STACK_DEPTH Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] tools lib traceevent kbuffer: Remove extra update to data pointer in PADDING Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] tools/power turbostat: Use $(CURDIR) instead of $(PWD) and add support for O= option in Makefile Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] UBI: account for bitflips in both the VID header and data Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] UBI: fix out of bounds write Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] UBI: initialize LEB number variable Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] UBI: fix check for "too many bytes" Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] scsi: storvsc: Fix a bug in copy_from_bounce_buffer() Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] target: Fix COMPARE_AND_WRITE with SG_TO_MEM_NOALLOC handling Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] Bluetooth: ath3k: Add support Atheros AR5B195 combo Mini PCIe card Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] powerpc: Fix missing L2 cache size in /sys/devices/system/cpu Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] ACPICA: Utilities: split IO address types from data type models Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] xtensa: xtfpga: fix hardware lockup caused by LCD driver Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] xtensa: provide __NR_sync_file_range2 instead of __NR_sync_file_range Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] xtensa: ISS: fix locking in TAP network adapter Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] gpio: mvebu: Fix mask/unmask managment per irq chip type Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] dm crypt: fix deadlock when async crypto algorithm returns -EBUSY Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] Drivers: hv: vmbus: Fix a bug in the error path in vmbus_open() Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] mvsas: fix panic on expander attached SATA devices Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] stk1160: Make sure current buffer is released Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] IB/core: disallow registering 0-sized memory region Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] IB/core: don't disallow registering region starting at 0x0 Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] IB/mlx4: Fix WQE LSO segment calculation Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] i2c: core: Export bus recovery functions Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] drm/radeon: fix doublescan modes (v2) Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] drm/i915: cope with large i2c transfers Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] RCU pathwalk breakage when running into a symlink overmounting something Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] ksoftirqd: Enable IRQs and call cond_resched() before poking RCU Jiri Slaby
2015-05-04 12:37 ` Jiri Slaby [this message]
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] lib: memzero_explicit: use barrier instead of OPTIMIZER_HIDE_VAR Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] wl18xx: show rx_frames_per_rates as an array as it really is Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] crypto: omap-aes - Fix support for unequal lengths Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] C6x: time: Ensure consistency in __init Jiri Slaby
2015-05-04 12:38 ` [patch added to the 3.12 stable tree] memstick: mspro_block: add missing curly braces Jiri Slaby
2015-05-04 12:38 ` [patch added to the 3.12 stable tree] driver core: bus: Goto appropriate labels on failure in bus_add_device Jiri Slaby
2015-05-04 12:38 ` [patch added to the 3.12 stable tree] fs: take i_mutex during prepare_binprm for set[ug]id executables Jiri Slaby

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1430743082-6957-64-git-send-email-jslaby@suse.cz \
    --to=jslaby@suse.cz \
    --cc=jeffrey.t.kirsher@intel.com \
    --cc=sd@queasysnail.net \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.