Author: alc
Date: Tue May  4 15:55:41 2010
New Revision: 207617
URL: http://svn.freebsd.org/changeset/base/207617

Log:
  Add page locking to the vm_page_cow* functions.
  
  Push down the acquisition and release of the page queues lock into
  vm_page_wire().
  
  Reviewed by:  kib

Modified:
  head/sys/dev/drm/via_dmablit.c
  head/sys/kern/uipc_cow.c
  head/sys/kern/vfs_bio.c
  head/sys/net/bpf_zerocopy.c
  head/sys/vm/vm_fault.c
  head/sys/vm/vm_page.c

Modified: head/sys/dev/drm/via_dmablit.c
==============================================================================
--- head/sys/dev/drm/via_dmablit.c      Tue May  4 15:52:17 2010        
(r207616)
+++ head/sys/dev/drm/via_dmablit.c      Tue May  4 15:55:41 2010        
(r207617)
@@ -251,10 +251,8 @@ via_lock_all_dma_pages(drm_via_sg_info_t
                if (m == NULL)
                        break;
                vm_page_lock(m);
-               vm_page_lock_queues();
                vm_page_wire(m);
                vm_page_unhold(m);
-               vm_page_unlock_queues();
                vm_page_unlock(m);
                vsg->pages[i] = m;
        }

