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();
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to