Page MenuHomeFreeBSD

D19753.id55600.diff
No OneTemporary

D19753.id55600.diff

Index: sys/x86/iommu/busdma_dmar.c
===================================================================
--- sys/x86/iommu/busdma_dmar.c
+++ sys/x86/iommu/busdma_dmar.c
@@ -665,7 +665,7 @@
{
struct bus_dma_tag_dmar *tag;
struct bus_dmamap_dmar *map;
- vm_page_t *ma;
+ vm_page_t *ma, fma;
vm_paddr_t pstart, pend;
int error, i, ma_cnt, offset;
@@ -679,10 +679,20 @@
M_WAITOK : M_NOWAIT);
if (ma == NULL)
return (ENOMEM);
- for (i = 0; i < ma_cnt; i++)
- ma[i] = PHYS_TO_VM_PAGE(pstart + i * PAGE_SIZE);
+ fma = malloc(sizeof(struct vm_page) * ma_cnt, M_DEVBUF,
+ M_ZERO | (map->cansleep ? M_WAITOK : M_NOWAIT));
+ if (fma == NULL) {
+ free(ma, M_DEVBUF);
+ return (ENOMEM);
+ }
+ for (i = 0; i < ma_cnt; i++) {
+ vm_page_initfake(&fma[i], pstart + i * PAGE_SIZE,
+ VM_MEMATTR_DEFAULT);
+ ma[i] = &fma[i];
+ }
error = dmar_bus_dmamap_load_something(tag, map, ma, offset, buflen,
flags, segs, segp);
+ free(fma, M_DEVBUF);
free(ma, M_DEVBUF);
return (error);
}
@@ -708,38 +718,19 @@
M_WAITOK : M_NOWAIT);
if (ma == NULL)
return (ENOMEM);
- if (dumping) {
- /*
- * If dumping, do not attempt to call
- * PHYS_TO_VM_PAGE() at all. It may return non-NULL
- * but the vm_page returned might be not initialized,
- * e.g. for the kernel itself.
- */
- KASSERT(pmap == kernel_pmap, ("non-kernel address write"));
- fma = malloc(sizeof(struct vm_page) * ma_cnt, M_DEVBUF,
- M_ZERO | (map->cansleep ? M_WAITOK : M_NOWAIT));
- if (fma == NULL) {
- free(ma, M_DEVBUF);
- return (ENOMEM);
- }
- for (i = 0; i < ma_cnt; i++, pstart += PAGE_SIZE) {
+ fma = malloc(sizeof(struct vm_page) * ma_cnt, M_DEVBUF,
+ M_ZERO | (map->cansleep ? M_WAITOK : M_NOWAIT));
+ if (fma == NULL) {
+ free(ma, M_DEVBUF);
+ return (ENOMEM);
+ }
+ for (i = 0; i < ma_cnt; i++, pstart += PAGE_SIZE) {
+ if (pmap == kernel_pmap)
paddr = pmap_kextract(pstart);
- vm_page_initfake(&fma[i], paddr, VM_MEMATTR_DEFAULT);
- ma[i] = &fma[i];
- }
- } else {
- fma = NULL;
- for (i = 0; i < ma_cnt; i++, pstart += PAGE_SIZE) {
- if (pmap == kernel_pmap)
- paddr = pmap_kextract(pstart);
- else
- paddr = pmap_extract(pmap, pstart);
- ma[i] = PHYS_TO_VM_PAGE(paddr);
- KASSERT(VM_PAGE_TO_PHYS(ma[i]) == paddr,
- ("PHYS_TO_VM_PAGE failed %jx %jx m %p",
- (uintmax_t)paddr, (uintmax_t)VM_PAGE_TO_PHYS(ma[i]),
- ma[i]));
- }
+ else
+ paddr = pmap_extract(pmap, pstart);
+ vm_page_initfake(&fma[i], paddr, VM_MEMATTR_DEFAULT);
+ ma[i] = &fma[i];
}
error = dmar_bus_dmamap_load_something(tag, map, ma, offset, buflen,
flags, segs, segp);

File Metadata

Mime Type
text/plain
Expires
Mon, Apr 27, 10:16 AM (16 h, 24 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32222479
Default Alt Text
D19753.id55600.diff (2 KB)

Event Timeline