Author: alc
Date: Mon May  3 16:41:11 2010
New Revision: 207573
URL: http://svn.freebsd.org/changeset/base/207573

Log:
  Acquire the page lock around vm_page_unwire() and vm_page_wire().
  
  Reviewed by:  kib

Modified:
  head/sys/fs/tmpfs/tmpfs_vnops.c
  head/sys/kern/vfs_bio.c

Modified: head/sys/fs/tmpfs/tmpfs_vnops.c
==============================================================================
--- head/sys/fs/tmpfs/tmpfs_vnops.c     Mon May  3 16:08:24 2010        
(r207572)
+++ head/sys/fs/tmpfs/tmpfs_vnops.c     Mon May  3 16:41:11 2010        
(r207573)
@@ -460,9 +460,11 @@ tmpfs_nocacheread(vm_object_t tobj, vm_p
        error = uiomove_fromphys(&m, offset, tlen, uio);
        VM_OBJECT_LOCK(tobj);
 out:
+       vm_page_lock(m);
        vm_page_lock_queues();
        vm_page_unwire(m, TRUE);
        vm_page_unlock_queues();
+       vm_page_unlock(m);
        vm_page_wakeup(m);
        vm_object_pip_subtract(tobj, 1);
        VM_OBJECT_UNLOCK(tobj);
@@ -691,6 +693,7 @@ nocache:
 out:
        if (vobj != NULL)
                VM_OBJECT_LOCK(vobj);
+       vm_page_lock(tpg);
        vm_page_lock_queues();
        if (error == 0) {
                KASSERT(tpg->valid == VM_PAGE_BITS_ALL,
@@ -699,6 +702,7 @@ out:
        }
        vm_page_unwire(tpg, TRUE);
        vm_page_unlock_queues();
+       vm_page_unlock(tpg);
        vm_page_wakeup(tpg);
        if (vpg != NULL)
                vm_page_wakeup(vpg);

Modified: head/sys/kern/vfs_bio.c
==============================================================================
--- head/sys/kern/vfs_bio.c     Mon May  3 16:08:24 2010        (r207572)
+++ head/sys/kern/vfs_bio.c     Mon May  3 16:41:11 2010        (r207573)
@@ -2942,7 +2942,6 @@ allocbuf(struct buf *bp, int size)
                                vm_page_t m;
 
                                VM_OBJECT_LOCK(bp->b_bufobj->bo_object);
-                               vm_page_lock_queues();
                                for (i = desiredpages; i < bp->b_npages; i++) {
                                        /*
                                         * the page is not freed here -- it
@@ -2952,13 +2951,17 @@ allocbuf(struct buf *bp, int size)
                                        m = bp->b_pages[i];
                                        KASSERT(m != bogus_page,
                                            ("allocbuf: bogus page found"));
-                                       while (vm_page_sleep_if_busy(m, TRUE, 
"biodep"))
-                                               vm_page_lock_queues();
+                                       while (vm_page_sleep_if_busy(m, TRUE,
+                                           "biodep"))
+                                               continue;
 
                                        bp->b_pages[i] = NULL;
+                                       vm_page_lock(m);
+                                       vm_page_lock_queues();
                                        vm_page_unwire(m, 0);
+                                       vm_page_unlock_queues();
+                                       vm_page_unlock(m);
                                }
-                               vm_page_unlock_queues();
                                VM_OBJECT_UNLOCK(bp->b_bufobj->bo_object);
                                pmap_qremove((vm_offset_t) 
trunc_page((vm_offset_t)bp->b_data) +
                                    (desiredpages << PAGE_SHIFT), (bp->b_npages 
- desiredpages));
@@ -3039,9 +3042,11 @@ 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;
                        }
_______________________________________________
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