busdma_bounce: Add free_bounce_pages helper function.
Deduplicate code to iterate over the bpages list in a bus_dmamap_t freeing bounce pages during bus_dmamap_unload. Reviewed by: imp Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D34967
This commit is contained in:
@@ -1178,14 +1178,10 @@ _bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map,
|
|||||||
void
|
void
|
||||||
bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map)
|
bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map)
|
||||||
{
|
{
|
||||||
struct bounce_page *bpage;
|
|
||||||
struct bounce_zone *bz;
|
struct bounce_zone *bz;
|
||||||
|
|
||||||
if ((bz = dmat->bounce_zone) != NULL) {
|
if ((bz = dmat->bounce_zone) != NULL) {
|
||||||
while ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) {
|
free_bounce_pages(dmat, map);
|
||||||
STAILQ_REMOVE_HEAD(&map->bpages, links);
|
|
||||||
free_bounce_page(dmat, bpage);
|
|
||||||
}
|
|
||||||
|
|
||||||
bz = dmat->bounce_zone;
|
bz = dmat->bounce_zone;
|
||||||
bz->free_bpages += map->pagesreserved;
|
bz->free_bpages += map->pagesreserved;
|
||||||
|
|||||||
@@ -969,13 +969,7 @@ bounce_bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map,
|
|||||||
static void
|
static void
|
||||||
bounce_bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map)
|
bounce_bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map)
|
||||||
{
|
{
|
||||||
struct bounce_page *bpage;
|
free_bounce_pages(dmat, map);
|
||||||
|
|
||||||
while ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) {
|
|
||||||
STAILQ_REMOVE_HEAD(&map->bpages, links);
|
|
||||||
free_bounce_page(dmat, bpage);
|
|
||||||
}
|
|
||||||
|
|
||||||
map->sync_count = 0;
|
map->sync_count = 0;
|
||||||
map->flags &= ~DMAMAP_MBUF;
|
map->flags &= ~DMAMAP_MBUF;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -420,6 +420,17 @@ free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage)
|
|||||||
wakeup(&bounce_map_callbacklist);
|
wakeup(&bounce_map_callbacklist);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map)
|
||||||
|
{
|
||||||
|
struct bounce_page *bpage;
|
||||||
|
|
||||||
|
while ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) {
|
||||||
|
STAILQ_REMOVE_HEAD(&map->bpages, links);
|
||||||
|
free_bounce_page(dmat, bpage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
busdma_thread(void *dummy __unused)
|
busdma_thread(void *dummy __unused)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -801,17 +801,12 @@ _bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map,
|
|||||||
void
|
void
|
||||||
bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map)
|
bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map)
|
||||||
{
|
{
|
||||||
struct bounce_page *bpage;
|
|
||||||
|
|
||||||
if (dmat->iommu) {
|
if (dmat->iommu) {
|
||||||
IOMMU_UNMAP(dmat->iommu, map->segments, map->nsegs, dmat->iommu_cookie);
|
IOMMU_UNMAP(dmat->iommu, map->segments, map->nsegs, dmat->iommu_cookie);
|
||||||
map->nsegs = 0;
|
map->nsegs = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) {
|
free_bounce_pages(dmat, map);
|
||||||
STAILQ_REMOVE_HEAD(&map->bpages, links);
|
|
||||||
free_bounce_page(dmat, bpage);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -810,13 +810,7 @@ bounce_bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map,
|
|||||||
static void
|
static void
|
||||||
bounce_bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map)
|
bounce_bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map)
|
||||||
{
|
{
|
||||||
struct bounce_page *bpage;
|
free_bounce_pages(dmat, map);
|
||||||
|
|
||||||
while ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) {
|
|
||||||
STAILQ_REMOVE_HEAD(&map->bpages, links);
|
|
||||||
free_bounce_page(dmat, bpage);
|
|
||||||
}
|
|
||||||
|
|
||||||
map->sync_count = 0;
|
map->sync_count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -907,15 +907,10 @@ bounce_bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map,
|
|||||||
static void
|
static void
|
||||||
bounce_bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map)
|
bounce_bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map)
|
||||||
{
|
{
|
||||||
struct bounce_page *bpage;
|
|
||||||
|
|
||||||
if (map == NULL)
|
if (map == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
while ((bpage = STAILQ_FIRST(&map->bpages)) != NULL) {
|
free_bounce_pages(dmat, map);
|
||||||
STAILQ_REMOVE_HEAD(&map->bpages, links);
|
|
||||||
free_bounce_page(dmat, bpage);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
Reference in New Issue
Block a user