Fix ARM cache handling yet more.
1) vm_machdep.c: remove the dangling allocations so they do not un-necessarily turn off the cache upon consecutive access. 2) busdma_machdep.c: remove the same amount than shadow mapped. Reported by: Maks Verver Submitted by: Mark Tinguely Reviewed by: Grzegorz Bernacki MFC after: 3 days
This commit is contained in:
parent
43404d7e0b
commit
da10e7e2d6
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=205028
@ -649,7 +649,8 @@ bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map)
|
||||
KASSERT(map->allocbuffer == vaddr,
|
||||
("Trying to freeing the wrong DMA buffer"));
|
||||
vaddr = map->origbuffer;
|
||||
arm_unmap_nocache(map->allocbuffer, dmat->maxsize);
|
||||
arm_unmap_nocache(map->allocbuffer,
|
||||
dmat->maxsize + ((vm_offset_t)vaddr & PAGE_MASK));
|
||||
}
|
||||
if (dmat->maxsize <= PAGE_SIZE &&
|
||||
dmat->alignment < dmat->maxsize &&
|
||||
|
@ -171,6 +171,9 @@ sf_buf_free(struct sf_buf *sf)
|
||||
if (sf->ref_count == 0) {
|
||||
TAILQ_INSERT_TAIL(&sf_buf_freelist, sf, free_entry);
|
||||
nsfbufsused--;
|
||||
pmap_kremove(sf->kva);
|
||||
sf->m = NULL;
|
||||
LIST_REMOVE(sf, list_entry);
|
||||
if (sf_buf_alloc_want > 0)
|
||||
wakeup_one(&sf_buf_freelist);
|
||||
}
|
||||
@ -502,9 +505,12 @@ arm_unmap_nocache(void *addr, vm_size_t size)
|
||||
|
||||
size = round_page(size);
|
||||
i = (raddr - arm_nocache_startaddr) / (PAGE_SIZE);
|
||||
for (; size > 0; size -= PAGE_SIZE, i++)
|
||||
for (; size > 0; size -= PAGE_SIZE, i++) {
|
||||
arm_nocache_allocated[i / BITS_PER_INT] &= ~(1 << (i %
|
||||
BITS_PER_INT));
|
||||
pmap_kremove(raddr);
|
||||
raddr += PAGE_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef ARM_USE_SMALL_ALLOC
|
||||
|
Loading…
Reference in New Issue
Block a user