Commit 33b8807a authored by Johan Hovold's avatar Johan Hovold Committed by Greg Kroah-Hartman

staging: greybus: loopback: fix broken udelay

The loopback driver allows the user to set a minimum delay of up to one
second to be inserted between test iterations (i.e. request
submissions). The delay is currently specified in microseconds and is
implemented using udelay.

Busy looping for long periods is not just anti-social; udelay must not
be used for delays longer than a few milliseconds due to the risk of
integer overflow.

Replace the broken udelay with a usleep_range with a 100 us range for
short delays (< 20 ms) and otherwise revert to using msleep.

Fixes: b36f04fa ("greybus: loopback: Convert thread delay to microseconds")
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
Cc: stable <stable@vger.kernel.org> # 4.9+
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 946d7c78
...@@ -1061,8 +1061,13 @@ static int gb_loopback_fn(void *data) ...@@ -1061,8 +1061,13 @@ static int gb_loopback_fn(void *data)
gb_loopback_calculate_stats(gb, !!error); gb_loopback_calculate_stats(gb, !!error);
} }
gb->send_count++; gb->send_count++;
if (us_wait)
udelay(us_wait); if (us_wait) {
if (us_wait < 20000)
usleep_range(us_wait, us_wait + 100);
else
msleep(us_wait / 1000);
}
} }
gb_pm_runtime_put_autosuspend(bundle); gb_pm_runtime_put_autosuspend(bundle);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment