Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F151939294
D33017.id98606.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
7 KB
Referenced Files
None
Subscribers
None
D33017.id98606.diff
View Options
Index: sys/vm/vm_fault.c
===================================================================
--- sys/vm/vm_fault.c
+++ sys/vm/vm_fault.c
@@ -155,6 +155,19 @@
struct vnode *vp;
};
+/*
+ * Return codes for internal fault routines.
+ */
+enum fault_status {
+ FAULT_SUCCESS = 1, /* Return success to user. */
+ FAULT_FAILURE, /* Return failure to user. */
+ FAULT_CONTINUE, /* Continue faulting. */
+ FAULT_RESTART, /* Restart fault. */
+ FAULT_OUT_OF_BOUNDS, /* Invalid address for pager. */
+ FAULT_HARD, /* Performed I/O. */
+ FAULT_SOFT, /* Found valid page. */
+};
+
static void vm_fault_dontneed(const struct faultstate *fs, vm_offset_t vaddr,
int ahead);
static void vm_fault_prefault(const struct faultstate *fs, vm_offset_t addra,
@@ -298,7 +311,7 @@
/*
* Unlocks fs.first_object and fs.map on success.
*/
-static int
+static enum fault_status
vm_fault_soft_fast(struct faultstate *fs)
{
vm_page_t m, m_map;
@@ -368,7 +381,7 @@
out:
vm_object_unbusy(fs->first_object);
- return (rv);
+ return (rv == KERN_SUCCESS ? FAULT_SUCCESS : FAULT_FAILURE);
}
static void
@@ -417,7 +430,7 @@
}
}
-static int
+static enum fault_status
vm_fault_populate(struct faultstate *fs)
{
vm_offset_t vaddr;
@@ -456,11 +469,11 @@
*/
vm_fault_restore_map_lock(fs);
if (fs->map->timestamp != fs->map_generation)
- return (KERN_RESTART);
- return (KERN_NOT_RECEIVER);
+ return (FAULT_RESTART);
+ return (FAULT_CONTINUE);
}
if (rv != VM_PAGER_OK)
- return (KERN_FAILURE); /* AKA SIGSEGV */
+ return (FAULT_FAILURE); /* AKA SIGSEGV */
/* Ensure that the driver is obeying the interface. */
MPASS(pager_first <= pager_last);
@@ -480,7 +493,7 @@
if (m != fs->m)
vm_page_xunbusy(m);
}
- return (KERN_RESTART);
+ return (FAULT_RESTART);
}
/*
@@ -596,7 +609,7 @@
}
out:
curthread->td_ru.ru_majflt++;
- return (rv);
+ return (rv == KERN_SUCCESS ? FAULT_SUCCESS : FAULT_FAILURE);
}
static int prot_fault_translation;
@@ -699,18 +712,18 @@
return (result);
}
-static int
+static enum fault_status
vm_fault_lock_vnode(struct faultstate *fs, bool objlocked)
{
struct vnode *vp;
int error, locked;
if (fs->object->type != OBJT_VNODE)
- return (KERN_SUCCESS);
+ return (FAULT_CONTINUE);
vp = fs->object->handle;
if (vp == fs->vp) {
ASSERT_VOP_LOCKED(vp, "saved vnode is not locked");
- return (KERN_SUCCESS);
+ return (FAULT_CONTINUE);
}
/*
@@ -732,7 +745,7 @@
error = vget(vp, locked | LK_CANRECURSE | LK_NOWAIT);
if (error == 0) {
fs->vp = vp;
- return (KERN_SUCCESS);
+ return (FAULT_CONTINUE);
}
vhold(vp);
@@ -744,7 +757,7 @@
vdrop(vp);
fs->vp = vp;
KASSERT(error == 0, ("vm_fault: vget failed %d", error));
- return (KERN_RESOURCE_SHORTAGE);
+ return (FAULT_RESTART);
}
/*
@@ -1112,33 +1125,35 @@
/*
* Allocate a page directly or via the object populate method.
*/
-static int
+static enum fault_status
vm_fault_allocate(struct faultstate *fs)
{
struct domainset *dset;
- int rv;
+ enum fault_status rv;
if ((fs->object->flags & OBJ_SIZEVNLOCK) != 0) {
rv = vm_fault_lock_vnode(fs, true);
- MPASS(rv == KERN_SUCCESS || rv == KERN_RESOURCE_SHORTAGE);
- if (rv == KERN_RESOURCE_SHORTAGE)
+ MPASS(rv == FAULT_CONTINUE || rv == FAULT_RESTART);
+ if (rv == FAULT_RESTART)
return (rv);
}
- if (fs->pindex >= fs->object->size)
- return (KERN_OUT_OF_BOUNDS);
+ if (fs->pindex >= fs->object->size) {
+ unlock_and_deallocate(fs);
+ return (FAULT_OUT_OF_BOUNDS);
+ }
if (fs->object == fs->first_object &&
(fs->first_object->flags & OBJ_POPULATE) != 0 &&
fs->first_object->shadow_count == 0) {
rv = vm_fault_populate(fs);
switch (rv) {
- case KERN_SUCCESS:
- case KERN_FAILURE:
- case KERN_PROTECTION_FAILURE:
- case KERN_RESTART:
+ case FAULT_SUCCESS:
+ case FAULT_FAILURE:
+ case FAULT_RESTART:
+ unlock_and_deallocate(fs);
return (rv);
- case KERN_NOT_RECEIVER:
+ case FAULT_CONTINUE:
/*
* Pager's populate() method
* returned VM_PAGER_BAD.
@@ -1174,11 +1189,11 @@
if (fs->m == NULL) {
if (vm_fault_allocate_oom(fs))
vm_waitpfault(dset, vm_pfault_oom_wait * hz);
- return (KERN_RESOURCE_SHORTAGE);
+ return (FAULT_RESTART);
}
fs->oom_started = false;
- return (KERN_NOT_RECEIVER);
+ return (FAULT_CONTINUE);
}
/*
@@ -1186,11 +1201,12 @@
* that the pager has it, and potentially retrieve additional
* pages at the same time.
*/
-static int
+static enum fault_status
vm_fault_getpages(struct faultstate *fs, int *behindp, int *aheadp)
{
vm_offset_t e_end, e_start;
int ahead, behind, cluster_offset, rv;
+ enum fault_status status;
u_char behavior;
/*
@@ -1227,10 +1243,10 @@
*/
unlock_map(fs);
- rv = vm_fault_lock_vnode(fs, false);
- MPASS(rv == KERN_SUCCESS || rv == KERN_RESOURCE_SHORTAGE);
- if (rv == KERN_RESOURCE_SHORTAGE)
- return (rv);
+ status = vm_fault_lock_vnode(fs, false);
+ MPASS(status == FAULT_CONTINUE || status == FAULT_RESTART);
+ if (status == FAULT_RESTART)
+ return (status);
KASSERT(fs->vp == NULL || !fs->map->system_map,
("vm_fault: vnode-backed object mapped by system map"));
@@ -1269,7 +1285,7 @@
*aheadp = ahead;
rv = vm_pager_get_pages(fs->object, &fs->m, 1, behindp, aheadp);
if (rv == VM_PAGER_OK)
- return (KERN_SUCCESS);
+ return (FAULT_HARD);
if (rv == VM_PAGER_ERROR)
printf("vm_fault: pager read error, pid %d (%s)\n",
curproc->p_pid, curproc->p_comm);
@@ -1282,11 +1298,11 @@
VM_OBJECT_WLOCK(fs->object);
fault_page_free(&fs->m);
unlock_and_deallocate(fs);
- return (KERN_OUT_OF_BOUNDS);
+ return (FAULT_OUT_OF_BOUNDS);
}
KASSERT(rv == VM_PAGER_FAIL,
("%s: unepxected pager error %d", __func__, rv));
- return (KERN_NOT_RECEIVER);
+ return (FAULT_CONTINUE);
}
/*
@@ -1330,7 +1346,8 @@
{
struct faultstate fs;
int ahead, behind, faultcount;
- int result, rv;
+ int result;
+ enum fault_status rv;
bool dead, hardfault;
VM_CNT_INC(v_vm_faults);
@@ -1375,8 +1392,8 @@
(fs.fault_flags & (VM_FAULT_WIRE | VM_FAULT_DIRTY)) == 0) {
VM_OBJECT_RLOCK(fs.first_object);
rv = vm_fault_soft_fast(&fs);
- if (rv == KERN_SUCCESS)
- return (rv);
+ if (rv == FAULT_SUCCESS)
+ return (KERN_SUCCESS);
if (!VM_OBJECT_TRYUPGRADE(fs.first_object)) {
VM_OBJECT_RUNLOCK(fs.first_object);
VM_OBJECT_WLOCK(fs.first_object);
@@ -1408,18 +1425,15 @@
if ((fs.entry->eflags & MAP_ENTRY_SPLIT_BOUNDARY_MASK) != 0) {
rv = vm_fault_allocate(&fs);
switch (rv) {
- case KERN_RESTART:
- unlock_and_deallocate(&fs);
- /* FALLTHROUGH */
- case KERN_RESOURCE_SHORTAGE:
+ case FAULT_RESTART:
goto RetryFault;
- case KERN_SUCCESS:
- case KERN_FAILURE:
- case KERN_PROTECTION_FAILURE:
- case KERN_OUT_OF_BOUNDS:
- unlock_and_deallocate(&fs);
- return (rv);
- case KERN_NOT_RECEIVER:
+ case FAULT_SUCCESS:
+ return (KERN_SUCCESS);
+ case FAULT_FAILURE:
+ return (KERN_FAILURE);
+ case FAULT_OUT_OF_BOUNDS:
+ return (KERN_OUT_OF_BOUNDS);
+ case FAULT_CONTINUE:
break;
default:
panic("vm_fault: Unhandled rv %d", rv);
@@ -1476,18 +1490,15 @@
fs.object == fs.first_object)) {
rv = vm_fault_allocate(&fs);
switch (rv) {
- case KERN_RESTART:
- unlock_and_deallocate(&fs);
- /* FALLTHROUGH */
- case KERN_RESOURCE_SHORTAGE:
+ case FAULT_RESTART:
goto RetryFault;
- case KERN_SUCCESS:
- case KERN_FAILURE:
- case KERN_PROTECTION_FAILURE:
- case KERN_OUT_OF_BOUNDS:
- unlock_and_deallocate(&fs);
- return (rv);
- case KERN_NOT_RECEIVER:
+ case FAULT_SUCCESS:
+ return (KERN_SUCCESS);
+ case FAULT_FAILURE:
+ return (KERN_FAILURE);
+ case FAULT_OUT_OF_BOUNDS:
+ return (KERN_OUT_OF_BOUNDS);
+ case FAULT_CONTINUE:
break;
default:
panic("vm_fault: Unhandled rv %d", rv);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Apr 12, 3:46 PM (17 h, 33 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31356792
Default Alt Text
D33017.id98606.diff (7 KB)
Attached To
Mode
D33017: vm_fault: Introduce a fault_status enum for internal return types
Attached
Detach File
Event Timeline
Log In to Comment