| 257 | int dmar_tbl_pagecnt; |
| 258 | |
| 259 | vm_page_t |
| 260 | dmar_pgalloc(vm_object_t obj, vm_pindex_t idx, int flags) |
| 261 | { |
| 262 | vm_page_t m; |
| 263 | int zeroed, aflags; |
| 264 | |
| 265 | zeroed = (flags & IOMMU_PGF_ZERO) != 0 ? VM_ALLOC_ZERO : 0; |
| 266 | aflags = zeroed | VM_ALLOC_NOBUSY | VM_ALLOC_SYSTEM | VM_ALLOC_NODUMP | |
| 267 | ((flags & IOMMU_PGF_WAITOK) != 0 ? VM_ALLOC_WAITFAIL : |
| 268 | VM_ALLOC_NOWAIT); |
| 269 | for (;;) { |
| 270 | if ((flags & IOMMU_PGF_OBJL) == 0) |
| 271 | VM_OBJECT_WLOCK(obj); |
| 272 | m = vm_page_lookup(obj, idx); |
| 273 | if ((flags & IOMMU_PGF_NOALLOC) != 0 || m != NULL) { |
| 274 | if ((flags & IOMMU_PGF_OBJL) == 0) |
| 275 | VM_OBJECT_WUNLOCK(obj); |
| 276 | break; |
| 277 | } |
| 278 | m = vm_page_alloc_contig(obj, idx, aflags, 1, 0, |
| 279 | dmar_high, PAGE_SIZE, 0, VM_MEMATTR_DEFAULT); |
| 280 | if ((flags & IOMMU_PGF_OBJL) == 0) |
| 281 | VM_OBJECT_WUNLOCK(obj); |
| 282 | if (m != NULL) { |
| 283 | if (zeroed && (m->flags & PG_ZERO) == 0) |
| 284 | pmap_zero_page(m); |
| 285 | atomic_add_int(&dmar_tbl_pagecnt, 1); |
| 286 | break; |
| 287 | } |
| 288 | if ((flags & IOMMU_PGF_WAITOK) == 0) |
| 289 | break; |
| 290 | } |
| 291 | return (m); |
| 292 | } |
| 293 | |
| 294 | void |
| 295 | dmar_pgfree(vm_object_t obj, vm_pindex_t idx, int flags) |
no test coverage detected