lkml.org 
[lkml]   [2020]   [Nov]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
Date
SubjectRe: [PATCH] soc: mediatek: cmdq: fixup possible timeout issue
Hi, Houlong:

Houlong Wei <houlong.wei@mediatek.com> 於 2020年10月22日 週四 下午5:55寫道:
>
> Fixes: 576f1b4bc802 ("soc: mediatek: Add Mediatek CMDQ helper")
>
> There may be possible timeout issue when lots of cmdq packets are
> flushed to the same cmdq client. The necessary modifications are as
> below.
> 1.Adjust the timer timeout period as client->timeout_ms * client->pkt_cnt.
> 2.Optimize the time to start the timer.
>
> Signed-off-by: Houlong Wei <houlong.wei@mediatek.com>
> ---
> drivers/soc/mediatek/mtk-cmdq-helper.c | 22 ++++++++++++++++++----
> 1 file changed, 18 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> index dc644cfb6419..31142c193527 100644
> --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> @@ -350,7 +350,8 @@ static void cmdq_pkt_flush_async_cb(struct cmdq_cb_data data)
> del_timer(&client->timer);
> else
> mod_timer(&client->timer, jiffies +
> - msecs_to_jiffies(client->timeout_ms));
> + msecs_to_jiffies(client->timeout_ms *
> + client->pkt_cnt));
> spin_unlock_irqrestore(&client->lock, flags);
> }
>
> @@ -379,9 +380,7 @@ int cmdq_pkt_flush_async(struct cmdq_pkt *pkt, cmdq_async_flush_cb cb,
>
> if (client->timeout_ms != CMDQ_NO_TIMEOUT) {
> spin_lock_irqsave(&client->lock, flags);
> - if (client->pkt_cnt++ == 0)
> - mod_timer(&client->timer, jiffies +
> - msecs_to_jiffies(client->timeout_ms));
> + client->pkt_cnt++;
> spin_unlock_irqrestore(&client->lock, flags);
> }
>
> @@ -391,6 +390,21 @@ int cmdq_pkt_flush_async(struct cmdq_pkt *pkt, cmdq_async_flush_cb cb,
> /* We can send next packet immediately, so just call txdone. */
> mbox_client_txdone(client->chan, 0);
>
> + if (client->timeout_ms != CMDQ_NO_TIMEOUT) {
> + spin_lock_irqsave(&client->lock, flags);
> + /*
> + * GCE HW maybe execute too quickly and the callback function
> + * may be invoked earlier. If this happens, pkt_cnt is reduced
> + * by 1 in cmdq_pkt_flush_async_cb(). The timer is set only if
> + * pkt_cnt is greater than 0.
> + */
> + if (client->pkt_cnt > 0)
> + mod_timer(&client->timer, jiffies +
> + msecs_to_jiffies(client->timeout_ms *
> + client->pkt_cnt));

I think for some client, it care about execution time of one packet,
but some client care about total execution time of all packets, so we
should let client driver implement its own timeout handler and remove
handler in cmdq helper [1].

[1] https://patchwork.kernel.org/project/linux-mediatek/patch/20201102000438.29225-1-chunkuang.hu@kernel.org/

Regards,
Chun-Kuang.

> + spin_unlock_irqrestore(&client->lock, flags);
> + }
> +
> return 0;
> }
> EXPORT_SYMBOL(cmdq_pkt_flush_async);
> --
> 2.18.0
> _______________________________________________
> Linux-mediatek mailing list
> Linux-mediatek@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-mediatek

\
 
 \ /
  Last update: 2020-11-02 01:45    [W:0.072 / U:0.372 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site