41#include <sys/rwlock.h>
42#include <sys/sglist.h>
44#include <sys/vmmeter.h>
55 vm_ooffset_t,
struct ucred *);
74 vm_ooffset_t foff,
struct ucred *cred)
78 vm_pindex_t npages, pindex;
93 for (i = 0; i < sg->sg_nseg; i++) {
94 if ((sg->sg_segs[i].ss_paddr % PAGE_SIZE) != 0 ||
95 (sg->sg_segs[i].ss_len % PAGE_SIZE) != 0)
97 npages += sg->sg_segs[i].ss_len / PAGE_SIZE;
104 size = round_page(size);
106 if (pindex > npages || pindex <
OFF_TO_IDX(foff) ||
119 object->handle = sglist_hold(sg);
133 while ((m = TAILQ_FIRST(&object->
un_pager.
sgp.sgp_pglist)) != 0) {
136 TAILQ_REMOVE(&object->
un_pager.
sgp.sgp_pglist, m, plinks.q);
142 object->handle = NULL;
151 vm_page_t m_paddr, page;
154 vm_memattr_t memattr;
159 KASSERT(count == 1, (
"%s: count %d", __func__, count));
162 memattr =
object->memattr;
163 offset = m[0]->pindex;
173 for (i = 0; i < sg->sg_nseg; i++) {
174 if (space + sg->sg_segs[i].ss_len <= (offset * PAGE_SIZE)) {
175 space += sg->sg_segs[i].ss_len;
178 paddr = sg->sg_segs[i].ss_paddr + offset * PAGE_SIZE - space;
181 KASSERT(paddr != 1, (
"invalid SG page index"));
185 pmap_page_get_memattr(m_paddr) != memattr) {
186 memattr = pmap_page_get_memattr(m_paddr);
188 "WARNING: A device driver has set \"memattr\" inconsistently.\n");
193 (
"backing page for SG is fake"));
198 TAILQ_INSERT_TAIL(&object->
un_pager.
sgp.sgp_pglist, page, plinks.q);
214 boolean_t sync,
int *rtvals)
217 panic(
"sg_pager_putpage called");
struct vm_object::@0::@3 sgp
union vm_object::@0 un_pager
vm_object_t vm_object_allocate(objtype_t type, vm_pindex_t size)
#define VM_OBJECT_WLOCK(object)
#define VM_OBJECT_WUNLOCK(object)
vm_page_t vm_page_getfake(vm_paddr_t paddr, vm_memattr_t memattr)
void vm_page_replace(vm_page_t mnew, vm_object_t object, vm_pindex_t pindex, vm_page_t mold)
bool vm_page_busy_acquire(vm_page_t m, int allocflags)
void vm_page_putfake(vm_page_t m)
void vm_page_valid(vm_page_t m)
#define VM_ALLOC_WAITFAIL
vm_page_t vm_phys_paddr_to_vm_page(vm_paddr_t pa)