Index: sys/arm/arm/busdma_machdep-v4.c =================================================================== --- sys/arm/arm/busdma_machdep-v4.c +++ sys/arm/arm/busdma_machdep-v4.c @@ -737,7 +737,11 @@ !_bus_dma_can_bounce(dmat->lowaddr, dmat->highaddr)) { *vaddr = uma_zalloc(bufzone->umazone, mflags); } else if (dmat->nsegments >= btoc(dmat->maxsize) && - dmat->alignment <= PAGE_SIZE && dmat->boundary == 0) { + dmat->alignment <= PAGE_SIZE && + (dmat->boundary == 0 || + (dmat->common.alignment != 0 && dmat->common.maxsegsz != 0 && + (dmat->common.boundary % dmat->common.alignment) == 0 && + (dmat->common.alignment % dmat->common.maxsegsz) == 0))) { *vaddr = (void *)kmem_alloc_attr(kernel_arena, dmat->maxsize, mflags, 0, dmat->lowaddr, memattr); } else { Index: sys/arm/arm/busdma_machdep-v6.c =================================================================== --- sys/arm/arm/busdma_machdep-v6.c +++ sys/arm/arm/busdma_machdep-v6.c @@ -789,7 +789,11 @@ !exclusion_bounce(dmat)) { *vaddr = uma_zalloc(bufzone->umazone, mflags); } else if (dmat->nsegments >= btoc(dmat->maxsize) && - dmat->alignment <= PAGE_SIZE && dmat->boundary == 0) { + dmat->alignment <= PAGE_SIZE && + (dmat->boundary == 0 || + (dmat->common.alignment != 0 && dmat->common.maxsegsz != 0 && + (dmat->common.boundary % dmat->common.alignment) == 0 && + (dmat->common.alignment % dmat->common.maxsegsz) == 0))) { *vaddr = (void *)kmem_alloc_attr(kernel_arena, dmat->maxsize, mflags, 0, dmat->lowaddr, memattr); } else { Index: sys/arm64/arm64/busdma_bounce.c =================================================================== --- sys/arm64/arm64/busdma_bounce.c +++ sys/arm64/arm64/busdma_bounce.c @@ -476,7 +476,10 @@ } else if (dmat->common.nsegments >= btoc(dmat->common.maxsize) && dmat->common.alignment <= PAGE_SIZE && (dmat->common.boundary == 0 || - dmat->common.boundary >= dmat->common.lowaddr)) { + dmat->common.boundary >= dmat->common.lowaddr || + (dmat->common.alignment != 0 && dmat->common.maxsegsz != 0 && + (dmat->common.boundary % dmat->common.alignment) == 0 && + (dmat->common.alignment % dmat->common.maxsegsz) == 0))) { /* Page-based multi-segment allocations allowed */ *vaddr = (void *)kmem_alloc_attr(kernel_arena, dmat->common.maxsize, mflags, 0ul, dmat->common.lowaddr, Index: sys/mips/mips/busdma_machdep.c =================================================================== --- sys/mips/mips/busdma_machdep.c +++ sys/mips/mips/busdma_machdep.c @@ -700,7 +700,11 @@ !_bus_dma_can_bounce(dmat->lowaddr, dmat->highaddr)) { vaddr = uma_zalloc(bufzone->umazone, mflags); } else if (dmat->nsegments >= btoc(dmat->maxsize) && - dmat->alignment <= PAGE_SIZE && dmat->boundary == 0) { + dmat->alignment <= PAGE_SIZE && + (dmat->boundary == 0 || + (dmat->common.alignment != 0 && dmat->common.maxsegsz != 0 && + (dmat->common.boundary % dmat->common.alignment) == 0 && + (dmat->common.alignment % dmat->common.maxsegsz) == 0))) { vaddr = (void *)kmem_alloc_attr(kernel_arena, dmat->maxsize, mflags, 0, dmat->lowaddr, memattr); } else { Index: sys/x86/x86/busdma_bounce.c =================================================================== --- sys/x86/x86/busdma_bounce.c +++ sys/x86/x86/busdma_bounce.c @@ -412,7 +412,10 @@ } else if (dmat->common.nsegments >= btoc(dmat->common.maxsize) && dmat->common.alignment <= PAGE_SIZE && (dmat->common.boundary == 0 || - dmat->common.boundary >= dmat->common.lowaddr)) { + dmat->common.boundary >= dmat->common.lowaddr || + (dmat->common.alignment != 0 && dmat->common.maxsegsz != 0 && + (dmat->common.boundary % dmat->common.alignment) == 0 && + (dmat->common.alignment % dmat->common.maxsegsz) == 0))) { /* Page-based multi-segment allocations allowed */ *vaddr = (void *)kmem_alloc_attr(kernel_arena, dmat->common.maxsize, mflags, 0ul, dmat->common.lowaddr,