From 1b544875743d53491a096b0c757bf30ce73bb83b Mon Sep 17 00:00:00 2001 From: dfr Date: Wed, 22 Nov 2000 07:16:51 +0000 Subject: Protect the bounce page list with a mutex instead of using splhigh(). --- sys/alpha/alpha/busdma_machdep.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) (limited to 'sys/alpha') diff --git a/sys/alpha/alpha/busdma_machdep.c b/sys/alpha/alpha/busdma_machdep.c index d6112ab..fff99d5 100644 --- a/sys/alpha/alpha/busdma_machdep.c +++ b/sys/alpha/alpha/busdma_machdep.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -69,6 +70,7 @@ struct bounce_page { int busdma_swi_pending; +static struct mtx bounce_lock; static STAILQ_HEAD(bp_list, bounce_page) bounce_page_list; static int free_bpages; static int reserved_bpages; @@ -591,6 +593,7 @@ alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages) count = 0; if (total_bpages == 0) { + mtx_init(&bounce_lock, "BouncePage", MTX_DEF); STAILQ_INIT(&bounce_page_list); STAILQ_INIT(&bounce_map_waitinglist); STAILQ_INIT(&bounce_map_callbacklist); @@ -598,7 +601,6 @@ alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages) while (numpages > 0) { struct bounce_page *bpage; - int s; bpage = (struct bounce_page *)malloc(sizeof(*bpage), M_DEVBUF, M_NOWAIT); @@ -616,11 +618,11 @@ alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages) break; } bpage->busaddr = pmap_kextract(bpage->vaddr); - s = splhigh(); + mtx_enter(&bounce_lock, MTX_DEF); STAILQ_INSERT_TAIL(&bounce_page_list, bpage, links); total_bpages++; free_bpages++; - splx(s); + mtx_exit(&bounce_lock, MTX_DEF); count++; numpages--; } @@ -645,7 +647,6 @@ static vm_offset_t add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, bus_size_t size) { - int s; struct bounce_page *bpage; if (map->pagesneeded == 0) @@ -656,7 +657,7 @@ add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, panic("add_bounce_page: map doesn't need any pages"); map->pagesreserved--; - s = splhigh(); + mtx_enter(&bounce_lock, MTX_DEF); bpage = STAILQ_FIRST(&bounce_page_list); if (bpage == NULL) panic("add_bounce_page: free page list is empty"); @@ -664,7 +665,7 @@ add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, STAILQ_REMOVE_HEAD(&bounce_page_list, links); reserved_bpages--; active_bpages++; - splx(s); + mtx_exit(&bounce_lock, MTX_DEF); bpage->datavaddr = vaddr; bpage->datacount = size; @@ -675,13 +676,12 @@ add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, static void free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage) { - int s; struct bus_dmamap *map; bpage->datavaddr = 0; bpage->datacount = 0; - s = splhigh(); + mtx_enter(&bounce_lock, MTX_DEF); STAILQ_INSERT_HEAD(&bounce_page_list, bpage, links); free_bpages++; active_bpages--; @@ -694,22 +694,21 @@ free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage) sched_swi(vm_ih, SWI_NOSWITCH); } } - splx(s); + mtx_exit(&bounce_lock, MTX_DEF); } void busdma_swi(void) { - int s; struct bus_dmamap *map; - s = splhigh(); + mtx_enter(&bounce_lock, MTX_DEF); while ((map = STAILQ_FIRST(&bounce_map_callbacklist)) != NULL) { STAILQ_REMOVE_HEAD(&bounce_map_callbacklist, links); - splx(s); + mtx_exit(&bounce_lock, MTX_DEF); bus_dmamap_load(map->dmat, map, map->buf, map->buflen, map->callback, map->callback_arg, /*flags*/0); - s = splhigh(); + mtx_enter(&bounce_lock, MTX_DEF); } - splx(s); + mtx_exit(&bounce_lock, MTX_DEF); } -- cgit v1.1