Modified: head/sys/kern/uipc_cow.c
==============================================================================
--- head/sys/kern/uipc_cow.c    Tue May  4 15:52:17 2010        (r207616)
+++ head/sys/kern/uipc_cow.c    Tue May  4 15:55:41 2010        (r207617)
@@ -131,10 +131,8 @@ socow_setup(struct mbuf *m0, struct uio 
         * set up COW
         */
        vm_page_lock(pp);
-       vm_page_lock_queues();
        if (vm_page_cowsetup(pp) != 0) {
                vm_page_unhold(pp);
-               vm_page_unlock_queues();
                vm_page_unlock(pp);
                return (0);
        }
@@ -144,7 +142,6 @@ socow_setup(struct mbuf *m0, struct uio 
         */
        vm_page_wire(pp);
        vm_page_unhold(pp);
-       vm_page_unlock_queues();
        vm_page_unlock(pp);
        /*
         * Allocate an sf buf

Modified: head/sys/kern/vfs_bio.c
==============================================================================
--- head/sys/kern/vfs_bio.c     Tue May  4 15:52:17 2010        (r207616)
+++ head/sys/kern/vfs_bio.c     Tue May  4 15:55:41 2010        (r207617)
@@ -3043,9 +3043,7 @@ allocbuf(struct buf *bp, int size)
                                 * We have a good page.
                                 */
                                vm_page_lock(m);
-                               vm_page_lock_queues();
                                vm_page_wire(m);
-                               vm_page_unlock_queues();
                                vm_page_unlock(m);
                                bp->b_pages[bp->b_npages] = m;
                                ++bp->b_npages;

Modified: head/sys/net/bpf_zerocopy.c
==============================================================================
--- head/sys/net/bpf_zerocopy.c Tue May  4 15:52:17 2010        (r207616)
+++ head/sys/net/bpf_zerocopy.c Tue May  4 15:55:41 2010        (r207617)
@@ -171,10 +171,8 @@ zbuf_sfbuf_get(struct vm_map *map, vm_of
        if (pp == NULL)
                return (NULL);
        vm_page_lock(pp);
-       vm_page_lock_queues();
        vm_page_wire(pp);
        vm_page_unhold(pp);
-       vm_page_unlock_queues();
        vm_page_unlock(pp);
        sf = sf_buf_alloc(pp, SFB_NOWAIT);
        if (sf == NULL) {

Modified: head/sys/vm/vm_fault.c
==============================================================================
--- head/sys/vm/vm_fault.c      Tue May  4 15:52:17 2010        (r207616)
+++ head/sys/vm/vm_fault.c      Tue May  4 15:55:41 2010        (r207617)
@@ -315,8 +315,6 @@ RetryFault:;
                            (fault_type & VM_PROT_WRITE) &&
                            (fs.object == fs.first_object)) {
                                vm_page_cowfault(fs.m);
-                               vm_page_unlock_queues();
-                               vm_page_unlock(fs.m);
                                unlock_and_deallocate(&fs);
                                goto RetryFault;
                        }
@@ -797,9 +795,7 @@ vnode_locked:
                                if (wired && (fault_flags &
                                    VM_FAULT_CHANGE_WIRING) == 0) {
                                        vm_page_lock(fs.first_m);
-                                       vm_page_lock_queues();
                                        vm_page_wire(fs.first_m);
-                                       vm_page_unlock_queues();
                                        vm_page_unlock(fs.first_m);
                                        
                                        vm_page_lock(fs.m);
@@ -1285,9 +1281,7 @@ vm_fault_copy_entry(vm_map_t dst_map, vm
                        vm_page_unlock(src_m);
 
                        vm_page_lock(dst_m);
-                       vm_page_lock_queues();
                        vm_page_wire(dst_m);
-                       vm_page_unlock_queues();
                        vm_page_unlock(dst_m);
                } else {
                        vm_page_lock(dst_m);

Modified: head/sys/vm/vm_page.c
==============================================================================
--- head/sys/vm/vm_page.c       Tue May  4 15:52:17 2010        (r207616)
+++ head/sys/vm/vm_page.c       Tue May  4 15:55:41 2010        (r207617)
@@ -1544,13 +1544,15 @@ vm_page_wire(vm_page_t m)
         * and only unqueue the page if it is on some queue (if it is unmanaged
         * it is already off the queues).
         */
-       mtx_assert(&vm_page_queue_mtx, MA_OWNED);
        vm_page_lock_assert(m, MA_OWNED);
        if (m->flags & PG_FICTITIOUS)
                return;
        if (m->wire_count == 0) {
-               if ((m->flags & PG_UNMANAGED) == 0)
+               if ((m->flags & PG_UNMANAGED) == 0) {
+                       vm_page_lock_queues();
                        vm_pageq_remove(m);
+                       vm_page_unlock_queues();
+               }
                atomic_add_int(&cnt.v_wire_count, 1);
        }
        m->wire_count++;
@@ -1922,9 +1924,7 @@ retrylookup:
                } else {
                        if ((allocflags & VM_ALLOC_WIRED) != 0) {
                                vm_page_lock(m);
-                               vm_page_lock_queues();
                                vm_page_wire(m);
-                               vm_page_unlock_queues();
                                vm_page_unlock(m);
                        }
                        if ((allocflags & VM_ALLOC_NOBUSY) == 0)
@@ -2224,6 +2224,7 @@ vm_page_cowfault(vm_page_t m)
        vm_object_t object;
        vm_pindex_t pindex;
 
+       vm_page_lock_assert(m, MA_OWNED);
        object = m->object;
        VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
        KASSERT(object->paging_in_progress != 0,
@@ -2238,17 +2239,18 @@ vm_page_cowfault(vm_page_t m)
        if (mnew == NULL) {
                vm_page_insert(m, object, pindex);
                vm_page_unlock_queues();
+               vm_page_unlock(m);
                VM_OBJECT_UNLOCK(object);
                VM_WAIT;
                VM_OBJECT_LOCK(object);
                if (m == vm_page_lookup(object, pindex)) {
+                       vm_page_lock(m);
                        vm_page_lock_queues();
                        goto retry_alloc;
                } else {
                        /*
                         * Page disappeared during the wait.
                         */
-                       vm_page_lock_queues();
                        return;
                }
        }
@@ -2269,13 +2271,15 @@ vm_page_cowfault(vm_page_t m)
                mnew->wire_count = m->wire_count - m->cow;
                m->wire_count = m->cow;
        }
+       vm_page_unlock_queues();
+       vm_page_unlock(m);
 }
 
 void 
 vm_page_cowclear(vm_page_t m)
 {
 
-       mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+       vm_page_lock_assert(m, MA_OWNED);
        if (m->cow) {
                m->cow--;
                /* 
@@ -2291,11 +2295,13 @@ int
 vm_page_cowsetup(vm_page_t m)
 {
 
-       mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+       vm_page_lock_assert(m, MA_OWNED);
        if (m->cow == USHRT_MAX - 1)
                return (EBUSY);
        m->cow++;
+       vm_page_lock_queues();
        pmap_remove_write(m);
+       vm_page_unlock_queues();
        return (0);
 }
 
_______________________________________________
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