diff options
author | Benjamin Marzinski <bmarzins@redhat.com> | 2025-04-14 15:28:36 +0200 |
---|---|---|
committer | Mikulas Patocka <mpatocka@redhat.com> | 2025-05-04 11:35:05 +0200 |
commit | 33304b75df651bda2d34394e59cd9ee4e3c07602 (patch) | |
tree | 8c3a15d30e7f6a80e1440664dc380b01192f54bf /net/lapb/lapb_timer.c | |
parent | ad320ae27661f91585e00c114d1b264130f1bebe (diff) |
dm-delay: don't busy-wait in kthread
When using a kthread to delay the IOs, dm-delay would continuously loop,
checking if IOs were ready to submit. It had a cond_resched() call in
the loop, but might still loop hundreds of millions of times waiting for
an IO that was scheduled to be submitted 10s of ms in the future. With
the change to make dm-delay over zoned devices always use kthreads
regardless of the length of the delay, this wasted work only gets worse.
To solve this and still keep roughly the same precision for very short
delays, dm-delay now calls fsleep() for 1/8th of the smallest non-zero
delay it will place on IOs, or 1 ms, whichever is smaller. The reason
that dm-delay doesn't just use the actual expiration time of the next
delayed IO to calculated the sleep time is that delay_dtr() must wait
for the kthread to finish before deleting the table. If a zoned device
with a long delay queued an IO shortly before being suspended and
removed, the IO would be flushed in delay_presuspend(), but the removing
the device would still have to wait for the remainder of the long delay.
This time is now capped at 1 ms.
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Tested-by: Damien Le Moal <dlemoal@kernel.org>
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Diffstat (limited to 'net/lapb/lapb_timer.c')
0 files changed, 0 insertions, 0 deletions