]> xenbits.xensource.com Git - freebsd.git/commitdiff
Use REFCOUNT_COUNT() to obtain refcount where appropriate.
authorhselasky <hselasky@FreeBSD.org>
Thu, 12 Sep 2019 16:26:59 +0000 (16:26 +0000)
committerhselasky <hselasky@FreeBSD.org>
Thu, 12 Sep 2019 16:26:59 +0000 (16:26 +0000)
Refcount waiting will set some flag bits in the refcount value.
Make sure these bits get cleared by using the REFCOUNT_COUNT()
macro to obtain the actual refcount.

Differential Revision: https://reviews.freebsd.org/D21620
Reviewed by: kib@, markj@
MFC after: 1 week
Sponsored by: Mellanox Technologies

sys/kern/vfs_bio.c
sys/vm/vm_fault.c
sys/vm/vm_object.c
sys/vm/vm_swapout.c

index 22801b5fe1a8e683f36aa13b6fcca4df46e18c06..940b276656007d07a9f05c3806f096f47be231c3 100644 (file)
@@ -67,6 +67,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/kthread.h>
 #include <sys/proc.h>
 #include <sys/racct.h>
+#include <sys/refcount.h>
 #include <sys/resourcevar.h>
 #include <sys/rwlock.h>
 #include <sys/smp.h>
@@ -2842,9 +2843,9 @@ vfs_vmio_iodone(struct buf *bp)
        bool bogus;
 
        obj = bp->b_bufobj->bo_object;
-       KASSERT(obj->paging_in_progress >= bp->b_npages,
+       KASSERT(REFCOUNT_COUNT(obj->paging_in_progress) >= bp->b_npages,
            ("vfs_vmio_iodone: paging in progress(%d) < b_npages(%d)",
-           obj->paging_in_progress, bp->b_npages));
+           REFCOUNT_COUNT(obj->paging_in_progress), bp->b_npages));
 
        vp = bp->b_vp;
        KASSERT(vp->v_holdcnt > 0,
index 35742af74bdeca50f03899acbdd244f6b7753c53..f3557bbde5acf1928459eeebaa329288d933fa8a 100644 (file)
@@ -87,6 +87,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/mutex.h>
 #include <sys/proc.h>
 #include <sys/racct.h>
+#include <sys/refcount.h>
 #include <sys/resourcevar.h>
 #include <sys/rwlock.h>
 #include <sys/sysctl.h>
@@ -339,7 +340,7 @@ vm_fault_restore_map_lock(struct faultstate *fs)
 {
 
        VM_OBJECT_ASSERT_WLOCKED(fs->first_object);
-       MPASS(fs->first_object->paging_in_progress > 0);
+       MPASS(REFCOUNT_COUNT(fs->first_object->paging_in_progress) > 0);
 
        if (!vm_map_trylock_read(fs->map)) {
                VM_OBJECT_WUNLOCK(fs->first_object);
@@ -394,7 +395,7 @@ vm_fault_populate(struct faultstate *fs, vm_prot_t prot, int fault_type,
 
        MPASS(fs->object == fs->first_object);
        VM_OBJECT_ASSERT_WLOCKED(fs->first_object);
-       MPASS(fs->first_object->paging_in_progress > 0);
+       MPASS(REFCOUNT_COUNT(fs->first_object->paging_in_progress) > 0);
        MPASS(fs->first_object->backing_object == NULL);
        MPASS(fs->lookup_still_valid);
 
index b65a74d136c652ab51f944dcb67cc8deab8e543b..a2f6cb7c1f2266002e7e3185cccf2f5b2fec4867 100644 (file)
@@ -195,9 +195,9 @@ vm_object_zdtor(void *mem, int size, void *arg)
            ("object %p has reservations",
            object));
 #endif
-       KASSERT(object->paging_in_progress == 0,
+       KASSERT(REFCOUNT_COUNT(object->paging_in_progress) == 0,
            ("object %p paging_in_progress = %d",
-           object, object->paging_in_progress));
+           object, REFCOUNT_COUNT(object->paging_in_progress)));
        KASSERT(object->resident_page_count == 0,
            ("object %p resident_page_count = %d",
            object, object->resident_page_count));
@@ -395,7 +395,7 @@ vm_object_pip_wait(vm_object_t object, char *waitid)
 
        VM_OBJECT_ASSERT_WLOCKED(object);
 
-       while (object->paging_in_progress) {
+       while (REFCOUNT_COUNT(object->paging_in_progress) > 0) {
                VM_OBJECT_WUNLOCK(object);
                refcount_wait(&object->paging_in_progress, waitid, PVM);
                VM_OBJECT_WLOCK(object);
@@ -408,7 +408,7 @@ vm_object_pip_wait_unlocked(vm_object_t object, char *waitid)
 
        VM_OBJECT_ASSERT_UNLOCKED(object);
 
-       while (object->paging_in_progress)
+       while (REFCOUNT_COUNT(object->paging_in_progress) > 0)
                refcount_wait(&object->paging_in_progress, waitid, PVM);
 }
 
@@ -577,7 +577,7 @@ vm_object_deallocate(vm_object_t object)
 
                                        robject->ref_count++;
 retry:
-                                       if (robject->paging_in_progress) {
+                                       if (REFCOUNT_COUNT(robject->paging_in_progress) > 0) {
                                                VM_OBJECT_WUNLOCK(object);
                                                vm_object_pip_wait(robject,
                                                    "objde1");
@@ -586,7 +586,7 @@ retry:
                                                        VM_OBJECT_WLOCK(object);
                                                        goto retry;
                                                }
-                                       } else if (object->paging_in_progress) {
+                                       } else if (REFCOUNT_COUNT(object->paging_in_progress) > 0) {
                                                VM_OBJECT_WUNLOCK(robject);
                                                VM_OBJECT_WUNLOCK(object);
                                                refcount_wait(
@@ -729,7 +729,7 @@ vm_object_terminate(vm_object_t object)
         */
        vm_object_pip_wait(object, "objtrm");
 
-       KASSERT(!object->paging_in_progress,
+       KASSERT(!REFCOUNT_COUNT(object->paging_in_progress),
                ("vm_object_terminate: pageout in progress"));
 
        KASSERT(object->ref_count == 0, 
@@ -1660,8 +1660,8 @@ vm_object_collapse(vm_object_t object)
                        break;
                }
 
-               if (object->paging_in_progress != 0 ||
-                   backing_object->paging_in_progress != 0) {
+               if (REFCOUNT_COUNT(object->paging_in_progress) > 0 ||
+                   REFCOUNT_COUNT(backing_object->paging_in_progress) > 0) {
                        vm_object_qcollapse(object);
                        VM_OBJECT_WUNLOCK(backing_object);
                        break;
index 2557dc6f4e55bc8c1244f24ef0689c80fdc3a53c..d71c3d07a0d9f06c5856eaa9d84231627d0ccf0f 100644 (file)
@@ -90,6 +90,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/mount.h>
 #include <sys/racct.h>
 #include <sys/resourcevar.h>
+#include <sys/refcount.h>
 #include <sys/sched.h>
 #include <sys/sdt.h>
 #include <sys/signalvar.h>
@@ -193,7 +194,7 @@ vm_swapout_object_deactivate_pages(pmap_t pmap, vm_object_t first_object,
                        goto unlock_return;
                VM_OBJECT_ASSERT_LOCKED(object);
                if ((object->flags & OBJ_UNMANAGED) != 0 ||
-                   object->paging_in_progress != 0)
+                   REFCOUNT_COUNT(object->paging_in_progress) > 0)
                        goto unlock_return;
 
                remove_mode = 0;