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:
Rafal Jaworowski 2010-03-11 21:16:54 +00:00
parent 43404d7e0b
commit da10e7e2d6
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=205028
2 changed files with 9 additions and 2 deletions

View File

@ -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 &&

View File

@ -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