diff options
| author | John Baldwin <jhb@FreeBSD.org> | 2021-12-28 21:51:25 +0000 |
|---|---|---|
| committer | John Baldwin <jhb@FreeBSD.org> | 2021-12-28 21:51:25 +0000 |
| commit | 254e4e5b77d7788c46333ae35d5e9f347e22c746 (patch) | |
| tree | 22aca772b8ff6da98ea9bcc01ad3dcac398dab7d /sys/x86 | |
| parent | 2262f7dcf476b48bdf3dfc5d460cc5a5e14e23cd (diff) | |
Diffstat (limited to 'sys/x86')
| -rw-r--r-- | sys/x86/include/x86_var.h | 2 | ||||
| -rw-r--r-- | sys/x86/x86/busdma_bounce.c | 24 |
2 files changed, 18 insertions, 8 deletions
diff --git a/sys/x86/include/x86_var.h b/sys/x86/include/x86_var.h index 47b630d076d2..78acadd2b733 100644 --- a/sys/x86/include/x86_var.h +++ b/sys/x86/include/x86_var.h @@ -38,7 +38,6 @@ extern long Maxmem; extern u_int basemem; -extern int busdma_swi_pending; extern u_int cpu_exthigh; extern u_int cpu_feature; extern u_int cpu_feature2; @@ -115,7 +114,6 @@ typedef void alias_for_inthand_t(void); bool acpi_get_fadt_bootflags(uint16_t *flagsp); void *alloc_fpusave(int flags); -void busdma_swi(void); u_int cpu_auxmsr(void); vm_paddr_t cpu_getmaxphyaddr(void); bool cpu_mwait_usable(void); diff --git a/sys/x86/x86/busdma_bounce.c b/sys/x86/x86/busdma_bounce.c index ee6d2d50d542..7afa4cf6e2aa 100644 --- a/sys/x86/x86/busdma_bounce.c +++ b/sys/x86/x86/busdma_bounce.c @@ -90,8 +90,6 @@ struct bounce_page { STAILQ_ENTRY(bounce_page) links; }; -int busdma_swi_pending; - struct bounce_zone { STAILQ_ENTRY(bounce_zone) links; STAILQ_HEAD(bp_list, bounce_page) bounce_page_list; @@ -115,6 +113,7 @@ static struct mtx bounce_lock; static int total_bpages; static int busdma_zonecount; static STAILQ_HEAD(, bounce_zone) bounce_zone_list; +static void *busdma_ih; static SYSCTL_NODE(_hw, OID_AUTO, busdma, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "Busdma parameters"); @@ -1311,6 +1310,7 @@ free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage) { struct bus_dmamap *map; struct bounce_zone *bz; + bool schedule_swi; bz = dmat->bounce_zone; bpage->datavaddr = 0; @@ -1325,6 +1325,7 @@ free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage) bpage->busaddr &= ~PAGE_MASK; } + schedule_swi = false; mtx_lock(&bounce_lock); STAILQ_INSERT_HEAD(&bz->bounce_page_list, bpage, links); bz->free_bpages++; @@ -1334,16 +1335,17 @@ free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage) STAILQ_REMOVE_HEAD(&bounce_map_waitinglist, links); STAILQ_INSERT_TAIL(&bounce_map_callbacklist, map, links); - busdma_swi_pending = 1; bz->total_deferred++; - swi_sched(vm_ih, 0); + schedule_swi = true; } } mtx_unlock(&bounce_lock); + if (schedule_swi) + swi_sched(busdma_ih, 0); } -void -busdma_swi(void) +static void +busdma_swi(void *dummy __unused) { bus_dma_tag_t dmat; struct bus_dmamap *map; @@ -1363,6 +1365,16 @@ busdma_swi(void) mtx_unlock(&bounce_lock); } +static void +start_busdma_swi(void *dummy __unused) +{ + if (swi_add(NULL, "busdma", busdma_swi, NULL, SWI_BUSDMA, INTR_MPSAFE, + &busdma_ih)) + panic("died while creating busdma swi ithread"); +} +SYSINIT(start_busdma_swi, SI_SUB_SOFTINTR, SI_ORDER_ANY, start_busdma_swi, + NULL); + struct bus_dma_impl bus_dma_bounce_impl = { .tag_create = bounce_bus_dma_tag_create, .tag_destroy = bounce_bus_dma_tag_destroy, |
