All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/6] scsi: ufs: atomic update for clkgating_enable
@ 2020-09-15 20:45 Jaegeuk Kim
  2020-09-15 20:45 ` [PATCH 2/6] scsi: ufs: clear UAC for FFU Jaegeuk Kim
                   ` (4 more replies)
  0 siblings, 5 replies; 12+ messages in thread
From: Jaegeuk Kim @ 2020-09-15 20:45 UTC (permalink / raw)
  To: linux-kernel, linux-scsi, kernel-team
  Cc: Jaegeuk Kim, Alim Akhtar, Avri Altman

From: Jaegeuk Kim <jaegeuk@google.com>

When giving a stress test which enables/disables clkgating, we hit device
timeout sometimes. This patch avoids subtle racy condition to address it.

Cc: Alim Akhtar <alim.akhtar@samsung.com>
Cc: Avri Altman <avri.altman@wdc.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
---
 drivers/scsi/ufs/ufshcd.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 1d157ff58d817..d929c3d1e58cc 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -1791,19 +1791,19 @@ static ssize_t ufshcd_clkgate_enable_store(struct device *dev,
 		return -EINVAL;
 
 	value = !!value;
+
+	spin_lock_irqsave(hba->host->host_lock, flags);
 	if (value == hba->clk_gating.is_enabled)
 		goto out;
 
-	if (value) {
-		ufshcd_release(hba);
-	} else {
-		spin_lock_irqsave(hba->host->host_lock, flags);
+	if (value)
+		hba->clk_gating.active_reqs--;
+	else
 		hba->clk_gating.active_reqs++;
-		spin_unlock_irqrestore(hba->host->host_lock, flags);
-	}
 
 	hba->clk_gating.is_enabled = value;
 out:
+	spin_unlock_irqrestore(hba->host->host_lock, flags);
 	return count;
 }
 
-- 
2.28.0.618.gf4bc123cb7-goog


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/6] scsi: ufs: clear UAC for FFU
  2020-09-15 20:45 [PATCH 1/6] scsi: ufs: atomic update for clkgating_enable Jaegeuk Kim
@ 2020-09-15 20:45 ` Jaegeuk Kim
  2020-09-15 20:45 ` [PATCH 3/6] scsi: ufs: use WQ_HIGHPRI for gating work Jaegeuk Kim
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 12+ messages in thread
From: Jaegeuk Kim @ 2020-09-15 20:45 UTC (permalink / raw)
  To: linux-kernel, linux-scsi, kernel-team
  Cc: Jaegeuk Kim, Alim Akhtar, Avri Altman

From: Jaegeuk Kim <jaegeuk@google.com>

In order to conduct FFU or RPMB operations, UFS needs to clear UAC. This patch
clears it explicitly, so that we could get no failure given early execution.

Cc: Alim Akhtar <alim.akhtar@samsung.com>
Cc: Avri Altman <avri.altman@wdc.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
---
 drivers/scsi/ufs/ufshcd.c | 41 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index d929c3d1e58cc..5deba03a61f75 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -7385,6 +7385,45 @@ static int ufshcd_add_lus(struct ufs_hba *hba)
 	return ret;
 }
 
