Message ID | 20210623101731.87885-1-andriy.shevchenko@linux.intel.com |
---|---|
State | New |
Headers | show |
Series | [v1,1/1] mmc: mmc_spi: Simplify busy loop in mmc_spi_skip() | expand |
On Wed, 23 Jun 2021 at 12:17, Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote: > > Infinite loops are hard to read and understand because of > hidden main loop condition. Simplify such one in mmc_spi_skip(). > > Using schedule() to schedule (and be friendly to others) > is discouraged and cond_resched() should be used instead. > Hence, replace schedule() with cond_resched() at the same > time. > > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> > --- > drivers/mmc/host/mmc_spi.c | 15 ++++----------- > 1 file changed, 4 insertions(+), 11 deletions(-) > > diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c > index 65c65bb5737f..a1bcde3395a6 100644 > --- a/drivers/mmc/host/mmc_spi.c > +++ b/drivers/mmc/host/mmc_spi.c > @@ -180,7 +180,7 @@ static int mmc_spi_skip(struct mmc_spi_host *host, unsigned long timeout, > u8 *cp = host->data->status; > unsigned long start = jiffies; > > - while (1) { > + do { > int status; > unsigned i; > > @@ -193,16 +193,9 @@ static int mmc_spi_skip(struct mmc_spi_host *host, unsigned long timeout, > return cp[i]; > } > > - if (time_is_before_jiffies(start + timeout)) > - break; > - > - /* If we need long timeouts, we may release the CPU. > - * We use jiffies here because we want to have a relation > - * between elapsed time and the blocking of the scheduler. > - */ > - if (time_is_before_jiffies(start + 1)) > - schedule(); > - } > + /* If we need long timeouts, we may release the CPU */ > + cond_resched(); > + } while (time_is_after_jiffies(start + timeout)); This certainly is an improvement. Although, what do you think of moving to readx_poll_timeout(), that should allow even a better cleanup, don't you think? > return -ETIMEDOUT; > } > Kind regards Uffe
On Thu, Jul 8, 2021 at 3:33 PM Ulf Hansson <ulf.hansson@linaro.org> wrote: > On Wed, 23 Jun 2021 at 12:17, Andy Shevchenko > <andriy.shevchenko@linux.intel.com> wrote: ... > This certainly is an improvement. > > Although, what do you think of moving to readx_poll_timeout(), that > should allow even a better cleanup, don't you think? I believe you meant rather read_poll_timeout(). Either way I don't see the benefit of using that macro when you have to customize its body a lot. Besides that the macro doesn't use cond_sched() or even schedule() and I'm not sure it will be an equivalent change. That said, I prefer going this patch as is for the time being. We may adjust it later on. -- With Best Regards, Andy Shevchenko
On Thu, 8 Jul 2021 at 14:50, Andy Shevchenko <andy.shevchenko@gmail.com> wrote: > > On Thu, Jul 8, 2021 at 3:33 PM Ulf Hansson <ulf.hansson@linaro.org> wrote: > > On Wed, 23 Jun 2021 at 12:17, Andy Shevchenko > > <andriy.shevchenko@linux.intel.com> wrote: > > ... > > > This certainly is an improvement. > > > > Although, what do you think of moving to readx_poll_timeout(), that > > should allow even a better cleanup, don't you think? > > I believe you meant rather read_poll_timeout(). Either way I don't see > the benefit of using that macro when you have to customize its body a > lot. Besides that the macro doesn't use cond_sched() or even > schedule() and I'm not sure it will be an equivalent change. > > That said, I prefer going this patch as is for the time being. We may > adjust it later on. Okay, no strong opinion from my side. Queued for v5.15 on my devel branch, thanks! Kind regards Uffe
diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c index 65c65bb5737f..a1bcde3395a6 100644 --- a/drivers/mmc/host/mmc_spi.c +++ b/drivers/mmc/host/mmc_spi.c @@ -180,7 +180,7 @@ static int mmc_spi_skip(struct mmc_spi_host *host, unsigned long timeout, u8 *cp = host->data->status; unsigned long start = jiffies; - while (1) { + do { int status; unsigned i; @@ -193,16 +193,9 @@ static int mmc_spi_skip(struct mmc_spi_host *host, unsigned long timeout, return cp[i]; } - if (time_is_before_jiffies(start + timeout)) - break; - - /* If we need long timeouts, we may release the CPU. - * We use jiffies here because we want to have a relation - * between elapsed time and the blocking of the scheduler. - */ - if (time_is_before_jiffies(start + 1)) - schedule(); - } + /* If we need long timeouts, we may release the CPU */ + cond_resched(); + } while (time_is_after_jiffies(start + timeout)); return -ETIMEDOUT; }
Infinite loops are hard to read and understand because of hidden main loop condition. Simplify such one in mmc_spi_skip(). Using schedule() to schedule (and be friendly to others) is discouraged and cond_resched() should be used instead. Hence, replace schedule() with cond_resched() at the same time. Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> --- drivers/mmc/host/mmc_spi.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-)