Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F137438427
D21883.id63544.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D21883.id63544.diff
View Options
Index: head/sys/vm/vm_fault.c
===================================================================
--- head/sys/vm/vm_fault.c
+++ head/sys/vm/vm_fault.c
@@ -628,19 +628,62 @@
return (result);
}
+static int
+vm_fault_lock_vnode(struct faultstate *fs)
+{
+ struct vnode *vp;
+ int error, locked;
+
+ if (fs->object->type != OBJT_VNODE)
+ return (KERN_SUCCESS);
+ vp = fs->object->handle;
+ if (vp == fs->vp)
+ return (KERN_SUCCESS);
+
+ /*
+ * Perform an unlock in case the desired vnode changed while
+ * the map was unlocked during a retry.
+ */
+ unlock_vp(fs);
+
+ locked = VOP_ISLOCKED(vp);
+ if (locked != LK_EXCLUSIVE)
+ locked = LK_SHARED;
+
+ /*
+ * We must not sleep acquiring the vnode lock while we have
+ * the page exclusive busied or the object's
+ * paging-in-progress count incremented. Otherwise, we could
+ * deadlock.
+ */
+ error = vget(vp, locked | LK_CANRECURSE | LK_NOWAIT, curthread);
+ if (error == 0) {
+ fs->vp = vp;
+ return (KERN_SUCCESS);
+ }
+
+ vhold(vp);
+ release_page(fs);
+ unlock_and_deallocate(fs);
+ error = vget(vp, locked | LK_RETRY | LK_CANRECURSE, curthread);
+ vdrop(vp);
+ fs->vp = vp;
+ KASSERT(error == 0, ("vm_fault: vget failed %d", error));
+ return (KERN_RESOURCE_SHORTAGE);
+}
+
int
vm_fault(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type,
int fault_flags, vm_page_t *m_hold)
{
struct faultstate fs;
- struct vnode *vp;
struct domainset *dset;
vm_object_t next_object, retry_object;
vm_offset_t e_end, e_start;
vm_pindex_t retry_pindex;
vm_prot_t prot, retry_prot;
- int ahead, alloc_req, behind, cluster_offset, error, era, faultcount;
- int locked, nera, oom, result, rv;
+ int ahead, alloc_req, behind, cluster_offset, era, faultcount;
+ int nera, oom, result, rv;
u_char behavior;
boolean_t wired; /* Passed by reference. */
bool dead, hardfault, is_first_object_locked;
@@ -1001,41 +1044,11 @@
*/
unlock_map(&fs);
- if (fs.object->type == OBJT_VNODE &&
- (vp = fs.object->handle) != fs.vp) {
- /*
- * Perform an unlock in case the desired vnode
- * changed while the map was unlocked during a
- * retry.
- */
- unlock_vp(&fs);
-
- locked = VOP_ISLOCKED(vp);
- if (locked != LK_EXCLUSIVE)
- locked = LK_SHARED;
-
- /*
- * We must not sleep acquiring the vnode lock
- * while we have the page exclusive busied or
- * the object's paging-in-progress count
- * incremented. Otherwise, we could deadlock.
- */
- error = vget(vp, locked | LK_CANRECURSE |
- LK_NOWAIT, curthread);
- if (error != 0) {
- vhold(vp);
- release_page(&fs);
- unlock_and_deallocate(&fs);
- error = vget(vp, locked | LK_RETRY |
- LK_CANRECURSE, curthread);
- vdrop(vp);
- fs.vp = vp;
- KASSERT(error == 0,
- ("vm_fault: vget failed"));
- goto RetryFault;
- }
- fs.vp = vp;
- }
+ rv = vm_fault_lock_vnode(&fs);
+ MPASS(rv == KERN_SUCCESS ||
+ rv == KERN_RESOURCE_SHORTAGE);
+ if (rv == KERN_RESOURCE_SHORTAGE)
+ goto RetryFault;
KASSERT(fs.vp == NULL || !fs.map->system_map,
("vm_fault: vnode-backed object mapped by system map"));
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Nov 24, 11:31 AM (3 h, 6 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
26032400
Default Alt Text
D21883.id63544.diff (3 KB)
Attached To
Mode
D21883: Fix interface between nfsclient and vnode pager.
Attached
Detach File
Event Timeline
Log In to Comment