diff options
author | mux <mux@FreeBSD.org> | 2003-03-13 17:18:48 +0000 |
---|---|---|
committer | mux <mux@FreeBSD.org> | 2003-03-13 17:18:48 +0000 |
commit | 15b2d31e358554d642da71cfc6c4967e3bea1414 (patch) | |
tree | 89f0117eb121a46688fd90609d58fc94cc105a53 /sys/ia64 | |
parent | d3ce48cb48061b92b1b7ac962379bf631017e7b1 (diff) | |
download | FreeBSD-src-15b2d31e358554d642da71cfc6c4967e3bea1414.zip FreeBSD-src-15b2d31e358554d642da71cfc6c4967e3bea1414.tar.gz |
Grab Giant around calls to contigmalloc() and contigfree() so
that drivers converted to be MP safe don't have to deal with it.
Diffstat (limited to 'sys/ia64')
-rw-r--r-- | sys/ia64/ia64/busdma_machdep.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/sys/ia64/ia64/busdma_machdep.c b/sys/ia64/ia64/busdma_machdep.c index e7c38be..80f350b 100644 --- a/sys/ia64/ia64/busdma_machdep.c +++ b/sys/ia64/ia64/busdma_machdep.c @@ -354,10 +354,12 @@ bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, * and handles multi-seg allocations. Nobody is doing * multi-seg allocations yet though. */ + mtx_lock(&Giant); *vaddr = contigmalloc(dmat->maxsize, M_DEVBUF, (flags & BUS_DMA_NOWAIT) ? M_NOWAIT : M_WAITOK, 0ul, dmat->lowaddr, dmat->alignment? dmat->alignment : 1ul, dmat->boundary); + mtx_unlock(&Giant); } if (*vaddr == NULL) return (ENOMEM); @@ -379,8 +381,11 @@ bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) panic("bus_dmamem_free: Invalid map freed\n"); if ((dmat->maxsize <= PAGE_SIZE) && dmat->lowaddr >= ptoa(Maxmem)) free(vaddr, M_DEVBUF); - else + else { + mtx_lock(&Giant); contigfree(vaddr, dmat->maxsize, M_DEVBUF); + mtx_unlock(&Giant); + } } #define BUS_DMAMAP_NSEGS ((64 * 1024 / PAGE_SIZE) + 1) @@ -817,11 +822,13 @@ alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages) if (bpage == NULL) break; + mtx_lock(&Giant); bpage->vaddr = (vm_offset_t)contigmalloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT, 0ul, dmat->lowaddr, PAGE_SIZE, 0); + mtx_unlock(&Giant); if (bpage->vaddr == NULL) { free(bpage, M_DEVBUF); break; |