Messages in this thread | | | Subject | Re: [PATCH] /dev/mem: nowait zero/null ops | From | Jens Axboe <> | Date | Wed, 8 Sep 2021 07:53:58 -0600 |
| |
On 9/8/21 7:07 AM, Pavel Begunkov wrote: > On 9/8/21 1:57 PM, Jens Axboe wrote: >> On 9/8/21 4:06 AM, Pavel Begunkov wrote: >>> Make read_iter_zero() to honor IOCB_NOWAIT, so /dev/zero can be >>> advertised as FMODE_NOWAIT. This helps subsystems like io_uring to use >>> it more effectively. Set FMODE_NOWAIT for /dev/null as well, it never >>> waits and therefore trivially meets the criteria. >>> >>> Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> >>> --- >>> drivers/char/mem.c | 6 ++++-- >>> 1 file changed, 4 insertions(+), 2 deletions(-) >>> >>> diff --git a/drivers/char/mem.c b/drivers/char/mem.c >>> index 1c596b5cdb27..531f144d7132 100644 >>> --- a/drivers/char/mem.c >>> +++ b/drivers/char/mem.c >>> @@ -495,6 +495,8 @@ static ssize_t read_iter_zero(struct kiocb *iocb, struct iov_iter *iter) >>> written += n; >>> if (signal_pending(current)) >>> return written ? written : -ERESTARTSYS; >>> + if (iocb->ki_flags & IOCB_NOWAIT) >>> + return written ? written : -EAGAIN; >>> cond_resched(); >>> } >> >> I don't think this part is needed. > > It can be clearing gigabytes in one go. Won't it be too much of a > delay when nowait is expected?
I guess it can't hurt, but then it should be changed to:
if (!need_resched()) continue; if (iocb->ki_flags & IOCB_NOWAIT) return written ? written : -EAGAIN; cond_resched();
to avoid doing -EAGAIN just because there's more than one segment in the buffer. Even that may be excessive though, but definitely a lot better.
-- Jens Axboe
| |