c = vm_region_alloc(&consistent_head, size,
gfp & ~(__GFP_DMA | __GFP_HIGHMEM));
if (c) {
- pte_t *pte = consistent_pte + CONSISTENT_OFFSET(c->vm_start);
+ unsigned long vaddr = c->vm_start;
+ pte_t *pte = consistent_pte + CONSISTENT_OFFSET(vaddr);
struct page *end = page + (1 << order);
/*
set_page_count(page, 1);
SetPageReserved(page);
- set_pte(pte, mk_pte(page, pgprot_noncached(PAGE_KERNEL)));
+ set_pte_at(&init_mm, vaddr,
+ pte, mk_pte(page, pgprot_noncached(PAGE_KERNEL)));
page++;
pte++;
+ vaddr += PAGE_SIZE;
} while (size -= PAGE_SIZE);
/*
void __dma_free_coherent(size_t size, void *vaddr)
{
struct vm_region *c;
- unsigned long flags;
+ unsigned long flags, addr;
pte_t *ptep;
size = PAGE_ALIGN(size);
}
ptep = consistent_pte + CONSISTENT_OFFSET(c->vm_start);
+ addr = c->vm_start;
do {
- pte_t pte = ptep_get_and_clear(ptep);
+ pte_t pte = ptep_get_and_clear(&init_mm, addr, ptep);
unsigned long pfn;
ptep++;
+ addr += PAGE_SIZE;
if (!pte_none(pte) && pte_present(pte)) {
pfn = pte_pfn(pte);