+static int
+ufshcd_send_request_sense(struct ufs_hba *hba, struct scsi_device *sdp);
+
+static int ufshcd_clear_uac(struct ufs_hba *hba)
+{
+	struct scsi_device *sdp;
+	unsigned long flags;
+	int ret = 0;
+
+	spin_lock_irqsave(hba->host->host_lock, flags);
+	sdp = hba->sdev_ufs_device;
+	if (sdp) {
+		ret = scsi_device_get(sdp);
+		if (!ret && !scsi_device_online(sdp)) {
+			ret = -ENODEV;
+			scsi_device_put(sdp);
+		}
+	} else {
+		ret = -ENODEV;
+	}
+	spin_unlock_irqrestore(hba->host->host_lock, flags);
+	if (ret)
+		goto out_err;
+
+	if (hba->wlun_dev_clr_ua) {
+		ret = ufshcd_send_request_sense(hba, sdp);
+		if (ret)
+			goto out;
+		/* Unit attention condition is cleared now */
+		hba->wlun_dev_clr_ua = false;
+	}
+out:
+	scsi_device_put(sdp);
+out_err:
+	if (ret)
+		dev_err(hba->dev, "%s: Failed UAC clear ret = %d\n", __func__, ret);
+	return ret;
+}
+
 /**
  * ufshcd_probe_hba - probe hba to detect device and initialize
  * @hba: per-adapter instance
@@ -7500,6 +7539,8 @@ static void ufshcd_async_scan(void *data, async_cookie_t cookie)
 		pm_runtime_put_sync(hba->dev);
 		ufshcd_exit_clk_scaling(hba);
 		ufshcd_hba_exit(hba);
+	} else {
+		ufshcd_clear_uac(hba);
 	}
 }
 
-- 
2.28.0.618.gf4bc123cb7-goog


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3/6] scsi: ufs: use WQ_HIGHPRI for gating work
  2020-09-15 20:45 [PATCH 1/6] scsi: ufs: atomic update for clkgating_enable Jaegeuk Kim
  2020-09-15 20:45 ` [PATCH 2/6] scsi: ufs: clear UAC for FFU Jaegeuk Kim
@ 2020-09-15 20:45 ` Jaegeuk Kim
  2020-09-15 20:45 ` [PATCH 4/6] scsi: ufs: fix LINERESET on hibern8 Jaegeuk Kim
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 12+ messages in thread
From: Jaegeuk Kim @ 2020-09-15 20:45 UTC (permalink / raw)
  To: linux-kernel, linux-scsi, kernel-team
  Cc: Jaegeuk Kim, Alim Akhtar, Avri Altman

From: Jaegeuk Kim <jaegeuk@google.com>

Must have WQ_MEM_RECLAIM
``WQ_MEM_RECLAIM``
  All wq which might be used in the memory reclaim paths **MUST**
  have this flag set.  The wq is guaranteed to have at least one
  execution context regardless of memory pressure.

Cc: Alim Akhtar <alim.akhtar@samsung.com>
Cc: Avri Altman <avri.altman@wdc.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
---
 drivers/scsi/ufs/ufshcd.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 5deba03a61f75..848e33ec40639 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -1849,7 +1849,7 @@ static void ufshcd_init_clk_gating(struct ufs_hba *hba)
 	snprintf(wq_name, ARRAY_SIZE(wq_name), "ufs_clk_gating_%d",
 		 hba->host->host_no);
 	hba->clk_gating.clk_gating_workq = alloc_ordered_workqueue(wq_name,
-							   WQ_MEM_RECLAIM);
+					WQ_MEM_RECLAIM | WQ_HIGHPRI);
 
 	hba->clk_gating.is_enabled = true;
 
-- 
2.28.0.618.gf4bc123cb7-goog


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 4/6] scsi: ufs: fix LINERESET on hibern8
  2020-09-15 20:45 [PATCH 1/6] scsi: ufs: atomic update for clkgating_enable Jaegeuk Kim
  2020-09-15 20:45 ` [PATCH 2/6] scsi: ufs: clear UAC for FFU Jaegeuk Kim
  2020-09-15 20:45 ` [PATCH 3/6] scsi: ufs: use WQ_HIGHPRI for gating work Jaegeuk Kim
@ 2020-09-15 20:45 ` Jaegeuk Kim
  2020-09-18  4:12   ` Jaegeuk Kim
  2020-09-15 20:45 ` [PATCH 5/6] scsi: ufs: show ufs part info in error case Jaegeuk Kim
  2020-09-15 20:45 ` [PATCH 6/6] scsi: add more contexts in the ufs tracepoints Jaegeuk Kim
  4 siblings, 1 reply; 12+ messages in thread
From: Jaegeuk Kim @ 2020-09-15 20:45 UTC (permalink / raw)
  To: linux-kernel, linux-scsi, kernel-team
  Cc: Jaegeuk Kim, Alim Akhtar, Avri Altman

From: Jaegeuk Kim <jaegeuk@google.com>

When testing infinite test to read sysfs entries of UFS, I got a UFS timeout
with the following kernel message.

query: dev_cmd_send: seq_no=78082 tag=31, idn=2
query: ufshcd_wait_for_dev_cmd: dev_cmd request timedout, tag 31
query: __ufshcd_query_descriptor: opcode 0x01 for idn 2 failed, index 0, err = -11
 --  hibern8: dme: dme_send: cmd_id=0x17 idn=0
query: ufshcd_query_descriptor: failed with error -11, retries 3
 --  hibern8: ufshcd_update_uic_error: LINERESET during hibern8 enter
 --  hibern8: __ufshcd_uic_hibern8_enter: hibern8 enter failed. ret = -110

The problem is casued by hibern8 command issued by ufshcd_suspend(), which is
not aware of query command. If autohibern8 is enabled, we actually don't need
to issue hibern8 command by suspend.

Cc: Alim Akhtar <alim.akhtar@samsung.com>
Cc: Avri Altman <avri.altman@wdc.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
---
 drivers/scsi/ufs/ufshcd.c | 20 ++++++++++++++++++--
 drivers/scsi/ufs/ufshcd.h |  1 +
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 848e33ec40639..bdc82cc3824aa 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -3079,8 +3079,12 @@ int ufshcd_query_descriptor_retry(struct ufs_hba *hba,
 	int retries;
 
 	for (retries = QUERY_REQ_RETRIES; retries > 0; retries--) {
-		err = __ufshcd_query_descriptor(hba, opcode, idn, index,
+		err = -EAGAIN;
+		down_read(&hba->query_lock);
+		if (!ufshcd_is_link_hibern8(hba))
+			err = __ufshcd_query_descriptor(hba, opcode, idn, index,
 						selector, desc_buf, buf_len);
+		up_read(&hba->query_lock);
 		if (!err || err == -EINVAL)
 			break;
 	}
@@ -8263,8 +8267,8 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
 	enum ufs_pm_level pm_lvl;
 	enum ufs_dev_pwr_mode req_dev_pwr_mode;
 	enum uic_link_state req_link_state;
+	bool need_upwrite = false;
 
-	hba->pm_op_in_progress = 1;
 	if (!ufshcd_is_shutdown_pm(pm_op)) {
 		pm_lvl = ufshcd_is_runtime_pm(pm_op) ?
 			 hba->rpm_lvl : hba->spm_lvl;
@@ -8275,6 +8279,15 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
 		req_link_state = UIC_LINK_OFF_STATE;
 	}
 
+	if (ufshcd_is_runtime_pm(pm_op) &&
+			req_link_state == UIC_LINK_HIBERN8_STATE &&
+			hba->capabilities & MASK_AUTO_HIBERN8_SUPPORT) {
+		need_upwrite = true;
+		if (!down_write_trylock(&hba->query_lock))
+			return -EBUSY;
+	}
+	hba->pm_op_in_progress = 1;
+
 	/*
 	 * If we can't transition into any of the low power modes
 	 * just gate the clocks.
@@ -8403,6 +8416,8 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
 	}
 
 	hba->pm_op_in_progress = 0;
+	if (need_upwrite)
+		up_write(&hba->query_lock);
 
 	if (ret)
 		ufshcd_update_reg_hist(&hba->ufs_stats.suspend_err, (u32)ret);
@@ -8894,6 +8909,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
 	mutex_init(&hba->dev_cmd.lock);
 
 	init_rwsem(&hba->clk_scaling_lock);
+	init_rwsem(&hba->query_lock);
 
 	ufshcd_init_clk_gating(hba);
 
diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
index 363589c0bd370..6f8e05eaf9661 100644
--- a/drivers/scsi/ufs/ufshcd.h
+++ b/drivers/scsi/ufs/ufshcd.h
@@ -754,6 +754,7 @@ struct ufs_hba {
 	bool is_urgent_bkops_lvl_checked;
 
 	struct rw_semaphore clk_scaling_lock;
+	struct rw_semaphore query_lock;
 	unsigned char desc_size[QUERY_DESC_IDN_MAX];
 	atomic_t scsi_block_reqs_cnt;
 
-- 
2.28.0.618.gf4bc123cb7-goog


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 5/6] scsi: ufs: show ufs part info in error case
  2020-09-15 20:45 [PATCH 1/6] scsi: ufs: atomic update for clkgating_enable Jaegeuk Kim
                   ` (2 preceding siblings ...)
  2020-09-15 20:45 ` [PATCH 4/6] scsi: ufs: fix LINERESET on hibern8 Jaegeuk Kim
@ 2020-09-15 20:45 ` Jaegeuk Kim
  2020-09-16 10:34   ` Bean Huo
  2020-09-15 20:45 ` [PATCH 6/6] scsi: add more contexts in the ufs tracepoints Jaegeuk Kim
  4 siblings, 1 reply; 12+ messages in thread
From: Jaegeuk Kim @ 2020-09-15 20:45 UTC (permalink / raw)
  To: linux-kernel, linux-scsi, kernel-team
  Cc: Jaegeuk Kim, Alim Akhtar, Avri Altman

From: Jaegeuk Kim <jaegeuk@google.com>

This patch shows ufs part info in kernel messages for debugging purpose.
It's useful when we only have the last kernel message.

Cc: Alim Akhtar <alim.akhtar@samsung.com>
Cc: Avri Altman <avri.altman@wdc.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
---
 drivers/scsi/ufs/ufshcd.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index bdc82cc3824aa..b81c116b976ff 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -500,6 +500,14 @@ static void ufshcd_print_tmrs(struct ufs_hba *hba, unsigned long bitmap)
 static void ufshcd_print_host_state(struct ufs_hba *hba)
 {
 	dev_err(hba->dev, "UFS Host state=%d\n", hba->ufshcd_state);
+	if (hba->sdev_ufs_device) {
+		dev_err(hba->dev, " vendor = %.8s\n",
+					hba->sdev_ufs_device->vendor);
+		dev_err(hba->dev, " model = %.16s\n",
+					hba->sdev_ufs_device->model);
+		dev_err(hba->dev, " rev = %.4s\n",
+					hba->sdev_ufs_device->rev);
+	}
 	dev_err(hba->dev, "outstanding reqs=0x%lx tasks=0x%lx\n",
 		hba->outstanding_reqs, hba->outstanding_tasks);
 	dev_err(hba->dev, "saved_err=0x%x, saved_uic_err=0x%x\n",
-- 
2.28.0.618.gf4bc123cb7-goog


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 6/6] scsi: add more contexts in the ufs tracepoints
  2020-09-15 20:45 [PATCH 1/6] scsi: ufs: atomic update for clkgating_enable Jaegeuk Kim
                   ` (3 preceding siblings ...)
  2020-09-15 20:45 ` [PATCH 5/6] scsi: ufs: show ufs part info in error case Jaegeuk Kim
@ 2020-09-15 20:45 ` Jaegeuk Kim
  4 siblings, 0 replies; 12+ messages in thread
From: Jaegeuk Kim @ 2020-09-15 20:45 UTC (permalink / raw)
  To: linux-kernel, linux-scsi, kernel-team
  Cc: Jaegeuk Kim, Alim Akhtar, Avri Altman

From: Jaegeuk Kim <jaegeuk@google.com>

This adds user-friendly tracepoints with group id.

Cc: Alim Akhtar <alim.akhtar@samsung.com>
Cc: Avri Altman <avri.altman@wdc.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
---
 drivers/scsi/ufs/ufshcd.c  |  6 ++++--
 include/trace/events/ufs.h | 21 +++++++++++++++++----
 2 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index b81c116b976ff..d70ca62c4c6d0 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -336,7 +336,7 @@ static void ufshcd_add_command_trace(struct ufs_hba *hba,
 		unsigned int tag, const char *str)
 {
 	sector_t lba = -1;
-	u8 opcode = 0;
+	u8 opcode = 0, group_id = 0;
 	u32 intr, doorbell;
 	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
 	struct scsi_cmnd *cmd = lrbp->cmd;
@@ -362,13 +362,15 @@ static void ufshcd_add_command_trace(struct ufs_hba *hba,
 				lba = cmd->request->bio->bi_iter.bi_sector;
 			transfer_len = be32_to_cpu(
 				lrbp->ucd_req_ptr->sc.exp_data_transfer_len);
+			if (opcode == WRITE_10)
+				group_id = lrbp->cmd->cmnd[6];
 		}
 	}
 
 	intr = ufshcd_readl(hba, REG_INTERRUPT_STATUS);
 	doorbell = ufshcd_readl(hba, REG_UTP_TRANSFER_REQ_DOOR_BELL);
 	trace_ufshcd_command(dev_name(hba->dev), str, tag,
-				doorbell, transfer_len, intr, lba, opcode);
+			doorbell, transfer_len, intr, lba, opcode, group_id);
 }
 
 static void ufshcd_print_clk_freqs(struct ufs_hba *hba)
diff --git a/include/trace/events/ufs.h b/include/trace/events/ufs.h
index 84841b3a7ffd5..50654f3526392 100644
--- a/include/trace/events/ufs.h
+++ b/include/trace/events/ufs.h
@@ -11,6 +11,15 @@
 
 #include <linux/tracepoint.h>
 
+#define str_opcode(opcode)						\
+	__print_symbolic(opcode,					\
+		{ WRITE_16,		"WRITE_16" },			\
+		{ WRITE_10,		"WRITE_10" },			\
+		{ READ_16,		"READ_16" },			\
+		{ READ_10,		"READ_10" },			\
+		{ SYNCHRONIZE_CACHE,	"SYNC" },			\
+		{ UNMAP,		"UNMAP" })
+
 #define UFS_LINK_STATES			\
 	EM(UIC_LINK_OFF_STATE)		\
 	EM(UIC_LINK_ACTIVE_STATE)	\
@@ -215,9 +224,10 @@ DEFINE_EVENT(ufshcd_template, ufshcd_init,
 TRACE_EVENT(ufshcd_command,
 	TP_PROTO(const char *dev_name, const char *str, unsigned int tag,
 			u32 doorbell, int transfer_len, u32 intr, u64 lba,
-			u8 opcode),
+			u8 opcode, u8 group_id),
 
-	TP_ARGS(dev_name, str, tag, doorbell, transfer_len, intr, lba, opcode),
+	TP_ARGS(dev_name, str, tag, doorbell, transfer_len,
+				intr, lba, opcode, group_id),
 
 	TP_STRUCT__entry(
 		__string(dev_name, dev_name)
@@ -228,6 +238,7 @@ TRACE_EVENT(ufshcd_command,
 		__field(u32, intr)
 		__field(u64, lba)
 		__field(u8, opcode)
+		__field(u8, group_id)
 	),
 
 	TP_fast_assign(
@@ -239,13 +250,15 @@ TRACE_EVENT(ufshcd_command,
 		__entry->intr = intr;
 		__entry->lba = lba;
 		__entry->opcode = opcode;
+		__entry->group_id = group_id;
 	),
 
 	TP_printk(
-		"%s: %s: tag: %u, DB: 0x%x, size: %d, IS: %u, LBA: %llu, opcode: 0x%x",
+		"%s: %s: tag: %u, DB: 0x%x, size: %d, IS: %u, LBA: %llu, opcode: 0x%x (%s), group_id: 0x%x",
 		__get_str(str), __get_str(dev_name), __entry->tag,
 		__entry->doorbell, __entry->transfer_len,
-		__entry->intr, __entry->lba, (u32)__entry->opcode
+		__entry->intr, __entry->lba, (u32)__entry->opcode,
+		str_opcode(__entry->opcode), (u32)__entry->group_id
 	)
 );
 
-- 
2.28.0.618.gf4bc123cb7-goog


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 5/6] scsi: ufs: show ufs part info in error case
  2020-09-15 20:45 ` [PATCH 5/6] scsi: ufs: show ufs part info in error case Jaegeuk Kim
@ 2020-09-16 10:34   ` Bean Huo
  2020-09-16 16:05     ` Jaegeuk Kim
  0 siblings, 1 reply; 12+ messages in thread
From: Bean Huo @ 2020-09-16 10:34 UTC (permalink / raw)
  To: Jaegeuk Kim, linux-kernel, linux-scsi, kernel-team, Can Guo
  Cc: Jaegeuk Kim, Alim Akhtar, Avri Altman

On Tue, 2020-09-15 at 13:45 -0700, Jaegeuk Kim wrote:
> Cc: Avri Altman <avri.altman@wdc.com>
> Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
> ---
>  drivers/scsi/ufs/ufshcd.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
> index bdc82cc3824aa..b81c116b976ff 100644
> --- a/drivers/scsi/ufs/ufshcd.c
> +++ b/drivers/scsi/ufs/ufshcd.c
> @@ -500,6 +500,14 @@ static void ufshcd_print_tmrs(struct ufs_hba
> *hba, unsigned long bitmap)
>  static void ufshcd_print_host_state(struct ufs_hba *hba)
>  {
>         dev_err(hba->dev, "UFS Host state=%d\n", hba->ufshcd_state);
> +       if (hba->sdev_ufs_device) {
> +               dev_err(hba->dev, " vendor = %.8s\n",
> +                                       hba->sdev_ufs_device-
> >vendor);
> +               dev_err(hba->dev, " model = %.16s\n",
> +                                       hba->sdev_ufs_device->model);
> +               dev_err(hba->dev, " rev = %.4s\n",
> +                                       hba->sdev_ufs_device->rev);
> +       }

Hi Jaegeuk
these prints have been added since this change:

commit 3f8af6044713 ("scsi: ufs: Add some debug information to
ufshcd_print_host_state()")                

https://patchwork.kernel.org/patch/11694371/

Thanks,
Bean


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 5/6] scsi: ufs: show ufs part info in error case
  2020-09-16 10:34   ` Bean Huo
@ 2020-09-16 16:05     ` Jaegeuk Kim
  2020-09-17  0:54       ` Can Guo
  0 siblings, 1 reply; 12+ messages in thread
From: Jaegeuk Kim @ 2020-09-16 16:05 UTC (permalink / raw)
  To: Bean Huo
  Cc: linux-kernel, linux-scsi, kernel-team, Can Guo, Alim Akhtar, Avri Altman

On 09/16, Bean Huo wrote:
> On Tue, 2020-09-15 at 13:45 -0700, Jaegeuk Kim wrote:
> > Cc: Avri Altman <avri.altman@wdc.com>
> > Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
> > ---
> >  drivers/scsi/ufs/ufshcd.c | 8 ++++++++
> >  1 file changed, 8 insertions(+)
> > 
> > diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
> > index bdc82cc3824aa..b81c116b976ff 100644
> > --- a/drivers/scsi/ufs/ufshcd.c
> > +++ b/drivers/scsi/ufs/ufshcd.c
> > @@ -500,6 +500,14 @@ static void ufshcd_print_tmrs(struct ufs_hba
> > *hba, unsigned long bitmap)
> >  static void ufshcd_print_host_state(struct ufs_hba *hba)
> >  {
> >         dev_err(hba->dev, "UFS Host state=%d\n", hba->ufshcd_state);
> > +       if (hba->sdev_ufs_device) {
> > +               dev_err(hba->dev, " vendor = %.8s\n",
> > +                                       hba->sdev_ufs_device-
> > >vendor);
> > +               dev_err(hba->dev, " model = %.16s\n",
> > +                                       hba->sdev_ufs_device->model);
> > +               dev_err(hba->dev, " rev = %.4s\n",
> > +                                       hba->sdev_ufs_device->rev);
> > +       }
> 
> Hi Jaegeuk
> these prints have been added since this change:
> 
> commit 3f8af6044713 ("scsi: ufs: Add some debug information to
> ufshcd_print_host_state()")                
> 
> https://patchwork.kernel.org/patch/11694371/

Cool, thank you for pointing this out. BTW, which branch can I see the -next
patches?

> 
> Thanks,
> Bean

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 5/6] scsi: ufs: show ufs part info in error case
  2020-09-16 16:05     ` Jaegeuk Kim
@ 2020-09-17  0:54       ` Can Guo
  2020-09-18  4:13         ` Jaegeuk Kim
  0 siblings, 1 reply; 12+ messages in thread
From: Can Guo @ 2020-09-17  0:54 UTC (permalink / raw)
  To: Jaegeuk Kim
  Cc: Bean Huo, linux-kernel, linux-scsi, kernel-team, Alim Akhtar,
	Avri Altman

On 2020-09-17 00:05, Jaegeuk Kim wrote:
> On 09/16, Bean Huo wrote:
>> On Tue, 2020-09-15 at 13:45 -0700, Jaegeuk Kim wrote:
>> > Cc: Avri Altman <avri.altman@wdc.com>
>> > Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
>> > ---
>> >  drivers/scsi/ufs/ufshcd.c | 8 ++++++++
>> >  1 file changed, 8 insertions(+)
>> >
>> > diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
>> > index bdc82cc3824aa..b81c116b976ff 100644
>> > --- a/drivers/scsi/ufs/ufshcd.c
>> > +++ b/drivers/scsi/ufs/ufshcd.c
>> > @@ -500,6 +500,14 @@ static void ufshcd_print_tmrs(struct ufs_hba
>> > *hba, unsigned long bitmap)
>> >  static void ufshcd_print_host_state(struct ufs_hba *hba)
>> >  {
>> >         dev_err(hba->dev, "UFS Host state=%d\n", hba->ufshcd_state);
>> > +       if (hba->sdev_ufs_device) {
>> > +               dev_err(hba->dev, " vendor = %.8s\n",
>> > +                                       hba->sdev_ufs_device-
>> > >vendor);
>> > +               dev_err(hba->dev, " model = %.16s\n",
>> > +                                       hba->sdev_ufs_device->model);
>> > +               dev_err(hba->dev, " rev = %.4s\n",
>> > +                                       hba->sdev_ufs_device->rev);
>> > +       }
>> 
>> Hi Jaegeuk
>> these prints have been added since this change:
>> 
>> commit 3f8af6044713 ("scsi: ufs: Add some debug information to
>> ufshcd_print_host_state()")
>> 
>> https://patchwork.kernel.org/patch/11694371/
> 
> Cool, thank you for pointing this out. BTW, which branch can I see the 
> -next
> patches?
> 

Hi Jaegeuk,

This patch comes from a series of changes trying to fix and simplify
the UFS error handling. You can find the whole series here - they are
picked up on scsi-queue-5.10

https://lore.kernel.org/linux-scsi/1596975355-39813-10-git-send-email-cang@codeaurora.org/

Besides, several more fixes for error handling based on above series are

https://lore.kernel.org/patchwork/patch/1290405/
&
https://lore.kernel.org/linux-scsi/159961731708.5787.8825955850640714260.b4-ty@oracle.com/

I've mainline all above changes to Android12-5.4 and Android11-5.4.

Moreover, there are 2 more fixes on the way for error handling, I
will push them soon.

Thanks,

Can Guo.

>> 
>> Thanks,
>> Bean

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 4/6] scsi: ufs: fix LINERESET on hibern8
  2020-09-15 20:45 ` [PATCH 4/6] scsi: ufs: fix LINERESET on hibern8 Jaegeuk Kim
@ 2020-09-18  4:12   ` Jaegeuk Kim
  0 siblings, 0 replies; 12+ messages in thread
From: Jaegeuk Kim @ 2020-09-18  4:12 UTC (permalink / raw)
  To: linux-kernel, linux-scsi, kernel-team; +Cc: Alim Akhtar, Avri Altman

Please ignore this patch.
Thanks.

On 09/15, Jaegeuk Kim wrote:
> From: Jaegeuk Kim <jaegeuk@google.com>
> 
> When testing infinite test to read sysfs entries of UFS, I got a UFS timeout
> with the following kernel message.
> 
> query: dev_cmd_send: seq_no=78082 tag=31, idn=2
> query: ufshcd_wait_for_dev_cmd: dev_cmd request timedout, tag 31
> query: __ufshcd_query_descriptor: opcode 0x01 for idn 2 failed, index 0, err = -11
>  --  hibern8: dme: dme_send: cmd_id=0x17 idn=0
> query: ufshcd_query_descriptor: failed with error -11, retries 3
>  --  hibern8: ufshcd_update_uic_error: LINERESET during hibern8 enter
>  --  hibern8: __ufshcd_uic_hibern8_enter: hibern8 enter failed. ret = -110
> 
> The problem is casued by hibern8 command issued by ufshcd_suspend(), which is
> not aware of query command. If autohibern8 is enabled, we actually don't need
> to issue hibern8 command by suspend.
> 
> Cc: Alim Akhtar <alim.akhtar@samsung.com>
> Cc: Avri Altman <avri.altman@wdc.com>
> Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
> ---
>  drivers/scsi/ufs/ufshcd.c | 20 ++++++++++++++++++--
>  drivers/scsi/ufs/ufshcd.h |  1 +
>  2 files changed, 19 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
> index 848e33ec40639..bdc82cc3824aa 100644
> --- a/drivers/scsi/ufs/ufshcd.c
> +++ b/drivers/scsi/ufs/ufshcd.c
> @@ -3079,8 +3079,12 @@ int ufshcd_query_descriptor_retry(struct ufs_hba *hba,
>  	int retries;
>  
>  	for (retries = QUERY_REQ_RETRIES; retries > 0; retries--) {
> -		err = __ufshcd_query_descriptor(hba, opcode, idn, index,
> +		err = -EAGAIN;
> +		down_read(&hba->query_lock);
> +		if (!ufshcd_is_link_hibern8(hba))
> +			err = __ufshcd_query_descriptor(hba, opcode, idn, index,
>  						selector, desc_buf, buf_len);
> +		up_read(&hba->query_lock);
>  		if (!err || err == -EINVAL)
>  			break;
>  	}
> @@ -8263,8 +8267,8 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
>  	enum ufs_pm_level pm_lvl;
>  	enum ufs_dev_pwr_mode req_dev_pwr_mode;
>  	enum uic_link_state req_link_state;
> +	bool need_upwrite = false;
>  
> -	hba->pm_op_in_progress = 1;
>  	if (!ufshcd_is_shutdown_pm(pm_op)) {
>  		pm_lvl = ufshcd_is_runtime_pm(pm_op) ?
>  			 hba->rpm_lvl : hba->spm_lvl;
> @@ -8275,6 +8279,15 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
>  		req_link_state = UIC_LINK_OFF_STATE;
>  	}
>  
> +	if (ufshcd_is_runtime_pm(pm_op) &&
> +			req_link_state == UIC_LINK_HIBERN8_STATE &&
> +			hba->capabilities & MASK_AUTO_HIBERN8_SUPPORT) {
> +		need_upwrite = true;
> +		if (!down_write_trylock(&hba->query_lock))
> +			return -EBUSY;
> +	}
> +	hba->pm_op_in_progress = 1;
> +
>  	/*
>  	 * If we can't transition into any of the low power modes
>  	 * just gate the clocks.
> @@ -8403,6 +8416,8 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
>  	}
>  
>  	hba->pm_op_in_progress = 0;
> +	if (need_upwrite)
> +		up_write(&hba->query_lock);
>  
>  	if (ret)
>  		ufshcd_update_reg_hist(&hba->ufs_stats.suspend_err, (u32)ret);
> @@ -8894,6 +8909,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
>  	mutex_init(&hba->dev_cmd.lock);
>  
>  	init_rwsem(&hba->clk_scaling_lock);
> +	init_rwsem(&hba->query_lock);
>  
>  	ufshcd_init_clk_gating(hba);
>  
> diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
> index 363589c0bd370..6f8e05eaf9661 100644
> --- a/drivers/scsi/ufs/ufshcd.h
> +++ b/drivers/scsi/ufs/ufshcd.h
> @@ -754,6 +754,7 @@ struct ufs_hba {
>  	bool is_urgent_bkops_lvl_checked;
>  
>  	struct rw_semaphore clk_scaling_lock;
> +	struct rw_semaphore query_lock;
>  	unsigned char desc_size[QUERY_DESC_IDN_MAX];
>  	atomic_t scsi_block_reqs_cnt;
>  
> -- 
> 2.28.0.618.gf4bc123cb7-goog

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 5/6] scsi: ufs: show ufs part info in error case
  2020-09-17  0:54       ` Can Guo
@ 2020-09-18  4:13         ` Jaegeuk Kim
  2020-09-22  5:30           ` Can Guo
  0 siblings, 1 reply; 12+ messages in thread
From: Jaegeuk Kim @ 2020-09-18  4:13 UTC (permalink / raw)
  To: Can Guo
  Cc: Bean Huo, linux-kernel, linux-scsi, kernel-team, Alim Akhtar,
	Avri Altman

On 09/17, Can Guo wrote:
> On 2020-09-17 00:05, Jaegeuk Kim wrote:
> > On 09/16, Bean Huo wrote:
> > > On Tue, 2020-09-15 at 13:45 -0700, Jaegeuk Kim wrote:
> > > > Cc: Avri Altman <avri.altman@wdc.com>
> > > > Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
> > > > ---
> > > >  drivers/scsi/ufs/ufshcd.c | 8 ++++++++
> > > >  1 file changed, 8 insertions(+)
> > > >
> > > > diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
> > > > index bdc82cc3824aa..b81c116b976ff 100644
> > > > --- a/drivers/scsi/ufs/ufshcd.c
> > > > +++ b/drivers/scsi/ufs/ufshcd.c
> > > > @@ -500,6 +500,14 @@ static void ufshcd_print_tmrs(struct ufs_hba
> > > > *hba, unsigned long bitmap)
> > > >  static void ufshcd_print_host_state(struct ufs_hba *hba)
> > > >  {
> > > >         dev_err(hba->dev, "UFS Host state=%d\n", hba->ufshcd_state);
> > > > +       if (hba->sdev_ufs_device) {
> > > > +               dev_err(hba->dev, " vendor = %.8s\n",
> > > > +                                       hba->sdev_ufs_device-
> > > > >vendor);
> > > > +               dev_err(hba->dev, " model = %.16s\n",
> > > > +                                       hba->sdev_ufs_device->model);
> > > > +               dev_err(hba->dev, " rev = %.4s\n",
> > > > +                                       hba->sdev_ufs_device->rev);
> > > > +       }
> > > 
> > > Hi Jaegeuk
> > > these prints have been added since this change:
> > > 
> > > commit 3f8af6044713 ("scsi: ufs: Add some debug information to
> > > ufshcd_print_host_state()")
> > > 
> > > https://patchwork.kernel.org/patch/11694371/
> > 
> > Cool, thank you for pointing this out. BTW, which branch can I see the
> > -next
> > patches?
> > 
> 
> Hi Jaegeuk,
> 
> This patch comes from a series of changes trying to fix and simplify
> the UFS error handling. You can find the whole series here - they are
> picked up on scsi-queue-5.10
> 
> https://lore.kernel.org/linux-scsi/1596975355-39813-10-git-send-email-cang@codeaurora.org/
> 
> Besides, several more fixes for error handling based on above series are
> 
> https://lore.kernel.org/patchwork/patch/1290405/
> &
> https://lore.kernel.org/linux-scsi/159961731708.5787.8825955850640714260.b4-ty@oracle.com/
> 
> I've mainline all above changes to Android12-5.4 and Android11-5.4.

I've seen the patches in Android branches. Thank you for the explanation.

> 
> Moreover, there are 2 more fixes on the way for error handling, I
> will push them soon.

BTW, could you please take a look at these patches?

Thanks,

> 
> Thanks,
> 
> Can Guo.
> 
> > > 
> > > Thanks,
> > > Bean

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 5/6] scsi: ufs: show ufs part info in error case
  2020-09-18  4:13         ` Jaegeuk Kim
@ 2020-09-22  5:30           ` Can Guo
  0 siblings, 0 replies; 12+ messages in thread
From: Can Guo @ 2020-09-22  5:30 UTC (permalink / raw)
  To: Jaegeuk Kim
  Cc: Bean Huo, linux-kernel, linux-scsi, kernel-team, Alim Akhtar,
	Avri Altman

On 2020-09-18 12:13, Jaegeuk Kim wrote:
> On 09/17, Can Guo wrote:
>> On 2020-09-17 00:05, Jaegeuk Kim wrote:
>> > On 09/16, Bean Huo wrote:
>> > > On Tue, 2020-09-15 at 13:45 -0700, Jaegeuk Kim wrote:
>> > > > Cc: Avri Altman <avri.altman@wdc.com>
>> > > > Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
>> > > > ---
>> > > >  drivers/scsi/ufs/ufshcd.c | 8 ++++++++
>> > > >  1 file changed, 8 insertions(+)
>> > > >
>> > > > diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
>> > > > index bdc82cc3824aa..b81c116b976ff 100644
>> > > > --- a/drivers/scsi/ufs/ufshcd.c
>> > > > +++ b/drivers/scsi/ufs/ufshcd.c
>> > > > @@ -500,6 +500,14 @@ static void ufshcd_print_tmrs(struct ufs_hba
>> > > > *hba, unsigned long bitmap)
>> > > >  static void ufshcd_print_host_state(struct ufs_hba *hba)
>> > > >  {
>> > > >         dev_err(hba->dev, "UFS Host state=%d\n", hba->ufshcd_state);
>> > > > +       if (hba->sdev_ufs_device) {
>> > > > +               dev_err(hba->dev, " vendor = %.8s\n",
>> > > > +                                       hba->sdev_ufs_device-
>> > > > >vendor);
>> > > > +               dev_err(hba->dev, " model = %.16s\n",
>> > > > +                                       hba->sdev_ufs_device->model);
>> > > > +               dev_err(hba->dev, " rev = %.4s\n",
>> > > > +                                       hba->sdev_ufs_device->rev);
>> > > > +       }
>> > >
>> > > Hi Jaegeuk
>> > > these prints have been added since this change:
>> > >
>> > > commit 3f8af6044713 ("scsi: ufs: Add some debug information to
>> > > ufshcd_print_host_state()")
>> > >
>> > > https://patchwork.kernel.org/patch/11694371/
>> >
>> > Cool, thank you for pointing this out. BTW, which branch can I see the
>> > -next
>> > patches?
>> >
>> 
>> Hi Jaegeuk,
>> 
>> This patch comes from a series of changes trying to fix and simplify
>> the UFS error handling. You can find the whole series here - they are
>> picked up on scsi-queue-5.10
>> 
>> https://lore.kernel.org/linux-scsi/1596975355-39813-10-git-send-email-cang@codeaurora.org/
>> 
>> Besides, several more fixes for error handling based on above series 
>> are
>> 
>> https://lore.kernel.org/patchwork/patch/1290405/
>> &
>> https://lore.kernel.org/linux-scsi/159961731708.5787.8825955850640714260.b4-ty@oracle.com/
>> 
>> I've mainline all above changes to Android12-5.4 and Android11-5.4.
> 
> I've seen the patches in Android branches. Thank you for the 
> explanation.
> 
>> 
>> Moreover, there are 2 more fixes on the way for error handling, I
>> will push them soon.
> 
> BTW, could you please take a look at these patches?
> 
> Thanks,
> 

Sure, but since I am not in your cc or to list, so I don't know which
patches. Maybe you can add me when you push the next version? Thanks.

Regards,

Can Guo.

>> 
>> Thanks,
>> 
>> Can Guo.
>> 
>> > >
>> > > Thanks,
>> > > Bean

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2020-09-22  5:30 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-15 20:45 [PATCH 1/6] scsi: ufs: atomic update for clkgating_enable Jaegeuk Kim
2020-09-15 20:45 ` [PATCH 2/6] scsi: ufs: clear UAC for FFU Jaegeuk Kim
2020-09-15 20:45 ` [PATCH 3/6] scsi: ufs: use WQ_HIGHPRI for gating work Jaegeuk Kim
2020-09-15 20:45 ` [PATCH 4/6] scsi: ufs: fix LINERESET on hibern8 Jaegeuk Kim
2020-09-18  4:12   ` Jaegeuk Kim
2020-09-15 20:45 ` [PATCH 5/6] scsi: ufs: show ufs part info in error case Jaegeuk Kim
2020-09-16 10:34   ` Bean Huo
2020-09-16 16:05     ` Jaegeuk Kim
2020-09-17  0:54       ` Can Guo
2020-09-18  4:13         ` Jaegeuk Kim
2020-09-22  5:30           ` Can Guo
2020-09-15 20:45 ` [PATCH 6/6] scsi: add more contexts in the ufs tracepoints Jaegeuk Kim

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.