From: Vinod Koul <vkoul@kernel.org>
To: Peter Ujfalusi <peter.ujfalusi@ti.com>
Cc: dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org,
dan.j.williams@intel.com, grygorii.strashko@ti.com,
vigneshr@ti.com
Subject: Re: [PATCH for-next 1/4] dmaengine: ti: k3-udma: Use ktime/usleep_range based TX completion check
Date: Tue, 28 Jan 2020 17:18:20 +0530 [thread overview]
Message-ID: <20200128114820.GS2841@vkoul-mobl> (raw)
In-Reply-To: <20200127132111.20464-2-peter.ujfalusi@ti.com>
On 27-01-20, 15:21, Peter Ujfalusi wrote:
> From: Vignesh Raghavendra <vigneshr@ti.com>
>
> In some cases (McSPI for example) the jiffie and delayed_work based
> workaround can cause big throughput drop.
>
> Switch to use ktime/usleep_range based implementation to be able
> to sustain speed for PDMA based peripherals.
>
> Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
> ---
> drivers/dma/ti/k3-udma.c | 80 ++++++++++++++++++++++++++--------------
> 1 file changed, 53 insertions(+), 27 deletions(-)
>
> diff --git a/drivers/dma/ti/k3-udma.c b/drivers/dma/ti/k3-udma.c
> index ea79c2df28e0..fb59c869a6a7 100644
> --- a/drivers/dma/ti/k3-udma.c
> +++ b/drivers/dma/ti/k3-udma.c
> @@ -5,6 +5,7 @@
> */
>
> #include <linux/kernel.h>
> +#include <linux/delay.h>
> #include <linux/dmaengine.h>
> #include <linux/dma-mapping.h>
> #include <linux/dmapool.h>
> @@ -169,7 +170,7 @@ enum udma_chan_state {
>
> struct udma_tx_drain {
> struct delayed_work work;
> - unsigned long jiffie;
> + ktime_t tstamp;
> u32 residue;
> };
>
> @@ -946,9 +947,10 @@ static bool udma_is_desc_really_done(struct udma_chan *uc, struct udma_desc *d)
> peer_bcnt = udma_tchanrt_read(uc->tchan, UDMA_TCHAN_RT_PEER_BCNT_REG);
> bcnt = udma_tchanrt_read(uc->tchan, UDMA_TCHAN_RT_BCNT_REG);
>
> + /* Transfer is incomplete, store current residue and time stamp */
> if (peer_bcnt < bcnt) {
> uc->tx_drain.residue = bcnt - peer_bcnt;
> - uc->tx_drain.jiffie = jiffies;
> + uc->tx_drain.tstamp = ktime_get();
Any reason why ktime_get() is better than jiffies..?
> return false;
> }
>
> @@ -961,35 +963,59 @@ static void udma_check_tx_completion(struct work_struct *work)
> tx_drain.work.work);
> bool desc_done = true;
> u32 residue_diff;
> - unsigned long jiffie_diff, delay;
> + ktime_t time_diff;
> + unsigned long delay;
> +
> + while (1) {
> + if (uc->desc) {
> + /* Get previous residue and time stamp */
> + residue_diff = uc->tx_drain.residue;
> + time_diff = uc->tx_drain.tstamp;
> + /*
> + * Get current residue and time stamp or see if
> + * transfer is complete
> + */
> + desc_done = udma_is_desc_really_done(uc, uc->desc);
> + }
>
> - if (uc->desc) {
> - residue_diff = uc->tx_drain.residue;
> - jiffie_diff = uc->tx_drain.jiffie;
> - desc_done = udma_is_desc_really_done(uc, uc->desc);
> - }
> -
> - if (!desc_done) {
> - jiffie_diff = uc->tx_drain.jiffie - jiffie_diff;
> - residue_diff -= uc->tx_drain.residue;
> - if (residue_diff) {
> - /* Try to guess when we should check next time */
> - residue_diff /= jiffie_diff;
> - delay = uc->tx_drain.residue / residue_diff / 3;
> - if (jiffies_to_msecs(delay) < 5)
> - delay = 0;
> - } else {
> - /* No progress, check again in 1 second */
> - delay = HZ;
> + if (!desc_done) {
> + /*
> + * Find the time delta and residue delta w.r.t
> + * previous poll
> + */
> + time_diff = ktime_sub(uc->tx_drain.tstamp,
> + time_diff) + 1;
> + residue_diff -= uc->tx_drain.residue;
> + if (residue_diff) {
> + /*
> + * Try to guess when we should check
> + * next time by calculating rate at
> + * which data is being drained at the
> + * peer device
> + */
> + delay = (time_diff / residue_diff) *
> + uc->tx_drain.residue;
> + } else {
> + /* No progress, check again in 1 second */
> + schedule_delayed_work(&uc->tx_drain.work, HZ);
> + break;
> + }
> +
> + usleep_range(ktime_to_us(delay),
> + ktime_to_us(delay) + 10);
> + continue;
> }
>
> - schedule_delayed_work(&uc->tx_drain.work, delay);
> - } else if (uc->desc) {
> - struct udma_desc *d = uc->desc;
> + if (uc->desc) {
> + struct udma_desc *d = uc->desc;
> +
> + uc->bcnt += d->residue;
> + udma_start(uc);
> + vchan_cookie_complete(&d->vd);
> + break;
> + }
>
> - uc->bcnt += d->residue;
> - udma_start(uc);
> - vchan_cookie_complete(&d->vd);
> + break;
> }
> }
>
> --
> Peter
>
> Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
> Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
--
~Vinod
next prev parent reply other threads:[~2020-01-28 11:48 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-01-27 13:21 [PATCH for-next 0/4] dmaengine: ti: k3-udma: Updates for next Peter Ujfalusi
2020-01-27 13:21 ` [PATCH for-next 1/4] dmaengine: ti: k3-udma: Use ktime/usleep_range based TX completion check Peter Ujfalusi
2020-01-28 11:48 ` Vinod Koul [this message]
2020-01-28 12:05 ` Vignesh Raghavendra
2020-01-28 12:44 ` Vinod Koul
2020-02-11 10:13 ` Peter Ujfalusi
2020-01-27 13:21 ` [PATCH for-next 2/4] dmaengine: ti: k3-udma: Workaround for RX teardown with stale data in peer Peter Ujfalusi
2020-01-27 13:21 ` [PATCH for-next 3/4] dmaengine: ti: k3-udma: Move the TR counter calculation to helper function Peter Ujfalusi
2020-01-27 13:21 ` [PATCH for-next 4/4] dmaengine: ti: k3-udma: Use the TR counter helper for slave_sg and cyclic Peter Ujfalusi
2020-01-28 10:15 ` [PATCH for-next 0/4] dmaengine: ti: k3-udma: Updates for next Peter Ujfalusi
2020-01-28 11:50 ` Vinod Koul
2020-01-28 12:37 ` Peter Ujfalusi
2020-01-30 13:19 ` Peter Ujfalusi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200128114820.GS2841@vkoul-mobl \
--to=vkoul@kernel.org \
--cc=dan.j.williams@intel.com \
--cc=dmaengine@vger.kernel.org \
--cc=grygorii.strashko@ti.com \
--cc=linux-kernel@vger.kernel.org \
--cc=peter.ujfalusi@ti.com \
--cc=vigneshr@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).