aboutsummaryrefslogtreecommitdiff
path: root/sys/x86
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2021-12-28 21:51:25 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2021-12-28 21:51:25 +0000
commit254e4e5b77d7788c46333ae35d5e9f347e22c746 (patch)
tree22aca772b8ff6da98ea9bcc01ad3dcac398dab7d /sys/x86
parent2262f7dcf476b48bdf3dfc5d460cc5a5e14e23cd (diff)
Diffstat (limited to 'sys/x86')
-rw-r--r--sys/x86/include/x86_var.h2
-rw-r--r--sys/x86/x86/busdma_bounce.c24
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,