[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <SN6PR04MB4640968DCD865651AFA8925DFC9E0@SN6PR04MB4640.namprd04.prod.outlook.com>
Date: Sat, 13 Jun 2020 10:48:21 +0000
From: Avri Altman <Avri.Altman@....com>
To: Stanley Chu <stanley.chu@...iatek.com>,
"linux-scsi@...r.kernel.org" <linux-scsi@...r.kernel.org>,
"martin.petersen@...cle.com" <martin.petersen@...cle.com>,
"alim.akhtar@...sung.com" <alim.akhtar@...sung.com>,
"jejb@...ux.ibm.com" <jejb@...ux.ibm.com>,
"asutoshd@...eaurora.org" <asutoshd@...eaurora.org>
CC: "beanhuo@...ron.com" <beanhuo@...ron.com>,
"cang@...eaurora.org" <cang@...eaurora.org>,
"matthias.bgg@...il.com" <matthias.bgg@...il.com>,
"bvanassche@....org" <bvanassche@....org>,
"linux-mediatek@...ts.infradead.org"
<linux-mediatek@...ts.infradead.org>,
"linux-arm-kernel@...ts.infradead.org"
<linux-arm-kernel@...ts.infradead.org>,
"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
"kuohong.wang@...iatek.com" <kuohong.wang@...iatek.com>,
"peter.wang@...iatek.com" <peter.wang@...iatek.com>,
"chun-hung.wu@...iatek.com" <chun-hung.wu@...iatek.com>,
"andy.teng@...iatek.com" <andy.teng@...iatek.com>,
"chaotian.jing@...iatek.com" <chaotian.jing@...iatek.com>,
"cc.chou@...iatek.com" <cc.chou@...iatek.com>
Subject: RE: [PATCH v1 2/2] scsi: ufs: Add trace event for UIC commands
> +static void ufshcd_add_uic_command_trace(struct ufs_hba *hba,
> + struct uic_command *ucmd,
> + const char *str)
> +{
> + u32 cmd;
> +
> + if (!trace_ufshcd_uic_command_enabled())
> + return;
> +
> + if (!strcmp(str, "uic_send"))
> + cmd = ucmd->command;
> + else
> + cmd = ufshcd_readl(hba, REG_UIC_COMMAND);
Why on complete you can't just use ucmd->command as well?
> +
> + trace_ufshcd_uic_command(dev_name(hba->dev), str, cmd,
> + ucmd->result,
> + ufshcd_readl(hba, REG_UIC_COMMAND_ARG_1),
> + ufshcd_readl(hba, REG_UIC_COMMAND_ARG_2),
> + ufshcd_readl(hba, REG_UIC_COMMAND_ARG_3));
Why can't you just use the ucmd members?
Why need to read those?
> +}
> +
> static void ufshcd_add_command_trace(struct ufs_hba *hba,
> unsigned int tag, const char *str)
> {
> @@ -2054,6 +2075,8 @@ ufshcd_dispatch_uic_cmd(struct ufs_hba *hba,
> struct uic_command *uic_cmd)
> /* Write UIC Cmd */
> ufshcd_writel(hba, uic_cmd->command & COMMAND_OPCODE_MASK,
> REG_UIC_COMMAND);
> +
> + ufshcd_add_uic_command_trace(hba, uic_cmd, "uic_send");
> }
>
> /**
> @@ -2080,6 +2103,9 @@ ufshcd_wait_for_uic_cmd(struct ufs_hba *hba,
> struct uic_command *uic_cmd)
> hba->active_uic_cmd = NULL;
> spin_unlock_irqrestore(hba->host->host_lock, flags);
>
> + uic_cmd->result = ret;
> + ufshcd_add_uic_command_trace(hba, uic_cmd, "uic_complete");
> +
> return ret;
> }
Can't you just call the "send" and "complete" from ufshcd_send_uic_cmd?
>
> @@ -3760,6 +3786,9 @@ static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba,
> struct uic_command *cmd)
> ret = (status != PWR_OK) ? status : -1;
> }
> out:
> + cmd->result = ret;
> + ufshcd_add_uic_command_trace(hba, cmd, "uic_complete");
> +
> if (ret) {
> ufshcd_print_host_state(hba);
> ufshcd_print_pwr_info(hba);
> diff --git a/include/trace/events/ufs.h b/include/trace/events/ufs.h
> index 5f300739240d..cf8d568d5a13 100644
> --- a/include/trace/events/ufs.h
> +++ b/include/trace/events/ufs.h
> @@ -249,6 +249,39 @@ TRACE_EVENT(ufshcd_command,
> )
> );
>
> +TRACE_EVENT(ufshcd_uic_command,
> + TP_PROTO(const char *dev_name, const char *str, u32 cmd, int result,
> + u32 arg1, u32 arg2, u32 arg3),
> +
> + TP_ARGS(dev_name, str, cmd, result, arg1, arg2, arg3),
> +
> + TP_STRUCT__entry(
> + __string(dev_name, dev_name)
> + __string(str, str)
> + __field(u32, cmd)
> + __field(int, result)
> + __field(u32, arg1)
> + __field(u32, arg2)
> + __field(u32, arg3)
> + ),
> +
> + TP_fast_assign(
> + __assign_str(dev_name, dev_name);
> + __assign_str(str, str);
> + __entry->cmd = cmd;
> + __entry->result = result;
> + __entry->arg1 = arg1;
> + __entry->arg2 = arg2;
> + __entry->arg3 = arg3;
> + ),
> +
> + TP_printk(
> + "%s: %s: cmd: 0x%x, arg1: 0x%x, arg2: 0x%x, arg3: 0x%x, result: %d",
> + __get_str(str), __get_str(dev_name), __entry->cmd,
> + __entry->arg1, __entry->arg2, __entry->arg3, __entry->result
> + )
Personally, as those trace events aren't very human readable anyway, I would just dump the uic command,
And let the parsers do their job.
And if this is the case, result is redundant as it is part of arg2
Thanks,
Avri
> +);
> +
> TRACE_EVENT(ufshcd_upiu,
> TP_PROTO(const char *dev_name, const char *str, void *hdr, void *tsf),
>
> --
> 2.18.0
Powered by blists - more mailing lists