* [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 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).