summaryrefslogtreecommitdiffstats
path: root/sys/fs/tmpfs
diff options
context:
space:
mode:
authorattilio <attilio@FreeBSD.org>2013-02-10 01:04:10 +0000
committerattilio <attilio@FreeBSD.org>2013-02-10 01:04:10 +0000
commitcde657f5b102f59e8b6ea59855aeb883fac1a7dd (patch)
tree4f85468d5966f3a635e6980630a054b4a619facd /sys/fs/tmpfs
parentee084b4baf8d84c6793da2900235f815e38b9ded (diff)
downloadFreeBSD-src-cde657f5b102f59e8b6ea59855aeb883fac1a7dd.zip
FreeBSD-src-cde657f5b102f59e8b6ea59855aeb883fac1a7dd.tar.gz
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
Diffstat (limited to 'sys/fs/tmpfs')
-rw-r--r--sys/fs/tmpfs/tmpfs_vnops.c12
1 files changed, 0 insertions, 12 deletions
diff --git a/sys/fs/tmpfs/tmpfs_vnops.c b/sys/fs/tmpfs/tmpfs_vnops.c
index 5e2ea65..bddcf24 100644
--- a/sys/fs/tmpfs/tmpfs_vnops.c
+++ b/sys/fs/tmpfs/tmpfs_vnops.c
@@ -511,10 +511,6 @@ tmpfs_mappedread(vm_object_t vobj, vm_object_t tobj, size_t len, struct uio *uio
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_object_t tobj, size_t len, struct uio *ui
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);
OpenPOWER on IntegriCloud