From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Keith Busch <kbusch@kernel.org>, Sasha Levin <sashal@kernel.org>,
Edmund Nadolski <edmund.nadolski@intel.com>,
Christoph Hellwig <hch@lst.de>,
linux-nvme@lists.infradead.org
Subject: [PATCH AUTOSEL 4.19 43/59] nvme: Prevent resets during paused controller state
Date: Sat, 26 Oct 2019 09:18:54 -0400 [thread overview]
Message-ID: <20191026131910.3435-43-sashal@kernel.org> (raw)
In-Reply-To: <20191026131910.3435-1-sashal@kernel.org>
From: Keith Busch <kbusch@kernel.org>
[ Upstream commit 4c75f877853cfa81b12374a07208e07b077f39b8 ]
A paused controller is doing critical internal activation work in the
background. Prevent subsequent controller resets from occurring during
this period by setting the controller state to RESETTING first. A helper
function, nvme_try_sched_reset_work(), is introduced for these paths so
they may continue with scheduling the reset_work after they've completed
their uninterruptible critical section.
Tested-by: Edmund Nadolski <edmund.nadolski@intel.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/nvme/host/core.c | 29 +++++++++++++++++++++++++----
1 file changed, 25 insertions(+), 4 deletions(-)
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index ddd5c72a565ad..95d4f1a6dd795 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -126,6 +126,21 @@ static void nvme_queue_scan(struct nvme_ctrl *ctrl)
queue_work(nvme_wq, &ctrl->scan_work);
}
+/*
+ * Use this function to proceed with scheduling reset_work for a controller
+ * that had previously been set to the resetting state. This is intended for
+ * code paths that can't be interrupted by other reset attempts. A hot removal
+ * may prevent this from succeeding.
+ */
+static int nvme_try_sched_reset(struct nvme_ctrl *ctrl)
+{
+ if (ctrl->state != NVME_CTRL_RESETTING)
+ return -EBUSY;
+ if (!queue_work(nvme_reset_wq, &ctrl->reset_work))
+ return -EBUSY;
+ return 0;
+}
+
int nvme_reset_ctrl(struct nvme_ctrl *ctrl)
{
if (!nvme_change_ctrl_state(ctrl, NVME_CTRL_RESETTING))
@@ -3445,13 +3460,13 @@ static void nvme_fw_act_work(struct work_struct *work)
if (time_after(jiffies, fw_act_timeout)) {
dev_warn(ctrl->device,
"Fw activation timeout, reset controller\n");
- nvme_reset_ctrl(ctrl);
- break;
+ nvme_try_sched_reset(ctrl);
+ return;
}
msleep(100);
}
- if (ctrl->state != NVME_CTRL_LIVE)
+ if (!nvme_change_ctrl_state(ctrl, NVME_CTRL_LIVE))
return;
nvme_start_queues(ctrl);
@@ -3467,7 +3482,13 @@ static void nvme_handle_aen_notice(struct nvme_ctrl *ctrl, u32 result)
nvme_queue_scan(ctrl);
break;
case NVME_AER_NOTICE_FW_ACT_STARTING:
- queue_work(nvme_wq, &ctrl->fw_act_work);
+ /*
+ * We are (ab)using the RESETTING state to prevent subsequent
+ * recovery actions from interfering with the controller's
+ * firmware activation.
+ */
+ if (nvme_change_ctrl_state(ctrl, NVME_CTRL_RESETTING))
+ queue_work(nvme_wq, &ctrl->fw_act_work);
break;
#ifdef CONFIG_NVME_MULTIPATH
case NVME_AER_NOTICE_ANA:
--
2.20.1
_______________________________________________
Linux-nvme mailing list
Linux-nvme@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-nvme
WARNING: multiple messages have this Message-ID (diff)
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Keith Busch <kbusch@kernel.org>,
Edmund Nadolski <edmund.nadolski@intel.com>,
Christoph Hellwig <hch@lst.de>, Sasha Levin <sashal@kernel.org>,
linux-nvme@lists.infradead.org
Subject: [PATCH AUTOSEL 4.19 43/59] nvme: Prevent resets during paused controller state
Date: Sat, 26 Oct 2019 09:18:54 -0400 [thread overview]
Message-ID: <20191026131910.3435-43-sashal@kernel.org> (raw)
In-Reply-To: <20191026131910.3435-1-sashal@kernel.org>
From: Keith Busch <kbusch@kernel.org>
[ Upstream commit 4c75f877853cfa81b12374a07208e07b077f39b8 ]
A paused controller is doing critical internal activation work in the
background. Prevent subsequent controller resets from occurring during
this period by setting the controller state to RESETTING first. A helper
function, nvme_try_sched_reset_work(), is introduced for these paths so
they may continue with scheduling the reset_work after they've completed
their uninterruptible critical section.
Tested-by: Edmund Nadolski <edmund.nadolski@intel.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/nvme/host/core.c | 29 +++++++++++++++++++++++++----
1 file changed, 25 insertions(+), 4 deletions(-)
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index ddd5c72a565ad..95d4f1a6dd795 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -126,6 +126,21 @@ static void nvme_queue_scan(struct nvme_ctrl *ctrl)
queue_work(nvme_wq, &ctrl->scan_work);
}
+/*
+ * Use this function to proceed with scheduling reset_work for a controller
+ * that had previously been set to the resetting state. This is intended for
+ * code paths that can't be interrupted by other reset attempts. A hot removal
+ * may prevent this from succeeding.
+ */
+static int nvme_try_sched_reset(struct nvme_ctrl *ctrl)
+{
+ if (ctrl->state != NVME_CTRL_RESETTING)
+ return -EBUSY;
+ if (!queue_work(nvme_reset_wq, &ctrl->reset_work))
+ return -EBUSY;
+ return 0;
+}
+
int nvme_reset_ctrl(struct nvme_ctrl *ctrl)
{
if (!nvme_change_ctrl_state(ctrl, NVME_CTRL_RESETTING))
@@ -3445,13 +3460,13 @@ static void nvme_fw_act_work(struct work_struct *work)
if (time_after(jiffies, fw_act_timeout)) {
dev_warn(ctrl->device,
"Fw activation timeout, reset controller\n");
- nvme_reset_ctrl(ctrl);
- break;
+ nvme_try_sched_reset(ctrl);
+ return;
}
msleep(100);
}
- if (ctrl->state != NVME_CTRL_LIVE)
+ if (!nvme_change_ctrl_state(ctrl, NVME_CTRL_LIVE))
return;
nvme_start_queues(ctrl);
@@ -3467,7 +3482,13 @@ static void nvme_handle_aen_notice(struct nvme_ctrl *ctrl, u32 result)
nvme_queue_scan(ctrl);
break;
case NVME_AER_NOTICE_FW_ACT_STARTING:
- queue_work(nvme_wq, &ctrl->fw_act_work);
+ /*
+ * We are (ab)using the RESETTING state to prevent subsequent
+ * recovery actions from interfering with the controller's
+ * firmware activation.
+ */
+ if (nvme_change_ctrl_state(ctrl, NVME_CTRL_RESETTING))
+ queue_work(nvme_wq, &ctrl->fw_act_work);
break;
#ifdef CONFIG_NVME_MULTIPATH
case NVME_AER_NOTICE_ANA:
--
2.20.1
next prev parent reply other threads:[~2019-10-26 13:20 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-26 13:18 [PATCH AUTOSEL 4.19 01/59] tools: bpf: Use !building_out_of_srctree to determine srctree Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 02/59] iommu/arm-smmu: Free context bitmap in the err path of arm_smmu_init_domain_context Sasha Levin
2019-10-26 13:18 ` Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 03/59] mac80211_hwsim: fix incorrect dev_alloc_name failure goto Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 04/59] nvme: fix possible deadlock when nvme_update_formats fails Sasha Levin
2019-10-26 13:18 ` Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 05/59] nvme: retain split access workaround for capability reads Sasha Levin
2019-10-26 13:18 ` Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 06/59] net: dsa: b53: Do not clear existing mirrored port mask Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 07/59] net: stmmac: gmac4+: Not all Unicast addresses may be available Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 08/59] ALSA: hda/realtek: Reduce the Headphone static noise on XPS 9350/9360 Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 09/59] ALSA: hdac: clear link output stream mapping Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 10/59] rxrpc: Fix call ref leak Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 11/59] rxrpc: Fix trace-after-put looking at the put peer record Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 12/59] rxrpc: Fix trace-after-put looking at the put connection record Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 13/59] rxrpc: Fix trace-after-put looking at the put call record Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 14/59] rxrpc: rxrpc_peer needs to hold a ref on the rxrpc_local record Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 15/59] mac80211: accept deauth frames in IBSS mode Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 16/59] mac80211: fix scan when operating on DFS channels in ETSI domains Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 17/59] llc: fix sk_buff leak in llc_sap_state_process() Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 18/59] llc: fix sk_buff leak in llc_conn_service() Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 19/59] llc: fix another potential sk_buff leak in llc_ui_sendmsg() Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 20/59] llc: fix sk_buff refcounting in llc_conn_state_process() Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 21/59] NFC: pn533: fix use-after-free and memleaks Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 22/59] ip6erspan: remove the incorrect mtu limit for ip6erspan Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 23/59] iwlwifi: dbg_ini: fix memory leak in alloc_sgtable Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 24/59] iwlwifi: pcie: fix memory leaks in iwl_pcie_ctxt_info_gen3_init Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 25/59] iwlwifi: exclude GEO SAR support for 3168 Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 26/59] drm/amdgpu/powerplay: fix typo in mvdd table setup Sasha Levin
2019-10-26 13:18 ` Sasha Levin
2019-10-26 13:18 ` Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 27/59] net: stmmac: fix length of PTP clock's name string Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 28/59] net: stmmac: fix disabling flexible PPS output Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 29/59] bonding: fix potential NULL deref in bond_update_slave_arr Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 30/59] s390/qeth: Fix error handling during VNICC initialization Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 31/59] s390/qeth: Fix initialization of vnicc cmd masks during set online Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 32/59] act_mirred: Fix mirred_init_module error handling Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 33/59] net: usb: qmi_wwan: add Telit 0x1050 composition Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 34/59] net: avoid possible false sharing in sk_leave_memory_pressure() Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 35/59] net: add {READ|WRITE}_ONCE() annotations on ->rskq_accept_head Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 36/59] net/smc: receive returns without data Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 37/59] net/smc: receive pending data after RCV_SHUTDOWN Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 38/59] drm/msm/dsi: Implement reset correctly Sasha Levin
2019-10-26 13:18 ` Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 39/59] vhost/test: stop device before reset Sasha Levin
2019-10-26 13:18 ` Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 40/59] net/ibmvnic: Fix EOI when running in XIVE mode Sasha Levin
2019-10-26 13:18 ` Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 41/59] hrtimer: Annotate lockless access to timer->base Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 42/59] nvme-pci: Free tagset if no IO queues Sasha Levin
2019-10-26 13:18 ` Sasha Levin
2019-10-26 13:18 ` Sasha Levin [this message]
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 43/59] nvme: Prevent resets during paused controller state Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 44/59] xtensa: fix {get,put}_user() for 64bit values Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 45/59] firmware: dmi: Fix unlikely out-of-bounds read in save_mem_devices Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 46/59] arm64: hibernate: check pgd table allocation Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 47/59] net: i82596: fix dma_alloc_attr for sni_82596 Sasha Levin
2019-10-26 13:18 ` [PATCH AUTOSEL 4.19 48/59] net: bcmgenet: Fix RGMII_MODE_EN value for GENET v1/2/3 Sasha Levin
2019-10-26 13:19 ` [PATCH AUTOSEL 4.19 49/59] net: usb: sr9800: fix uninitialized local variable Sasha Levin
2019-10-26 13:19 ` [PATCH AUTOSEL 4.19 50/59] md/raid0: fix warning message for parameter default_layout Sasha Levin
2019-10-26 13:19 ` [PATCH AUTOSEL 4.19 51/59] net: stmmac: disable/enable ptp_ref_clk in suspend/resume flow Sasha Levin
2019-10-26 13:19 ` [PATCH AUTOSEL 4.19 52/59] usb: hso: obey DMA rules in tiocmget Sasha Levin
2019-10-26 13:19 ` [PATCH AUTOSEL 4.19 53/59] dpaa2-eth: add irq for the dpmac connect/disconnect event Sasha Levin
2019-10-26 13:19 ` [PATCH AUTOSEL 4.19 54/59] net: stmmac: fix argument to stmmac_pcs_ctrl_ane() Sasha Levin
2019-10-26 13:19 ` [PATCH AUTOSEL 4.19 55/59] x86/hyperv: Set pv_info.name to "Hyper-V" Sasha Levin
2019-10-26 13:19 ` [PATCH AUTOSEL 4.19 56/59] net: usb: lan78xx: Connect PHY before registering MAC Sasha Levin
2019-10-26 13:19 ` [PATCH AUTOSEL 4.19 57/59] scripts/gdb: fix lx-dmesg when CONFIG_PRINTK_CALLER is set Sasha Levin
2019-10-26 13:19 ` [PATCH AUTOSEL 4.19 58/59] ocfs2: fix error handling in ocfs2_setattr() Sasha Levin
2019-10-26 13:19 ` [PATCH AUTOSEL 4.19 59/59] scripts/gdb: fix debugging modules on s390 Sasha Levin
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=20191026131910.3435-43-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=edmund.nadolski@intel.com \
--cc=hch@lst.de \
--cc=kbusch@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nvme@lists.infradead.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 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.