Date: Sun, 10 Feb 2013 01:04:11 +0000 (UTC) From: Attilio Rao <attilio@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r246603 - head/sys/fs/tmpfs Message-ID: <201302100104.r1A14BVP049790@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: attilio Date: Sun Feb 10 01:04:10 2013 New Revision: 246603 URL: http://svnweb.freebsd.org/changeset/base/246603 Log: Remove a racy checks on resident and cached pages for tmpfs_mapped{read, write}() functions: - tmpfs_mapped{read, write}() are only called within VOP_{READ, WRITE}(), which check before-hand to work only on valid VREG vnodes. Also the vnode is locked for the duration of the work, making vnode reclaiming impossible, during the operation. Hence, vobj can never be NULL. - Currently check on resident pages and cached pages without vm object lock held is racy and can do even more harm than good, as a page could be transitioning between these 2 pools and then be skipped entirely. Skip the checks as lookups on empty splay trees are very cheap. Discussed with: alc Tested by: flo MFC after: 2 weeks Modified: head/sys/fs/tmpfs/tmpfs_vnops.c Modified: head/sys/fs/tmpfs/tmpfs_vnops.c ============================================================================== --- head/sys/fs/tmpfs/tmpfs_vnops.c Sat Feb 9 23:17:28 2013 (r246602) +++ head/sys/fs/tmpfs/tmpfs_vnops.c Sun Feb 10 01:04:10 2013 (r246603) @@ -511,10 +511,6 @@ tmpfs_mappedread(vm_object_t vobj, vm_ob offset = addr & PAGE_MASK; tlen = MIN(PAGE_SIZE - offset, len); - if ((vobj == NULL) || - (vobj->resident_page_count == 0 && vobj->cache == NULL)) - goto nocache; - VM_OBJECT_LOCK(vobj); lookupvpg: if (((m = vm_page_lookup(vobj, idx)) != NULL) && @@ -569,7 +565,6 @@ lookupvpg: return (error); } VM_OBJECT_UNLOCK(vobj); -nocache: error = tmpfs_nocacheread(tobj, idx, offset, tlen, uio); return (error); @@ -639,12 +634,6 @@ tmpfs_mappedwrite(vm_object_t vobj, vm_o offset = addr & PAGE_MASK; tlen = MIN(PAGE_SIZE - offset, len); - if ((vobj == NULL) || - (vobj->resident_page_count == 0 && vobj->cache == NULL)) { - vpg = NULL; - goto nocache; - } - VM_OBJECT_LOCK(vobj); lookupvpg: if (((vpg = vm_page_lookup(vobj, idx)) != NULL) && @@ -668,7 +657,6 @@ lookupvpg: VM_OBJECT_UNLOCK(vobj); vpg = NULL; } -nocache: VM_OBJECT_LOCK(tobj); tpg = vm_page_grab(tobj, idx, VM_ALLOC_WIRED | VM_ALLOC_NORMAL | VM_ALLOC_RETRY);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201302100104.r1A14BVP049790>