Page MenuHomeFreeBSD

D10645.id28146.diff
No OneTemporary

D10645.id28146.diff

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,

File Metadata

Mime Type
text/plain
Expires
Sun, Nov 23, 10:30 PM (12 h, 36 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
26036156
Default Alt Text
D10645.id28146.diff (3 KB)

Event Timeline