Page MenuHomeFreeBSD

D8196.diff
No OneTemporary

D8196.diff

Index: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
===================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
@@ -421,7 +421,7 @@
vm_page_reference(pp);
vm_page_lock(pp);
zfs_vmobject_wunlock(obj);
- vm_page_busy_sleep(pp, "zfsmwb");
+ vm_page_busy_sleep(pp, "zfsmwb", true);
zfs_vmobject_wlock(obj);
continue;
}
@@ -476,7 +476,7 @@
vm_page_reference(pp);
vm_page_lock(pp);
zfs_vmobject_wunlock(obj);
- vm_page_busy_sleep(pp, "zfsmwb");
+ vm_page_busy_sleep(pp, "zfsmwb", true);
zfs_vmobject_wlock(obj);
continue;
}
Index: head/sys/dev/drm2/i915/i915_gem.c
===================================================================
--- head/sys/dev/drm2/i915/i915_gem.c
+++ head/sys/dev/drm2/i915/i915_gem.c
@@ -1533,7 +1533,7 @@
DRM_UNLOCK(dev);
vm_page_lock(page);
VM_OBJECT_WUNLOCK(vm_obj);
- vm_page_busy_sleep(page, "915pee");
+ vm_page_busy_sleep(page, "915pee", false);
goto retry;
}
goto have_page;
@@ -1575,7 +1575,7 @@
DRM_UNLOCK(dev);
vm_page_lock(page);
VM_OBJECT_WUNLOCK(vm_obj);
- vm_page_busy_sleep(page, "915pbs");
+ vm_page_busy_sleep(page, "915pbs", false);
goto retry;
}
if (vm_page_insert(page, vm_obj, OFF_TO_IDX(offset))) {
Index: head/sys/dev/drm2/ttm/ttm_bo_vm.c
===================================================================
--- head/sys/dev/drm2/ttm/ttm_bo_vm.c
+++ head/sys/dev/drm2/ttm/ttm_bo_vm.c
@@ -236,7 +236,7 @@
if (vm_page_busied(m)) {
vm_page_lock(m);
VM_OBJECT_WUNLOCK(vm_obj);
- vm_page_busy_sleep(m, "ttmpbs");
+ vm_page_busy_sleep(m, "ttmpbs", false);
VM_OBJECT_WLOCK(vm_obj);
ttm_mem_io_unlock(man);
ttm_bo_unreserve(bo);
Index: head/sys/kern/vfs_bio.c
===================================================================
--- head/sys/kern/vfs_bio.c
+++ head/sys/kern/vfs_bio.c
@@ -2633,7 +2633,7 @@
while (vm_page_xbusied(m)) {
vm_page_lock(m);
VM_OBJECT_WUNLOCK(obj);
- vm_page_busy_sleep(m, "mbncsh");
+ vm_page_busy_sleep(m, "mbncsh", true);
VM_OBJECT_WLOCK(obj);
}
if (pmap_page_wired_mappings(m) == 0)
@@ -4182,7 +4182,7 @@
while (vm_page_xbusied(m)) {
vm_page_lock(m);
VM_OBJECT_WUNLOCK(bp->b_bufobj->bo_object);
- vm_page_busy_sleep(m, "vbpage");
+ vm_page_busy_sleep(m, "vbpage", true);
VM_OBJECT_WLOCK(bp->b_bufobj->bo_object);
}
}
Index: head/sys/vm/vm_object.c
===================================================================
--- head/sys/vm/vm_object.c
+++ head/sys/vm/vm_object.c
@@ -1186,7 +1186,7 @@
if (object != tobject)
VM_OBJECT_WUNLOCK(object);
VM_OBJECT_WUNLOCK(tobject);
- vm_page_busy_sleep(m, "madvpo");
+ vm_page_busy_sleep(m, "madvpo", false);
VM_OBJECT_WLOCK(object);
goto relookup;
}
@@ -1365,7 +1365,7 @@
VM_OBJECT_WUNLOCK(new_object);
vm_page_lock(m);
VM_OBJECT_WUNLOCK(orig_object);
- vm_page_busy_sleep(m, "spltwt");
+ vm_page_busy_sleep(m, "spltwt", false);
VM_OBJECT_WLOCK(orig_object);
VM_OBJECT_WLOCK(new_object);
goto retry;
@@ -1453,7 +1453,7 @@
if (p == NULL)
VM_WAIT;
else
- vm_page_busy_sleep(p, "vmocol");
+ vm_page_busy_sleep(p, "vmocol", false);
VM_OBJECT_WLOCK(object);
VM_OBJECT_WLOCK(backing_object);
return (TAILQ_FIRST(&backing_object->memq));
@@ -1912,7 +1912,7 @@
vm_page_lock(p);
if (vm_page_xbusied(p)) {
VM_OBJECT_WUNLOCK(object);
- vm_page_busy_sleep(p, "vmopax");
+ vm_page_busy_sleep(p, "vmopax", true);
VM_OBJECT_WLOCK(object);
goto again;
}
@@ -1927,7 +1927,7 @@
}
if (vm_page_busied(p)) {
VM_OBJECT_WUNLOCK(object);
- vm_page_busy_sleep(p, "vmopar");
+ vm_page_busy_sleep(p, "vmopar", false);
VM_OBJECT_WLOCK(object);
goto again;
}
Index: head/sys/vm/vm_page.h
===================================================================
--- head/sys/vm/vm_page.h
+++ head/sys/vm/vm_page.h
@@ -436,7 +436,7 @@
#endif
void vm_page_busy_downgrade(vm_page_t m);
-void vm_page_busy_sleep(vm_page_t m, const char *msg);
+void vm_page_busy_sleep(vm_page_t m, const char *msg, bool nonshared);
void vm_page_flash(vm_page_t m);
void vm_page_hold(vm_page_t mem);
void vm_page_unhold(vm_page_t mem);
Index: head/sys/vm/vm_page.c
===================================================================
--- head/sys/vm/vm_page.c
+++ head/sys/vm/vm_page.c
@@ -741,21 +741,20 @@
* This is used to implement the hard-path of busying mechanism.
*
* The given page must be locked.
+ *
+ * If nonshared is true, sleep only if the page is xbusy.
*/
void
-vm_page_busy_sleep(vm_page_t m, const char *wmesg)
+vm_page_busy_sleep(vm_page_t m, const char *wmesg, bool nonshared)
{
u_int x;
- vm_page_lock_assert(m, MA_OWNED);
+ vm_page_assert_locked(m);
x = m->busy_lock;
- if (x == VPB_UNBUSIED) {
- vm_page_unlock(m);
- return;
- }
- if ((x & VPB_BIT_WAITERS) == 0 &&
- !atomic_cmpset_int(&m->busy_lock, x, x | VPB_BIT_WAITERS)) {
+ if (x == VPB_UNBUSIED || (nonshared && (x & VPB_BIT_SHARED) != 0) ||
+ ((x & VPB_BIT_WAITERS) == 0 &&
+ !atomic_cmpset_int(&m->busy_lock, x, x | VPB_BIT_WAITERS))) {
vm_page_unlock(m);
return;
}
@@ -1092,7 +1091,7 @@
obj = m->object;
vm_page_lock(m);
VM_OBJECT_WUNLOCK(obj);
- vm_page_busy_sleep(m, msg);
+ vm_page_busy_sleep(m, msg, false);
VM_OBJECT_WLOCK(obj);
return (TRUE);
}
@@ -3455,7 +3454,8 @@
vm_page_aflag_set(m, PGA_REFERENCED);
vm_page_lock(m);
VM_OBJECT_WUNLOCK(object);
- vm_page_busy_sleep(m, "pgrbwt");
+ vm_page_busy_sleep(m, "pgrbwt", (allocflags &
+ VM_ALLOC_IGN_SBUSY) != 0);
VM_OBJECT_WLOCK(object);
goto retrylookup;
} else {

File Metadata

Mime Type
text/plain
Expires
Tue, Nov 4, 12:41 PM (5 h, 3 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
24750646
Default Alt Text
D8196.diff (5 KB)

Event Timeline