ACK: [PATCH] cxlflash: Fix to resolve dead-lock during EEH recovery
Chris J Arges
chris.j.arges at canonical.com
Mon May 23 20:51:43 UTC 2016
On Mon, May 23, 2016 at 02:30:42PM -0600, Tim Gardner wrote:
> From: "Manoj N. Kumar" <manoj at linux.vnet.ibm.com>
>
> BugLink: http://bugs.launchpad.net/bugs/1584935
>
> When a cxlflash adapter goes into EEH recovery and multiple processes
> (each having established its own context) are active, the EEH recovery
> can hang if the processes attempt to recover in parallel. The symptom
> logged after a couple of minutes is:
>
> INFO: task eehd:48 blocked for more than 120 seconds.
> Not tainted 4.5.0-491-26f710d+ #1
> "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
> eehd 0 48 2
> Call Trace:
> __switch_to+0x2f0/0x410
> __schedule+0x300/0x980
> schedule+0x48/0xc0
> rwsem_down_write_failed+0x294/0x410
> down_write+0x88/0xb0
> cxlflash_pci_error_detected+0x100/0x1c0 [cxlflash]
> cxl_vphb_error_detected+0x88/0x110 [cxl]
> cxl_pci_error_detected+0xb0/0x1d0 [cxl]
> eeh_report_error+0xbc/0x130
> eeh_pe_dev_traverse+0x94/0x160
> eeh_handle_normal_event+0x17c/0x450
> eeh_handle_event+0x184/0x370
> eeh_event_handler+0x1c8/0x1d0
> kthread+0x110/0x130
> ret_from_kernel_thread+0x5c/0xa4
> INFO: task blockio:33215 blocked for more than 120 seconds.
>
> Not tainted 4.5.0-491-26f710d+ #1
> "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
> blockio 0 33215 33213
> Call Trace:
> 0x1 (unreliable)
> __switch_to+0x2f0/0x410
> __schedule+0x300/0x980
> schedule+0x48/0xc0
> rwsem_down_read_failed+0x124/0x1d0
> down_read+0x68/0x80
> cxlflash_ioctl+0x70/0x6f0 [cxlflash]
> scsi_ioctl+0x3b0/0x4c0
> sg_ioctl+0x960/0x1010
> do_vfs_ioctl+0xd8/0x8c0
> SyS_ioctl+0xd4/0xf0
> system_call+0x38/0xb4
> INFO: task eehd:48 blocked for more than 120 seconds.
>
> The hang is because of a 3 way dead-lock:
>
> Process A holds the recovery mutex, and waits for eehd to complete.
> Process B holds the semaphore and waits for the recovery mutex.
> eehd waits for semaphore.
>
> The fix is to have Process B above release the semaphore before
> attempting to acquire the recovery mutex. This will allow
> eehd to proceed to completion.
>
> Signed-off-by: Manoj N. Kumar <manoj at linux.vnet.ibm.com>
> Reviewed-by: Matthew R. Ochs <mrochs at linux.vnet.ibm.com>
> Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>
> (cherry picked from commit 635f6b0893cff193a1774881ebb1e4a4b9a7fead)
> Signed-off-by: Tim Gardner <tim.gardner at canonical.com>
> ---
> drivers/scsi/cxlflash/superpipe.c | 15 +++++++++++++++
> 1 file changed, 15 insertions(+)
>
> diff --git a/drivers/scsi/cxlflash/superpipe.c b/drivers/scsi/cxlflash/superpipe.c
> index f4020db..8a1532a 100644
> --- a/drivers/scsi/cxlflash/superpipe.c
> +++ b/drivers/scsi/cxlflash/superpipe.c
> @@ -1590,6 +1590,13 @@ err1:
> * place at the same time and the failure was due to CXL services being
> * unable to keep up.
> *
> + * As this routine is called on ioctl context, it holds the ioctl r/w
> + * semaphore that is used to drain ioctls in recovery scenarios. The
> + * implementation to achieve the pacing described above (a local mutex)
> + * requires that the ioctl r/w semaphore be dropped and reacquired to
> + * avoid a 3-way deadlock when multiple process recoveries operate in
> + * parallel.
> + *
> * Because a user can detect an error condition before the kernel, it is
> * quite possible for this routine to act as the kernel's EEH detection
> * source (MMIO read of mbox_r). Because of this, there is a window of
> @@ -1617,9 +1624,17 @@ static int cxlflash_afu_recover(struct scsi_device *sdev,
> int rc = 0;
>
> atomic_inc(&cfg->recovery_threads);
> + up_read(&cfg->ioctl_rwsem);
> rc = mutex_lock_interruptible(mutex);
> + down_read(&cfg->ioctl_rwsem);
> if (rc)
> goto out;
> + rc = check_state(cfg);
> + if (rc) {
> + dev_err(dev, "%s: Failed state! rc=%d\n", __func__, rc);
> + rc = -ENODEV;
> + goto out;
> + }
>
> dev_dbg(dev, "%s: reason 0x%016llX rctxid=%016llX\n",
> __func__, recover->reason, rctxid);
> --
> 1.9.1
>
>
> --
> kernel-team mailing list
> kernel-team at lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
More information about the kernel-team
mailing list