diff options
Diffstat (limited to 'sys/vm/device_pager.c')
-rw-r--r-- | sys/vm/device_pager.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/sys/vm/device_pager.c b/sys/vm/device_pager.c index 809c32c..30aaac0 100644 --- a/sys/vm/device_pager.c +++ b/sys/vm/device_pager.c @@ -54,6 +54,8 @@ __FBSDID("$FreeBSD$"); #include <vm/vm_phys.h> #include <vm/uma.h> +#include <machine/cpu.h> + static void dev_pager_init(void); static vm_object_t dev_pager_alloc(void *, vm_ooffset_t, vm_prot_t, vm_ooffset_t, struct ucred *); @@ -299,7 +301,7 @@ old_dev_pager_fault(vm_object_t object, vm_ooffset_t offset, int prot, struct file *fpop; struct thread *td; vm_memattr_t memattr; - int ref, ret; + int i, ref, ret; pidx = OFF_TO_IDX(offset); memattr = object->memattr; @@ -351,7 +353,10 @@ old_dev_pager_fault(vm_object_t object, vm_ooffset_t offset, int prot, vm_page_free(*mres); vm_page_unlock(*mres); *mres = page; - vm_page_insert(page, object, pidx); + while (vm_page_insert(page, object, pidx) != 0) { + for (i = 0; i < 10000000; i++) + cpu_spinwait(); + } } page->valid = VM_PAGE_BITS_ALL; return (VM_PAGER_OK); |