svn commit: r218195 - in head/sys: amd64/amd64 arm/arm i386/i386
ia64/ia64 kern mips/mips powerpc/powerpc sparc64/sparc64
sun4v/sun4v sys ufs/ffs
Matthew D Fleming
mdf at FreeBSD.org
Wed Feb 2 16:35:10 UTC 2011
Author: mdf
Date: Wed Feb 2 16:35:10 2011
New Revision: 218195
URL: http://svn.freebsd.org/changeset/base/218195
Log:
Put the general logic for being a CPU hog into a new function
should_yield(). Use this in various places. Encapsulate the common
case of check-and-yield into a new function maybe_yield().
Change several checks for a magic number of iterations to use
should_yield() instead.
MFC after: 1 week
Modified:
head/sys/amd64/amd64/uio_machdep.c
head/sys/arm/arm/uio_machdep.c
head/sys/i386/i386/uio_machdep.c
head/sys/ia64/ia64/uio_machdep.c
head/sys/kern/imgact_elf.c
head/sys/kern/subr_uio.c
head/sys/kern/vfs_mount.c
head/sys/kern/vfs_subr.c
head/sys/mips/mips/uio_machdep.c
head/sys/powerpc/powerpc/uio_machdep.c
head/sys/sparc64/sparc64/uio_machdep.c
head/sys/sun4v/sun4v/uio_machdep.c
head/sys/sys/uio.h
head/sys/sys/vnode.h
head/sys/ufs/ffs/ffs_rawread.c
head/sys/ufs/ffs/ffs_softdep.c
Modified: head/sys/amd64/amd64/uio_machdep.c
==============================================================================
--- head/sys/amd64/amd64/uio_machdep.c Wed Feb 2 15:53:09 2011 (r218194)
+++ head/sys/amd64/amd64/uio_machdep.c Wed Feb 2 16:35:10 2011 (r218195)
@@ -88,8 +88,7 @@ uiomove_fromphys(vm_page_t ma[], vm_offs
page_offset;
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
Modified: head/sys/arm/arm/uio_machdep.c
==============================================================================
--- head/sys/arm/arm/uio_machdep.c Wed Feb 2 15:53:09 2011 (r218194)
+++ head/sys/arm/arm/uio_machdep.c Wed Feb 2 16:35:10 2011 (r218195)
@@ -94,8 +94,7 @@ uiomove_fromphys(vm_page_t ma[], vm_offs
cp = (char*)sf_buf_kva(sf) + page_offset;
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
Modified: head/sys/i386/i386/uio_machdep.c
==============================================================================
--- head/sys/i386/i386/uio_machdep.c Wed Feb 2 15:53:09 2011 (r218194)
+++ head/sys/i386/i386/uio_machdep.c Wed Feb 2 16:35:10 2011 (r218195)
@@ -90,8 +90,7 @@ uiomove_fromphys(vm_page_t ma[], vm_offs
cp = (char *)sf_buf_kva(sf) + page_offset;
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
Modified: head/sys/ia64/ia64/uio_machdep.c
==============================================================================
--- head/sys/ia64/ia64/uio_machdep.c Wed Feb 2 15:53:09 2011 (r218194)
+++ head/sys/ia64/ia64/uio_machdep.c Wed Feb 2 16:35:10 2011 (r218195)
@@ -89,8 +89,7 @@ uiomove_fromphys(vm_page_t ma[], vm_offs
page_offset;
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
Modified: head/sys/kern/imgact_elf.c
==============================================================================
--- head/sys/kern/imgact_elf.c Wed Feb 2 15:53:09 2011 (r218194)
+++ head/sys/kern/imgact_elf.c Wed Feb 2 16:35:10 2011 (r218195)
@@ -1622,8 +1622,7 @@ compress_core (gzFile file, char *inbuf,
}
inbuf += chunk_len;
len -= chunk_len;
- if (ticks - PCPU_GET(switchticks) >= hogticks)
- uio_yield();
+ maybe_yield();
}
return (error);
Modified: head/sys/kern/subr_uio.c
==============================================================================
--- head/sys/kern/subr_uio.c Wed Feb 2 15:53:09 2011 (r218194)
+++ head/sys/kern/subr_uio.c Wed Feb 2 16:35:10 2011 (r218195)
@@ -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 *u
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)
{
Modified: head/sys/kern/vfs_mount.c
==============================================================================
--- head/sys/kern/vfs_mount.c Wed Feb 2 15:53:09 2011 (r218194)
+++ head/sys/kern/vfs_mount.c Wed Feb 2 16:35:10 2011 (r218195)
@@ -1659,9 +1659,8 @@ __mnt_vnode_next(struct vnode **mvp, str
mtx_assert(MNT_MTX(mp), MA_OWNED);
KASSERT((*mvp)->v_mount == mp, ("marker vnode mount list mismatch"));
- if ((*mvp)->v_yield++ == 500) {
+ if (should_yield()) {
MNT_IUNLOCK(mp);
- (*mvp)->v_yield = 0;
uio_yield();
MNT_ILOCK(mp);
}
Modified: head/sys/kern/vfs_subr.c
==============================================================================
--- head/sys/kern/vfs_subr.c Wed Feb 2 15:53:09 2011 (r218194)
+++ head/sys/kern/vfs_subr.c Wed Feb 2 16:35:10 2011 (r218195)
@@ -707,11 +707,11 @@ vlrureclaim(struct mount *mp)
vdropl(vp);
done++;
next_iter_mntunlocked:
- if ((count % 256) != 0)
+ if (should_yield())
goto relock_mnt;
goto yield;
next_iter:
- if ((count % 256) != 0)
+ if (should_yield())
continue;
MNT_IUNLOCK(mp);
yield:
Modified: head/sys/mips/mips/uio_machdep.c
==============================================================================
--- head/sys/mips/mips/uio_machdep.c Wed Feb 2 15:53:09 2011 (r218194)
+++ head/sys/mips/mips/uio_machdep.c Wed Feb 2 16:35:10 2011 (r218195)
@@ -107,8 +107,7 @@ uiomove_fromphys(vm_page_t ma[], vm_offs
}
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
Modified: head/sys/powerpc/powerpc/uio_machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/uio_machdep.c Wed Feb 2 15:53:09 2011 (r218194)
+++ head/sys/powerpc/powerpc/uio_machdep.c Wed Feb 2 16:35:10 2011 (r218195)
@@ -97,8 +97,7 @@ uiomove_fromphys(vm_page_t ma[], vm_offs
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
Modified: head/sys/sparc64/sparc64/uio_machdep.c
==============================================================================
--- head/sys/sparc64/sparc64/uio_machdep.c Wed Feb 2 15:53:09 2011 (r218194)
+++ head/sys/sparc64/sparc64/uio_machdep.c Wed Feb 2 16:35:10 2011 (r218195)
@@ -103,8 +103,7 @@ uiomove_fromphys(vm_page_t ma[], vm_offs
}
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
Modified: head/sys/sun4v/sun4v/uio_machdep.c
==============================================================================
--- head/sys/sun4v/sun4v/uio_machdep.c Wed Feb 2 15:53:09 2011 (r218194)
+++ head/sys/sun4v/sun4v/uio_machdep.c Wed Feb 2 16:35:10 2011 (r218195)
@@ -94,8 +94,7 @@ uiomove_fromphys(vm_page_t ma[], vm_offs
cp = (char *)TLB_PHYS_TO_DIRECT(pa) + page_offset;
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
Modified: head/sys/sys/uio.h
==============================================================================
--- head/sys/sys/uio.h Wed Feb 2 15:53:09 2011 (r218194)
+++ head/sys/sys/uio.h Wed Feb 2 16:35:10 2011 (r218195)
@@ -95,6 +95,8 @@ int copyinstrfrom(const void * __restric
size_t len, size_t * __restrict copied, int seg);
int copyinuio(struct iovec *iovp, u_int iovcnt, struct uio **uiop);
void uio_yield(void);
+void maybe_yield(void);
+int should_yield(void);
int uiomove(void *cp, int n, struct uio *uio);
int uiomove_frombuf(void *buf, int buflen, struct uio *uio);
int uiomove_fromphys(struct vm_page *ma[], vm_offset_t offset, int n,
Modified: head/sys/sys/vnode.h
==============================================================================
--- head/sys/sys/vnode.h Wed Feb 2 15:53:09 2011 (r218194)
+++ head/sys/sys/vnode.h Wed Feb 2 16:35:10 2011 (r218195)
@@ -121,7 +121,6 @@ struct vnode {
struct socket *vu_socket; /* v unix domain net (VSOCK) */
struct cdev *vu_cdev; /* v device (VCHR, VBLK) */
struct fifoinfo *vu_fifoinfo; /* v fifo (VFIFO) */
- int vu_yield; /* yield count (VMARKER) */
} v_un;
/*
@@ -177,7 +176,6 @@ struct vnode {
#define v_socket v_un.vu_socket
#define v_rdev v_un.vu_cdev
#define v_fifoinfo v_un.vu_fifoinfo
-#define v_yield v_un.vu_yield
/* XXX: These are temporary to avoid a source sweep at this time */
#define v_object v_bufobj.bo_object
Modified: head/sys/ufs/ffs/ffs_rawread.c
==============================================================================
--- head/sys/ufs/ffs/ffs_rawread.c Wed Feb 2 15:53:09 2011 (r218194)
+++ head/sys/ufs/ffs/ffs_rawread.c Wed Feb 2 16:35:10 2011 (r218195)
@@ -243,8 +243,7 @@ ffs_rawread_readahead(struct vnode *vp,
if (vmapbuf(bp) < 0)
return EFAULT;
- if (ticks - PCPU_GET(switchticks) >= hogticks)
- uio_yield();
+ maybe_yield();
bzero(bp->b_data, bp->b_bufsize);
/* Mark operation completed (similar to bufdone()) */
Modified: head/sys/ufs/ffs/ffs_softdep.c
==============================================================================
--- head/sys/ufs/ffs/ffs_softdep.c Wed Feb 2 15:53:09 2011 (r218194)
+++ head/sys/ufs/ffs/ffs_softdep.c Wed Feb 2 16:35:10 2011 (r218195)
@@ -1342,7 +1342,7 @@ softdep_process_worklist(mp, full)
int full;
{
struct thread *td = curthread;
- int cnt, matchcnt, loopcount;
+ int cnt, matchcnt;
struct ufsmount *ump;
long starttime;
@@ -1354,7 +1354,6 @@ softdep_process_worklist(mp, full)
matchcnt = 0;
ump = VFSTOUFS(mp);
ACQUIRE_LOCK(&lk);
- loopcount = 1;
starttime = time_second;
softdep_process_journal(mp, full?MNT_WAIT:0);
while (ump->softdep_on_worklist > 0) {
@@ -1379,7 +1378,7 @@ softdep_process_worklist(mp, full)
* We do not generally want to stop for buffer space, but if
* we are really being a buffer hog, we will stop and wait.
*/
- if (loopcount++ % 128 == 0) {
+ if (should_yield()) {
FREE_LOCK(&lk);
uio_yield();
bwillwrite();
More information about the svn-src-all
mailing list