RE: [RFC PATCH v5 2/3] ufs: exynos: introduce command history

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Kiwoong,

> -----Original Message-----
> From: Kiwoong Kim <kwmad.kim@xxxxxxxxxxx>
> Sent: 11 July 2020 12:28
> To: linux-scsi@xxxxxxxxxxxxxxx; alim.akhtar@xxxxxxxxxxx;
> avri.altman@xxxxxxx; jejb@xxxxxxxxxxxxx; martin.petersen@xxxxxxxxxx;
> beanhuo@xxxxxxxxxx; asutoshd@xxxxxxxxxxxxxx; cang@xxxxxxxxxxxxxx;
> bvanassche@xxxxxxx; grant.jung@xxxxxxxxxxx; sc.suh@xxxxxxxxxxx;
> hy50.seo@xxxxxxxxxxx; sh425.lee@xxxxxxxxxxx
> Cc: Kiwoong Kim <kwmad.kim@xxxxxxxxxxx>
> Subject: [RFC PATCH v5 2/3] ufs: exynos: introduce command history
> 
> This includes functions to record contexts of incoming commands in a circular
> queue. ufshcd.c has already some function tracer calls to get command history
> but ftrace would be gone when system dies before you get the information,
> such as panic cases.
> 
> This patch also implements callbacks compl_xfer_req to store IO contexts at
> completion times.
> 
> When you turn on CONFIG_SCSI_UFS_EXYNOS_CMD_LOG, the driver collects
> the information from incoming commands in the circular queue.
> 
> Signed-off-by: Kiwoong Kim <kwmad.kim@xxxxxxxxxxx>
> +void exynos_ufs_cmd_log_start(struct ufs_exynos_handle *handle,
> +			      struct ufs_hba *hba, int tag)
> +{
> +	struct ufs_s_dbg_mgr *mgr = (struct ufs_s_dbg_mgr *)handle->private;
> +	struct scsi_cmnd *cmd = hba->lrb[tag].cmd;
> +	int cpu = raw_smp_processor_id();
> +	struct cmd_data *cmd_log = &mgr->cmd_log;	/* temp buffer to put
> */
> +	u64 lba = 0;
> +	u32 sct = 0;
> +
> +	if (mgr->active == 0)
> +		return;
> +
> +	cmd_log->start_time = cpu_clock(cpu);
> +	cmd_log->op = cmd->cmnd[0];
> +	cmd_log->tag = tag;
> +
> +	/* This function runtime is protected by spinlock from outside */
> +	cmd_log->outstanding_reqs = hba->outstanding_reqs;
> +
> +	/* Now assume using WRITE_10 and READ_10 */
> +	put_unaligned(cpu_to_le32(*(u32 *)cmd->cmnd[2]), (u32 *)&lba);
This gives compilation error, you need to include <asm-generic/unaligned.h>
Also type casting to u32 is not needed, will give build warnings.

> +	put_unaligned(cpu_to_le16(*(u16 *)cmd->cmnd[7]), (u16 *)&sct);
Type casting to u16 is not needed.

> +	if (cmd->cmnd[0] != UNMAP)
> +		cmd_log->lba = lba;
> +
> +	cmd_log->sct = sct;
> +	cmd_log->retries = cmd->allowed;
> +
> +	ufs_s_put_cmd_log(mgr, cmd_log);
> +}
> +
> +void exynos_ufs_cmd_log_end(struct ufs_exynos_handle *handle,
> +			    struct ufs_hba *hba, int tag)
> +{
> +	struct ufs_s_dbg_mgr *mgr = (struct ufs_s_dbg_mgr *)handle->private;
> +	struct scsi_cmnd *cmd = hba->lrb[tag].cmd;
Unused variable "cmd"

> +	struct ufs_cmd_info *cmd_info = &mgr->cmd_info;
> +	int cpu = raw_smp_processor_id();
> +
> +	if (mgr->active == 0)
> +		return;
> +
> +	cmd_info->pdata[tag]->end_time = cpu_clock(cpu); }
> +
> +int exynos_ufs_init_dbg(struct ufs_exynos_handle *handle, struct device
> +*dev) {
> +	struct ufs_s_dbg_mgr *mgr;
> +
> +	mgr = devm_kzalloc(dev, sizeof(struct ufs_s_dbg_mgr), GFP_KERNEL);
> +	if (!mgr)
> +		return -ENOMEM;
> +	handle->private = (void *)mgr;
> +	mgr->handle = handle;
> +	mgr->active = 1;
> +
> +	/* cmd log */
> +	spin_lock_init(&mgr->cmd_lock);
> +
> +	return 0;
> +}
> +MODULE_AUTHOR("Kiwoong Kim <kwmad.kim@xxxxxxxxxxx>");
> +MODULE_DESCRIPTION("Exynos UFS debug information");
> +MODULE_LICENSE("GPL"); MODULE_VERSION("0.1");
May be "GPL v2"

> diff --git a/drivers/scsi/ufs/ufs-exynos-if.h b/drivers/scsi/ufs/ufs-exynos-if.h
> new file mode 100644
> 2.7.4






[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux