From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, Harsha Thyagaraja <hathyaga@in.ibm.com>,
"Guilherme G. Piccoli" <gpiccoli@linux.vnet.ibm.com>,
"David S. Miller" <davem@davemloft.net>
Subject: [PATCH 4.12 15/84] cxgb4: fix BUG() on interrupt deallocating path of ULD
Date: Wed, 19 Jul 2017 11:43:21 +0200 [thread overview]
Message-ID: <20170719092322.970033722@linuxfoundation.org> (raw)
In-Reply-To: <20170719092322.362625377@linuxfoundation.org>
4.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Guilherme G. Piccoli" <gpiccoli@linux.vnet.ibm.com>
[ Upstream commit 6a146f3a5894b751cef16feb3d7903e45e3c445c ]
Since the introduction of ULD (Upper-Layer Drivers), the MSI-X
deallocating path changed in cxgb4: the driver frees the interrupts
of ULD when unregistering it or on shutdown PCI handler.
Problem is that if a MSI-X is not freed before deallocated in the PCI
layer, it will trigger a BUG() due to still "alive" interrupt being
tentatively quiesced.
The below trace was observed when doing a simple unbind of Chelsio's
adapter PCI function, like:
"echo 001e:80:00.4 > /sys/bus/pci/drivers/cxgb4/unbind"
Trace:
kernel BUG at drivers/pci/msi.c:352!
Oops: Exception in kernel mode, sig: 5 [#1]
...
NIP [c0000000005a5e60] free_msi_irqs+0xa0/0x250
LR [c0000000005a5e50] free_msi_irqs+0x90/0x250
Call Trace:
[c0000000005a5e50] free_msi_irqs+0x90/0x250 (unreliable)
[c0000000005a72c4] pci_disable_msix+0x124/0x180
[d000000011e06708] disable_msi+0x88/0xb0 [cxgb4]
[d000000011e06948] free_some_resources+0xa8/0x160 [cxgb4]
[d000000011e06d60] remove_one+0x170/0x3c0 [cxgb4]
[c00000000058a910] pci_device_remove+0x70/0x110
[c00000000064ef04] device_release_driver_internal+0x1f4/0x2c0
...
This patch fixes the issue by refactoring the shutdown path of ULD on
cxgb4 driver, by properly freeing and disabling interrupts on PCI
remove handler too.
Fixes: 0fbc81b3ad51 ("Allocate resources dynamically for all cxgb4 ULD's")
Reported-by: Harsha Thyagaraja <hathyaga@in.ibm.com>
Signed-off-by: Guilherme G. Piccoli <gpiccoli@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 16 ++++++---
drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c | 42 ++++++++++++++----------
2 files changed, 36 insertions(+), 22 deletions(-)
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
@@ -2055,12 +2055,12 @@ static void detach_ulds(struct adapter *
mutex_lock(&uld_mutex);
list_del(&adap->list_node);
+
for (i = 0; i < CXGB4_ULD_MAX; i++)
- if (adap->uld && adap->uld[i].handle) {
+ if (adap->uld && adap->uld[i].handle)
adap->uld[i].state_change(adap->uld[i].handle,
CXGB4_STATE_DETACH);
- adap->uld[i].handle = NULL;
- }
+
if (netevent_registered && list_empty(&adapter_list)) {
unregister_netevent_notifier(&cxgb4_netevent_nb);
netevent_registered = false;
@@ -5086,8 +5086,10 @@ static void remove_one(struct pci_dev *p
*/
destroy_workqueue(adapter->workq);
- if (is_uld(adapter))
+ if (is_uld(adapter)) {
detach_ulds(adapter);
+ t4_uld_clean_up(adapter);
+ }
disable_interrupts(adapter);
@@ -5164,7 +5166,11 @@ static void shutdown_one(struct pci_dev
if (adapter->port[i]->reg_state == NETREG_REGISTERED)
cxgb_close(adapter->port[i]);
- t4_uld_clean_up(adapter);
+ if (is_uld(adapter)) {
+ detach_ulds(adapter);
+ t4_uld_clean_up(adapter);
+ }
+
disable_interrupts(adapter);
disable_msi(adapter);
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c
@@ -589,22 +589,37 @@ void t4_uld_mem_free(struct adapter *ada
kfree(adap->uld);
}
+/* This function should be called with uld_mutex taken. */
+static void cxgb4_shutdown_uld_adapter(struct adapter *adap, enum cxgb4_uld type)
+{
+ if (adap->uld[type].handle) {
+ adap->uld[type].handle = NULL;
+ adap->uld[type].add = NULL;
+ release_sge_txq_uld(adap, type);
+
+ if (adap->flags & FULL_INIT_DONE)
+ quiesce_rx_uld(adap, type);
+
+ if (adap->flags & USING_MSIX)
+ free_msix_queue_irqs_uld(adap, type);
+
+ free_sge_queues_uld(adap, type);
+ free_queues_uld(adap, type);
+ }
+}
+
void t4_uld_clean_up(struct adapter *adap)
{
unsigned int i;
- if (!adap->uld)
- return;
+ mutex_lock(&uld_mutex);
for (i = 0; i < CXGB4_ULD_MAX; i++) {
if (!adap->uld[i].handle)
continue;
- if (adap->flags & FULL_INIT_DONE)
- quiesce_rx_uld(adap, i);
- if (adap->flags & USING_MSIX)
- free_msix_queue_irqs_uld(adap, i);
- free_sge_queues_uld(adap, i);
- free_queues_uld(adap, i);
+
+ cxgb4_shutdown_uld_adapter(adap, i);
}
+ mutex_unlock(&uld_mutex);
}
static void uld_init(struct adapter *adap, struct cxgb4_lld_info *lld)
@@ -782,15 +797,8 @@ int cxgb4_unregister_uld(enum cxgb4_uld
continue;
if (type == CXGB4_ULD_ISCSIT && is_t4(adap->params.chip))
continue;
- adap->uld[type].handle = NULL;
- adap->uld[type].add = NULL;
- release_sge_txq_uld(adap, type);
- if (adap->flags & FULL_INIT_DONE)
- quiesce_rx_uld(adap, type);
- if (adap->flags & USING_MSIX)
- free_msix_queue_irqs_uld(adap, type);
- free_sge_queues_uld(adap, type);
- free_queues_uld(adap, type);
+
+ cxgb4_shutdown_uld_adapter(adap, type);
}
mutex_unlock(&uld_mutex);
next prev parent reply other threads:[~2017-07-19 9:44 UTC|newest]
Thread overview: 91+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-19 9:43 [PATCH 4.12 00/84] 4.12.3-stable review Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 01/84] staging: android: uapi: drop definitions of removed ION_IOC_{FREE,SHARE} ioctls Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 02/84] net/mlx5: Fix driver load error flow when firmware is stuck Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 03/84] net/mlx5: Cancel delayed recovery work when unloading the driver Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 04/84] net/mlx5e: Fix TX carrier errors report in get stats ndo Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 05/84] ipv6: dad: dont remove dynamic addresses if link is down Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 06/84] vxlan: fix hlist corruption Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 08/84] net: core: Fix slab-out-of-bounds in netdev_stats_to_stats64 Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 09/84] liquidio: fix bug in soft reset failure detection Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 11/84] vrf: fix bug_on triggered by rx when destroying a vrf Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 12/84] virtio-net: fix leaking of ctx array Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 13/84] rds: tcp: use sock_create_lite() to create the accept socket Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 14/84] net/mlx5e: Initialize CEEs getpermhwaddr address buffer to 0xff Greg Kroah-Hartman
2017-07-19 9:43 ` Greg Kroah-Hartman [this message]
2017-07-19 9:43 ` [PATCH 4.12 16/84] tap: convert a mutex to a spinlock Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 17/84] bridge: mdb: fix leak on complete_info ptr on fail path Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 19/84] sfc: dont read beyond unicast address list Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 20/84] Adding asm-prototypes.h for genksyms to generate crc Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 21/84] sed regex in Makefile.build requires line break between exported symbols Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 22/84] Adding the type of " Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 23/84] sparc64: Fix gup_huge_pmd Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 24/84] brcmfmac: Fix a memory leak in error handling path in brcmf_cfg80211_attach Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 25/84] brcmfmac: Fix glom_skb leak in brcmf_sdiod_recv_chain Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 26/84] x86/xen/efi: Initialize only the EFI struct members used by Xen Greg Kroah-Hartman
2017-07-19 10:37 ` Daniel Kiper
2017-07-19 11:12 ` Greg Kroah-Hartman
2017-07-19 11:19 ` Greg Kroah-Hartman
2017-07-19 11:57 ` Daniel Kiper
2017-07-19 11:28 ` Daniel Kiper
2017-07-20 8:39 ` Ingo Molnar
2017-07-20 9:16 ` Greg Kroah-Hartman
2017-07-20 9:41 ` Ingo Molnar
2017-07-20 12:33 ` Daniel Kiper
2017-07-21 6:32 ` Juergen Gross
2017-07-19 9:43 ` [PATCH 4.12 27/84] efi: Process the MEMATTR table only if EFI_MEMMAP is enabled Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 28/84] cfg80211: Define nla_policy for NL80211_ATTR_LOCAL_MESH_POWER_MODE Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 29/84] cfg80211: Validate frequencies nested in NL80211_ATTR_SCAN_FREQUENCIES Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 30/84] cfg80211: Check if PMKID attribute is of expected size Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 31/84] cfg80211: Check if NAN service ID " Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 32/84] drm/amdgpu/gfx6: properly cache mc_arb_ramcfg Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 33/84] KVM: ARM64: fix phy counter access failure in guest Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 34/84] KVM: PPC: Book3S: Fix typo in XICS-on-XIVE state saving code Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 35/84] kvm-vfio: Decouple only when we match a group Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 36/84] irqchip/gic-v3: Fix out-of-bound access in gic_set_affinity Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 37/84] parisc: Report SIGSEGV instead of SIGBUS when running out of stack Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 38/84] parisc: use compat_sys_keyctl() Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 39/84] parisc: DMA API: return error instead of BUG_ON for dma ops on non dma devs Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 40/84] parisc/mm: Ensure IRQs are off in switch_mm() Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 41/84] tools/lib/lockdep: Reduce MAX_LOCK_DEPTH to avoid overflowing lock_chain/: Depth Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 42/84] compiler, clang: always inline when CONFIG_OPTIMIZE_INLINING is disabled Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 43/84] thp, mm: fix crash due race in MADV_FREE handling Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 44/84] kernel/extable.c: mark core_kernel_text notrace Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 45/84] mm/list_lru.c: fix list_lru_count_node() to be race free Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 46/84] fs/dcache.c: fix spin lockup issue on nlru->lock Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 47/84] checkpatch: silence perl 5.26.0 unescaped left brace warnings Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 48/84] binfmt_elf: use ELF_ET_DYN_BASE only for PIE Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 49/84] arm: move ELF_ET_DYN_BASE to 4MB Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 50/84] arm64: move ELF_ET_DYN_BASE to 4GB / 4MB Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 51/84] powerpc: " Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 52/84] s390: reduce ELF_ET_DYN_BASE Greg Kroah-Hartman
2017-07-19 9:43 ` [PATCH 4.12 53/84] exec: Limit arg stack to at most 75% of _STK_LIM Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 54/84] powerpc/kexec: Fix radix to hash kexec due to IAMR/AMOR Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 55/84] ARM64: dts: marvell: armada37xx: Fix timer interrupt specifiers Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 56/84] arm64: Preventing READ_IMPLIES_EXEC propagation Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 57/84] vt: fix unchecked __put_user() in tioclinux ioctls Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 58/84] rcu: Add memory barriers for NOCB leader wakeup Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 59/84] nvmem: core: fix leaks on registration errors Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 60/84] Drivers: hv: vmbus: Close timing hole that can corrupt per-cpu page Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 61/84] mnt: In umount propagation reparent in a separate pass Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 62/84] mnt: In propgate_umount handle visiting mounts in any order Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 63/84] mnt: Make propagate_umount less slow for overlapping mount propagation trees Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 64/84] selftests/capabilities: Fix the test_execve test Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 67/84] crypto: atmel - only treat EBUSY as transient if backlog Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 68/84] crypto: sha1-ssse3 - Disable avx2 Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 71/84] KEYS: DH: validate __spare field Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 72/84] sched/headers/uapi: Fix linux/sched/types.h userspace compilation errors Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 73/84] sched/topology: Fix building of overlapping sched-groups Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 74/84] sched/topology: Optimize build_group_mask() Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 75/84] sched/topology: Fix overlapping sched_group_mask Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 76/84] PM / wakeirq: Convert to SRCU Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 77/84] pstore: Fix leaked pstore_record in pstore_get_backend_records() Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 79/84] ALSA: hda/realtek - change the location for one of two front microphones Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 80/84] PM / QoS: return -EINVAL for bogus strings Greg Kroah-Hartman
2017-07-19 9:44 ` [PATCH 4.12 84/84] kvm: vmx: allow host to access guest MSR_IA32_BNDCFGS Greg Kroah-Hartman
[not found] ` <596f88cd.48b4df0a.797d0.d5e3@mx.google.com>
2017-07-19 16:36 ` [PATCH 4.12 00/84] 4.12.3-stable review Shuah Khan
2017-07-22 15:47 ` Kevin Hilman
2017-07-24 9:11 ` Sjoerd Simons
[not found] ` <7hfudosc1k.fsf@baylibre.com>
2017-08-01 8:21 ` Jan Lübbe
2017-07-19 20:35 ` Guenter Roeck
2017-07-20 5:06 ` Greg Kroah-Hartman
2017-07-19 23:37 ` Shuah Khan
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=20170719092322.970033722@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=davem@davemloft.net \
--cc=gpiccoli@linux.vnet.ibm.com \
--cc=hathyaga@in.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).