2020-12-10 09:38:52

by Yejune Deng

[permalink] [raw]
Subject: [PATCH] net: core: fix msleep() is not accurate

See Documentation/timers/timers-howto.rst, msleep() is not
for (1ms - 20ms), There is a more advanced API is used.

Signed-off-by: Yejune Deng <[email protected]>
---
net/core/dev.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/net/core/dev.c b/net/core/dev.c
index d33099f..6e83ee03 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -6726,9 +6726,9 @@ void napi_disable(struct napi_struct *n)
set_bit(NAPI_STATE_DISABLE, &n->state);

while (test_and_set_bit(NAPI_STATE_SCHED, &n->state))
- msleep(1);
+ fsleep(1000);
while (test_and_set_bit(NAPI_STATE_NPSVC, &n->state))
- msleep(1);
+ fsleep(1000);

hrtimer_cancel(&n->timer);

--
1.9.1


2020-12-10 10:25:59

by Eric Dumazet

[permalink] [raw]
Subject: Re: [PATCH] net: core: fix msleep() is not accurate

On Thu, Dec 10, 2020 at 10:35 AM Yejune Deng <[email protected]> wrote:
>
> See Documentation/timers/timers-howto.rst, msleep() is not
> for (1ms - 20ms), There is a more advanced API is used.
>
> Signed-off-by: Yejune Deng <[email protected]>
> ---
> net/core/dev.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/net/core/dev.c b/net/core/dev.c
> index d33099f..6e83ee03 100644
> --- a/net/core/dev.c
> +++ b/net/core/dev.c
> @@ -6726,9 +6726,9 @@ void napi_disable(struct napi_struct *n)
> set_bit(NAPI_STATE_DISABLE, &n->state);
>
> while (test_and_set_bit(NAPI_STATE_SCHED, &n->state))
> - msleep(1);
> + fsleep(1000);
> while (test_and_set_bit(NAPI_STATE_NPSVC, &n->state))
> - msleep(1);
> + fsleep(1000);
>

I would prefer explicit usleep_range().

fsleep() is not common in the kernel, I had to go to its definition.

I would argue that we should use usleep_range(10, 200) to have an
opportunity to spend less time in napi_disable() in some cases.

2020-12-11 11:35:12

by Yejune Deng

[permalink] [raw]
Subject: Re: [PATCH] net: core: fix msleep() is not accurate

Does anyone else have a different opinion? If not,I will adopt it and resubmit.

On Thu, Dec 10, 2020 at 6:19 PM Eric Dumazet <[email protected]> wrote:
>
> On Thu, Dec 10, 2020 at 10:35 AM Yejune Deng <[email protected]> wrote:
> >
> > See Documentation/timers/timers-howto.rst, msleep() is not
> > for (1ms - 20ms), There is a more advanced API is used.
> >
> > Signed-off-by: Yejune Deng <[email protected]>
> > ---
> > net/core/dev.c | 4 ++--
> > 1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/net/core/dev.c b/net/core/dev.c
> > index d33099f..6e83ee03 100644
> > --- a/net/core/dev.c
> > +++ b/net/core/dev.c
> > @@ -6726,9 +6726,9 @@ void napi_disable(struct napi_struct *n)
> > set_bit(NAPI_STATE_DISABLE, &n->state);
> >
> > while (test_and_set_bit(NAPI_STATE_SCHED, &n->state))
> > - msleep(1);
> > + fsleep(1000);
> > while (test_and_set_bit(NAPI_STATE_NPSVC, &n->state))
> > - msleep(1);
> > + fsleep(1000);
> >
>
> I would prefer explicit usleep_range().
>
> fsleep() is not common in the kernel, I had to go to its definition.
>
> I would argue that we should use usleep_range(10, 200) to have an
> opportunity to spend less time in napi_disable() in some cases.