Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/xen/gntdev/gntdev.c
Show First 20 Lines • Show All 800 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
static int | static int | ||||
gntdev_gmap_pg_fault(vm_object_t object, vm_ooffset_t offset, int prot, | gntdev_gmap_pg_fault(vm_object_t object, vm_ooffset_t offset, int prot, | ||||
vm_page_t *mres) | vm_page_t *mres) | ||||
{ | { | ||||
struct gntdev_gmap *gmap = object->handle; | struct gntdev_gmap *gmap = object->handle; | ||||
vm_pindex_t pidx, ridx; | vm_pindex_t pidx, ridx; | ||||
vm_page_t page, oldm; | vm_page_t page; | ||||
vm_ooffset_t relative_offset; | vm_ooffset_t relative_offset; | ||||
if (gmap->map == NULL) | if (gmap->map == NULL) | ||||
return (VM_PAGER_FAIL); | return (VM_PAGER_FAIL); | ||||
relative_offset = offset - gmap->file_index; | relative_offset = offset - gmap->file_index; | ||||
pidx = OFF_TO_IDX(offset); | pidx = OFF_TO_IDX(offset); | ||||
ridx = OFF_TO_IDX(relative_offset); | ridx = OFF_TO_IDX(relative_offset); | ||||
if (ridx >= gmap->count || | if (ridx >= gmap->count || | ||||
gmap->grant_map_ops[ridx].status != GNTST_okay) | gmap->grant_map_ops[ridx].status != GNTST_okay) | ||||
return (VM_PAGER_FAIL); | return (VM_PAGER_FAIL); | ||||
page = PHYS_TO_VM_PAGE(gmap->map->phys_base_addr + relative_offset); | page = PHYS_TO_VM_PAGE(gmap->map->phys_base_addr + relative_offset); | ||||
if (page == NULL) | if (page == NULL) | ||||
return (VM_PAGER_FAIL); | return (VM_PAGER_FAIL); | ||||
KASSERT((page->flags & PG_FICTITIOUS) != 0, | KASSERT((page->flags & PG_FICTITIOUS) != 0, | ||||
("not fictitious %p", page)); | ("not fictitious %p", page)); | ||||
KASSERT(vm_page_wired(page), ("page %p is not wired", page)); | KASSERT(vm_page_wired(page), ("page %p is not wired", page)); | ||||
KASSERT(!vm_page_busied(page), ("page %p is busy", page)); | KASSERT(!vm_page_busied(page), ("page %p is busy", page)); | ||||
if (*mres != NULL) { | |||||
oldm = *mres; | |||||
vm_page_free(oldm); | |||||
*mres = NULL; | |||||
} | |||||
vm_page_busy_acquire(page, 0); | vm_page_busy_acquire(page, 0); | ||||
vm_page_valid(page); | vm_page_valid(page); | ||||
if (*mres != NULL) | |||||
vm_page_replace(page, object, pidx, *mres); | |||||
else | |||||
vm_page_insert(page, object, pidx); | vm_page_insert(page, object, pidx); | ||||
*mres = page; | *mres = page; | ||||
return (VM_PAGER_OK); | return (VM_PAGER_OK); | ||||
} | } | ||||
/*------------------ Grant Table Methods ------------------------------------*/ | /*------------------ Grant Table Methods ------------------------------------*/ | ||||
static void | static void | ||||
notify(struct notify_data *notify, vm_page_t page) | notify(struct notify_data *notify, vm_page_t page) | ||||
▲ Show 20 Lines • Show All 443 Lines • Show Last 20 Lines |