Page MenuHomeFreeBSD

D33017.id98606.diff
No OneTemporary

D33017.id98606.diff

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

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)

Event Timeline