summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_uio.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/subr_uio.c')
-rw-r--r--sys/kern/subr_uio.c23
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)
{
OpenPOWER on IntegriCloud