svn commit: r251452 - in head/sys: dev/drm2/i915 dev/drm2/ttm fs/tmpfs kern

Alan Cox alc at FreeBSD.org
Thu Jun 6 06:17:22 UTC 2013


Author: alc
Date: Thu Jun  6 06:17:20 2013
New Revision: 251452
URL: http://svnweb.freebsd.org/changeset/base/251452

Log:
  Don't busy the page unless we are likely to release the object lock.
  
  Reviewed by:	kib
  Sponsored by:	EMC / Isilon Storage Division

Modified:
  head/sys/dev/drm2/i915/i915_gem.c
  head/sys/dev/drm2/ttm/ttm_tt.c
  head/sys/fs/tmpfs/tmpfs_vnops.c
  head/sys/kern/kern_exec.c

Modified: head/sys/dev/drm2/i915/i915_gem.c
==============================================================================
--- head/sys/dev/drm2/i915/i915_gem.c	Thu Jun  6 06:11:43 2013	(r251451)
+++ head/sys/dev/drm2/i915/i915_gem.c	Thu Jun  6 06:17:20 2013	(r251452)
@@ -2487,8 +2487,10 @@ i915_gem_wire_page(vm_object_t object, v
 	int rv;
 
 	VM_OBJECT_ASSERT_WLOCKED(object);
-	m = vm_page_grab(object, pindex, VM_ALLOC_NORMAL | VM_ALLOC_RETRY);
+	m = vm_page_grab(object, pindex, VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY |
+	    VM_ALLOC_RETRY);
 	if (m->valid != VM_PAGE_BITS_ALL) {
+		vm_page_busy(m);
 		if (vm_pager_has_page(object, pindex, NULL, NULL)) {
 			rv = vm_pager_get_pages(object, &m, 1, 0);
 			m = vm_page_lookup(object, pindex);
@@ -2505,11 +2507,11 @@ i915_gem_wire_page(vm_object_t object, v
 			m->valid = VM_PAGE_BITS_ALL;
 			m->dirty = 0;
 		}
+		vm_page_wakeup(m);
 	}
 	vm_page_lock(m);
 	vm_page_wire(m);
 	vm_page_unlock(m);
-	vm_page_wakeup(m);
 	atomic_add_long(&i915_gem_wired_pages_cnt, 1);
 	return (m);
 }

Modified: head/sys/dev/drm2/ttm/ttm_tt.c
==============================================================================
--- head/sys/dev/drm2/ttm/ttm_tt.c	Thu Jun  6 06:11:43 2013	(r251451)
+++ head/sys/dev/drm2/ttm/ttm_tt.c	Thu Jun  6 06:17:20 2013	(r251452)
@@ -288,8 +288,10 @@ int ttm_tt_swapin(struct ttm_tt *ttm)
 	VM_OBJECT_WLOCK(obj);
 	vm_object_pip_add(obj, 1);
 	for (i = 0; i < ttm->num_pages; ++i) {
-		from_page = vm_page_grab(obj, i, VM_ALLOC_RETRY);
+		from_page = vm_page_grab(obj, i, VM_ALLOC_NOBUSY |
+		    VM_ALLOC_RETRY);
 		if (from_page->valid != VM_PAGE_BITS_ALL) {
+			vm_page_busy(from_page);
 			if (vm_pager_has_page(obj, i, NULL, NULL)) {
 				rv = vm_pager_get_pages(obj, &from_page, 1, 0);
 				if (rv != VM_PAGER_OK) {
@@ -301,15 +303,14 @@ int ttm_tt_swapin(struct ttm_tt *ttm)
 				}
 			} else
 				vm_page_zero_invalid(from_page, TRUE);
+			vm_page_wakeup(from_page);
 		}
 		to_page = ttm->pages[i];
 		if (unlikely(to_page == NULL)) {
-			vm_page_wakeup(from_page);
 			ret = -ENOMEM;
 			goto err_ret;
 		}
 		pmap_copy_page(from_page, to_page);
-		vm_page_wakeup(from_page);
 	}
 	vm_object_pip_wakeup(obj);
 	VM_OBJECT_WUNLOCK(obj);

Modified: head/sys/fs/tmpfs/tmpfs_vnops.c
==============================================================================
--- head/sys/fs/tmpfs/tmpfs_vnops.c	Thu Jun  6 06:11:43 2013	(r251451)
+++ head/sys/fs/tmpfs/tmpfs_vnops.c	Thu Jun  6 06:17:20 2013	(r251452)
@@ -460,8 +460,9 @@ tmpfs_nocacheread(vm_object_t tobj, vm_p
 	 * type object.
 	 */
 	m = vm_page_grab(tobj, idx, VM_ALLOC_NORMAL | VM_ALLOC_RETRY |
-	    VM_ALLOC_IGN_SBUSY);
+	    VM_ALLOC_IGN_SBUSY | VM_ALLOC_NOBUSY);
 	if (m->valid != VM_PAGE_BITS_ALL) {
+		vm_page_busy(m);
 		if (vm_pager_has_page(tobj, idx, NULL, NULL)) {
 			rv = vm_pager_get_pages(tobj, &m, 1, 0);
 			m = vm_page_lookup(tobj, idx);
@@ -483,10 +484,10 @@ tmpfs_nocacheread(vm_object_t tobj, vm_p
 			}
 		} else
 			vm_page_zero_invalid(m, TRUE);
+		vm_page_wakeup(m);
 	}
 	vm_page_lock(m);
 	vm_page_hold(m);
-	vm_page_wakeup(m);
 	vm_page_unlock(m);
 	VM_OBJECT_WUNLOCK(tobj);
 	error = uiomove_fromphys(&m, offset, tlen, uio);
@@ -574,8 +575,10 @@ tmpfs_mappedwrite(vm_object_t tobj, size
 	tlen = MIN(PAGE_SIZE - offset, len);
 
 	VM_OBJECT_WLOCK(tobj);
-	tpg = vm_page_grab(tobj, idx, VM_ALLOC_NORMAL | VM_ALLOC_RETRY);
+	tpg = vm_page_grab(tobj, idx, VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY |
+	    VM_ALLOC_RETRY);
 	if (tpg->valid != VM_PAGE_BITS_ALL) {
+		vm_page_busy(tpg);
 		if (vm_pager_has_page(tobj, idx, NULL, NULL)) {
 			rv = vm_pager_get_pages(tobj, &tpg, 1, 0);
 			tpg = vm_page_lookup(tobj, idx);
@@ -597,10 +600,10 @@ tmpfs_mappedwrite(vm_object_t tobj, size
 			}
 		} else
 			vm_page_zero_invalid(tpg, TRUE);
+		vm_page_wakeup(tpg);
 	}
 	vm_page_lock(tpg);
 	vm_page_hold(tpg);
-	vm_page_wakeup(tpg);
 	vm_page_unlock(tpg);
 	VM_OBJECT_WUNLOCK(tobj);
 	error = uiomove_fromphys(&tpg, offset, tlen, uio);

Modified: head/sys/kern/kern_exec.c
==============================================================================
--- head/sys/kern/kern_exec.c	Thu Jun  6 06:11:43 2013	(r251451)
+++ head/sys/kern/kern_exec.c	Thu Jun  6 06:17:20 2013	(r251452)
@@ -937,8 +937,10 @@ exec_map_first_page(imgp)
 		object->pg_color = 0;
 	}
 #endif
-	ma[0] = vm_page_grab(object, 0, VM_ALLOC_NORMAL | VM_ALLOC_RETRY);
+	ma[0] = vm_page_grab(object, 0, VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY |
+	    VM_ALLOC_RETRY);
 	if (ma[0]->valid != VM_PAGE_BITS_ALL) {
+		vm_page_busy(ma[0]);
 		initial_pagein = VM_INITIAL_PAGEIN;
 		if (initial_pagein > object->size)
 			initial_pagein = object->size;
@@ -968,11 +970,11 @@ exec_map_first_page(imgp)
 			VM_OBJECT_WUNLOCK(object);
 			return (EIO);
 		}
+		vm_page_wakeup(ma[0]);
 	}
 	vm_page_lock(ma[0]);
 	vm_page_hold(ma[0]);
 	vm_page_unlock(ma[0]);
-	vm_page_wakeup(ma[0]);
 	VM_OBJECT_WUNLOCK(object);
 
 	imgp->firstpage = sf_buf_alloc(ma[0], 0);


More information about the svn-src-all mailing list