x86 bounce_bus_dmamem_alloc(): use malloc_aligned() only when possible

malloc_domainset_aligned() requires that alignment is less than
page size. Fall back to other allocation methods, most likely
kmem_alloc_contig(), when malloc_aligned() cannot fullfill the driver
request.

Reported by:	Loic F <loic.f@hardenedbsd.org>
Reviewed by:	markj
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D32127
This commit is contained in:
Konstantin Belousov 2021-09-24 20:46:47 +03:00
parent 71d31f1cf6
commit 24a3897c2c

View File

@ -453,6 +453,7 @@ bounce_bus_dmamem_alloc(bus_dma_tag_t dmat, void **vaddr, int flags,
/*
* Allocate the buffer from the malloc(9) allocator if...
* - It's small enough to fit into a single page.
* - Its alignment requirement is also smaller than the page size.
* - The low address requirement is fulfilled.
* - Default cache attributes are requested (WB).
* else allocate non-contiguous pages if...
@ -467,6 +468,7 @@ bounce_bus_dmamem_alloc(bus_dma_tag_t dmat, void **vaddr, int flags,
* Warn the user if malloc gets it wrong.
*/
if (dmat->common.maxsize <= PAGE_SIZE &&
dmat->common.alignment <= PAGE_SIZE &&
dmat->common.lowaddr >= ptoa((vm_paddr_t)Maxmem) &&
attr == VM_MEMATTR_DEFAULT) {
*vaddr = malloc_domainset_aligned(dmat->common.maxsize,