From owner-svn-src-user@FreeBSD.ORG Fri Mar 22 22:52:05 2013 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 5C2DA164; Fri, 22 Mar 2013 22:52:05 +0000 (UTC) (envelope-from attilio@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 4DF82324; Fri, 22 Mar 2013 22:52:05 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.6/8.14.6) with ESMTP id r2MMq5dC067775; Fri, 22 Mar 2013 22:52:05 GMT (envelope-from attilio@svn.freebsd.org) Received: (from attilio@localhost) by svn.freebsd.org (8.14.6/8.14.5/Submit) id r2MMq2pL067757; Fri, 22 Mar 2013 22:52:02 GMT (envelope-from attilio@svn.freebsd.org) Message-Id: <201303222252.r2MMq2pL067757@svn.freebsd.org> From: Attilio Rao Date: Fri, 22 Mar 2013 22:52:02 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r248629 - in user/attilio/vmobj-readlock/sys: dev/agp dev/drm2/i915 dev/md fs/fuse fs/tmpfs kern vm X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 22 Mar 2013 22:52:05 -0000 Author: attilio Date: Fri Mar 22 22:52:02 2013 New Revision: 248629 URL: http://svnweb.freebsd.org/changeset/base/248629 Log: - Save some further atomics and introduce vm_page_wakeup_locked() that assumes vm_page_lock held. It is implemented as an hard function right now because it is only a WIP and it avoids a namespace pollution. It will be cleaned before to merge back. Maybe it makes sense to always acquire the vm_page_lock() in the users for vm_page_wakeup() and get rid of vm_page_wakeup_locked() finally. This will be discussed more. - Fix a bug where vm_page_remove() is called for UNNAMED pages and the page lock is not held. Don't make assumption about the lock in that case and just deal with the situation, even if it is a tricky pattern. We use a boolean_t rather than a mtx pointer. [0] Sponsored by: EMC / Isilon storage division [0] Reported by: pho Modified: user/attilio/vmobj-readlock/sys/dev/agp/agp.c user/attilio/vmobj-readlock/sys/dev/drm2/i915/i915_gem.c user/attilio/vmobj-readlock/sys/dev/md/md.c user/attilio/vmobj-readlock/sys/fs/fuse/fuse_vnops.c user/attilio/vmobj-readlock/sys/fs/tmpfs/tmpfs_subr.c user/attilio/vmobj-readlock/sys/fs/tmpfs/tmpfs_vnops.c user/attilio/vmobj-readlock/sys/kern/kern_exec.c user/attilio/vmobj-readlock/sys/kern/uipc_shm.c user/attilio/vmobj-readlock/sys/vm/swap_pager.c user/attilio/vmobj-readlock/sys/vm/vm_fault.c user/attilio/vmobj-readlock/sys/vm/vm_glue.c user/attilio/vmobj-readlock/sys/vm/vm_page.c user/attilio/vmobj-readlock/sys/vm/vm_page.h Modified: user/attilio/vmobj-readlock/sys/dev/agp/agp.c ============================================================================== --- user/attilio/vmobj-readlock/sys/dev/agp/agp.c Fri Mar 22 22:50:48 2013 (r248628) +++ user/attilio/vmobj-readlock/sys/dev/agp/agp.c Fri Mar 22 22:52:02 2013 (r248629) @@ -626,9 +626,9 @@ bad: VM_OBJECT_ASSERT_WLOCKED(mem->am_obj); for (k = 0; k < mem->am_size; k += PAGE_SIZE) { m = vm_page_lookup(mem->am_obj, OFF_TO_IDX(k)); - if (k >= i) - vm_page_wakeup(m); vm_page_lock(m); + if (k >= i) + vm_page_wakeup_locked(m); vm_page_unwire(m, 0); vm_page_unlock(m); } Modified: user/attilio/vmobj-readlock/sys/dev/drm2/i915/i915_gem.c ============================================================================== --- user/attilio/vmobj-readlock/sys/dev/drm2/i915/i915_gem.c Fri Mar 22 22:50:48 2013 (r248628) +++ user/attilio/vmobj-readlock/sys/dev/drm2/i915/i915_gem.c Fri Mar 22 22:52:02 2013 (r248629) @@ -2516,8 +2516,8 @@ i915_gem_wire_page(vm_object_t object, v } vm_page_lock(m); vm_page_wire(m); + vm_page_wakeup_locked(m); vm_page_unlock(m); - vm_page_wakeup(m); atomic_add_long(&i915_gem_wired_pages_cnt, 1); return (m); } Modified: user/attilio/vmobj-readlock/sys/dev/md/md.c ============================================================================== --- user/attilio/vmobj-readlock/sys/dev/md/md.c Fri Mar 22 22:50:48 2013 (r248628) +++ user/attilio/vmobj-readlock/sys/dev/md/md.c Fri Mar 22 22:52:02 2013 (r248629) @@ -879,8 +879,8 @@ mdstart_swap(struct md_s *sc, struct bio } else vm_pager_page_unswapped(m); } - vm_page_wakeup(m); vm_page_lock(m); + vm_page_wakeup_locked(m); if (bp->bio_cmd == BIO_DELETE && len == PAGE_SIZE) vm_page_free(m); else Modified: user/attilio/vmobj-readlock/sys/fs/fuse/fuse_vnops.c ============================================================================== --- user/attilio/vmobj-readlock/sys/fs/fuse/fuse_vnops.c Fri Mar 22 22:50:48 2013 (r248628) +++ user/attilio/vmobj-readlock/sys/fs/fuse/fuse_vnops.c Fri Mar 22 22:52:02 2013 (r248629) @@ -1873,8 +1873,8 @@ fuse_vnop_getpages(struct vop_getpages_a vm_page_activate(m); else vm_page_deactivate(m); + vm_page_wakeup_locked(m); fuse_vm_page_unlock(m); - vm_page_wakeup(m); } else { fuse_vm_page_lock(m); vm_page_free(m); Modified: user/attilio/vmobj-readlock/sys/fs/tmpfs/tmpfs_subr.c ============================================================================== --- user/attilio/vmobj-readlock/sys/fs/tmpfs/tmpfs_subr.c Fri Mar 22 22:50:48 2013 (r248628) +++ user/attilio/vmobj-readlock/sys/fs/tmpfs/tmpfs_subr.c Fri Mar 22 22:52:02 2013 (r248629) @@ -1309,8 +1309,8 @@ retry: vm_page_lock(m); if (rv == VM_PAGER_OK) { vm_page_deactivate(m); + vm_page_wakeup_locked(m); vm_page_unlock(m); - vm_page_wakeup(m); } else { vm_page_free(m); vm_page_unlock(m); Modified: user/attilio/vmobj-readlock/sys/fs/tmpfs/tmpfs_vnops.c ============================================================================== --- user/attilio/vmobj-readlock/sys/fs/tmpfs/tmpfs_vnops.c Fri Mar 22 22:50:48 2013 (r248628) +++ user/attilio/vmobj-readlock/sys/fs/tmpfs/tmpfs_vnops.c Fri Mar 22 22:52:02 2013 (r248629) @@ -468,8 +468,8 @@ tmpfs_nocacheread(vm_object_t tobj, vm_p VM_OBJECT_WLOCK(tobj); vm_page_lock(m); vm_page_unwire(m, TRUE); + vm_page_wakeup_locked(m); vm_page_unlock(m); - vm_page_wakeup(m); VM_OBJECT_WUNLOCK(tobj); return (error); @@ -696,8 +696,8 @@ lookupvpg: } vm_page_lock(tpg); vm_page_unwire(tpg, TRUE); + vm_page_wakeup_locked(tpg); vm_page_unlock(tpg); - vm_page_wakeup(tpg); out: VM_OBJECT_WUNLOCK(tobj); if (vpg != NULL) { Modified: user/attilio/vmobj-readlock/sys/kern/kern_exec.c ============================================================================== --- user/attilio/vmobj-readlock/sys/kern/kern_exec.c Fri Mar 22 22:50:48 2013 (r248628) +++ user/attilio/vmobj-readlock/sys/kern/kern_exec.c Fri Mar 22 22:52:02 2013 (r248629) @@ -971,8 +971,8 @@ exec_map_first_page(imgp) } vm_page_lock(ma[0]); vm_page_hold(ma[0]); + vm_page_wakeup_locked(ma[0]); vm_page_unlock(ma[0]); - vm_page_wakeup(ma[0]); VM_OBJECT_WUNLOCK(object); imgp->firstpage = sf_buf_alloc(ma[0], 0); Modified: user/attilio/vmobj-readlock/sys/kern/uipc_shm.c ============================================================================== --- user/attilio/vmobj-readlock/sys/kern/uipc_shm.c Fri Mar 22 22:50:48 2013 (r248628) +++ user/attilio/vmobj-readlock/sys/kern/uipc_shm.c Fri Mar 22 22:52:02 2013 (r248629) @@ -307,8 +307,8 @@ retry: vm_page_lock(m); if (rv == VM_PAGER_OK) { vm_page_deactivate(m); + vm_page_wakeup_locked(m); vm_page_unlock(m); - vm_page_wakeup(m); } else { vm_page_free(m); vm_page_unlock(m); Modified: user/attilio/vmobj-readlock/sys/vm/swap_pager.c ============================================================================== --- user/attilio/vmobj-readlock/sys/vm/swap_pager.c Fri Mar 22 22:50:48 2013 (r248628) +++ user/attilio/vmobj-readlock/sys/vm/swap_pager.c Fri Mar 22 22:52:02 2013 (r248629) @@ -1597,8 +1597,8 @@ swp_pager_async_iodone(struct buf *bp) if (i != bp->b_pager.pg_reqpage) { vm_page_lock(m); vm_page_deactivate(m); + vm_page_wakeup_locked(m); vm_page_unlock(m); - vm_page_wakeup(m); } else { vm_page_lock(m); vm_page_flash(m); @@ -1718,8 +1718,8 @@ swp_pager_force_pagein(vm_object_t objec vm_page_dirty(m); vm_page_lock(m); vm_page_activate(m); + vm_page_wakeup_locked(m); vm_page_unlock(m); - vm_page_wakeup(m); vm_pager_page_unswapped(m); return; } @@ -1730,8 +1730,8 @@ swp_pager_force_pagein(vm_object_t objec vm_page_dirty(m); vm_page_lock(m); vm_page_deactivate(m); + vm_page_wakeup_locked(m); vm_page_unlock(m); - vm_page_wakeup(m); vm_pager_page_unswapped(m); } Modified: user/attilio/vmobj-readlock/sys/vm/vm_fault.c ============================================================================== --- user/attilio/vmobj-readlock/sys/vm/vm_fault.c Fri Mar 22 22:50:48 2013 (r248628) +++ user/attilio/vmobj-readlock/sys/vm/vm_fault.c Fri Mar 22 22:52:02 2013 (r248629) @@ -141,8 +141,8 @@ static inline void release_page(struct faultstate *fs) { - vm_page_wakeup(fs->m); vm_page_lock(fs->m); + vm_page_wakeup_locked(fs->m); vm_page_deactivate(fs->m); vm_page_unlock(fs->m); fs->m = NULL; @@ -934,8 +934,8 @@ vnode_locked: *m_hold = fs.m; vm_page_hold(fs.m); } + vm_page_wakeup_locked(fs.m); vm_page_unlock(fs.m); - vm_page_wakeup(fs.m); /* * Unlock everything, and return @@ -1361,13 +1361,14 @@ vm_fault_copy_entry(vm_map_t dst_map, vm vm_page_lock(dst_m); vm_page_wire(dst_m); + vm_page_wakeup_locked(dst_m); vm_page_unlock(dst_m); } else { vm_page_lock(dst_m); vm_page_activate(dst_m); + vm_page_wakeup_locked(dst_m); vm_page_unlock(dst_m); } - vm_page_wakeup(dst_m); } VM_OBJECT_WUNLOCK(dst_object); if (upgrade) { Modified: user/attilio/vmobj-readlock/sys/vm/vm_glue.c ============================================================================== --- user/attilio/vmobj-readlock/sys/vm/vm_glue.c Fri Mar 22 22:50:48 2013 (r248628) +++ user/attilio/vmobj-readlock/sys/vm/vm_glue.c Fri Mar 22 22:52:02 2013 (r248629) @@ -258,8 +258,8 @@ vm_imgact_hold_page(vm_object_t object, } vm_page_lock(m); vm_page_hold(m); + vm_page_wakeup_locked(m); vm_page_unlock(m); - vm_page_wakeup(m); out: VM_OBJECT_WUNLOCK(object); return (m); Modified: user/attilio/vmobj-readlock/sys/vm/vm_page.c ============================================================================== --- user/attilio/vmobj-readlock/sys/vm/vm_page.c Fri Mar 22 22:50:48 2013 (r248628) +++ user/attilio/vmobj-readlock/sys/vm/vm_page.c Fri Mar 22 22:52:02 2013 (r248629) @@ -493,22 +493,39 @@ vm_page_flash(vm_page_t m) } /* - * vm_page_wakeup: + * vm_page_wakeup: + * + * clear the VPO_BUSY flag and wakeup anyone waiting for the + * page. + * + * The object containing the page must be locked. + */ +void +vm_page_wakeup(vm_page_t m) +{ + + vm_page_lock(m); + vm_page_wakeup_locked(m); + vm_page_unlock(m); +} + +/* + * vm_page_wakeup_locked: * * clear the VPO_BUSY flag and wakeup anyone waiting for the * page. * + * The page and the object containing the page must be locked. */ void -vm_page_wakeup(vm_page_t m) +vm_page_wakeup_locked(vm_page_t m) { VM_OBJECT_ASSERT_WLOCKED(m->object); + vm_page_lock_assert(m, MA_OWNED); KASSERT(m->oflags & VPO_BUSY, ("vm_page_wakeup: page not busy!!!")); m->oflags &= ~VPO_BUSY; - vm_page_lock(m); vm_page_flash(m); - vm_page_unlock(m); } void @@ -729,8 +746,8 @@ vm_page_readahead_finish(vm_page_t m) vm_page_activate(m); else vm_page_deactivate(m); + vm_page_wakeup_locked(m); vm_page_unlock(m); - vm_page_wakeup(m); } else { /* * Free the completely invalid page. Such page state @@ -897,6 +914,7 @@ void vm_page_remove(vm_page_t m) { vm_object_t object; + boolean_t lockacq; if ((m->oflags & VPO_UNMANAGED) == 0) vm_page_lock_assert(m, MA_OWNED); @@ -905,7 +923,15 @@ vm_page_remove(vm_page_t m) VM_OBJECT_ASSERT_WLOCKED(object); if (m->oflags & VPO_BUSY) { m->oflags &= ~VPO_BUSY; + lockacq = FALSE; + if ((m->oflags & VPO_UNMANAGED) != 0 && + !mtx_owned(vm_page_lockptr(m))) { + lockacq = TRUE; + vm_page_lock(m); + } vm_page_flash(m); + if (lockacq) + vm_page_unlock(m); } /* Modified: user/attilio/vmobj-readlock/sys/vm/vm_page.h ============================================================================== --- user/attilio/vmobj-readlock/sys/vm/vm_page.h Fri Mar 22 22:50:48 2013 (r248628) +++ user/attilio/vmobj-readlock/sys/vm/vm_page.h Fri Mar 22 22:52:02 2013 (r248629) @@ -368,6 +368,7 @@ void vm_page_unhold(vm_page_t mem); void vm_page_free(vm_page_t m); void vm_page_free_zero(vm_page_t m); void vm_page_wakeup(vm_page_t m); +void vm_page_wakeup_locked(vm_page_t m); void vm_page_activate (vm_page_t); vm_page_t vm_page_alloc (vm_object_t, vm_pindex_t, int);