diff options
Diffstat (limited to 'sys/kern/subr_uio.c')
-rw-r--r-- | sys/kern/subr_uio.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/sys/kern/subr_uio.c b/sys/kern/subr_uio.c index 9b93005..96f9331 100644 --- a/sys/kern/subr_uio.c +++ b/sys/kern/subr_uio.c @@ -158,8 +158,7 @@ uiomove(void *cp, int n, struct uio *uio) switch (uio->uio_segflg) { case UIO_USERSPACE: - if (ticks - PCPU_GET(switchticks) >= hogticks) - uio_yield(); + maybe_yield(); if (uio->uio_rw == UIO_READ) error = copyout(cp, iov->iov_base, cnt); else @@ -283,11 +282,8 @@ uiomoveco(void *cp, int n, struct uio *uio, int disposable) switch (uio->uio_segflg) { case UIO_USERSPACE: - if (ticks - PCPU_GET(switchticks) >= hogticks) - uio_yield(); - + maybe_yield(); error = userspaceco(cp, cnt, uio, disposable); - if (error) return (error); break; @@ -356,6 +352,21 @@ again: return (0); } +int +should_yield(void) +{ + + return (ticks - PCPU_GET(switchticks) >= hogticks); +} + +void +maybe_yield(void) +{ + + if (should_yield()) + uio_yield(); +} + void uio_yield(void) { |