Date: Thu, 17 Feb 2005 18:38:40 +0100 From: Gerald Heinig <gheinig@syskonnect.de> To: hackers@freebsd.org Subject: bus_dmamem_alloc strangeness Message-ID: <4214D6A0.9010803@syskonnect.de>
next in thread | raw e-mail | index | archive | help
Hi hackers,
I've come across weird behaviour in bus_dmamem_alloc() whilst trying to
allocate small memory blocks (less than PAGE_SIZE) which have to be
aligned to PAGE_SIZE.
My segment size is 2048, my maximum number of segments is 1 (it MUST be
contiguous), my max. total segment size is also 2048 and my alignment
constraint is 4k (PAGE_SIZE). However, the DMA memory I'm getting from
bus_dmamem_alloc() is NOT aligned to 4k.
The relevant code in sys/i386/i386/busdma_machdep.c is:
=============================================================
if ((dmat->maxsize <= PAGE_SIZE) &&
dmat->lowaddr >= ptoa((vm_paddr_t)Maxmem)) {
*vaddr = malloc(dmat->maxsize, M_DEVBUF, mflags);
} else {
/*
* XXX Use Contigmalloc until it is merged into this facility
* and handles multi-seg allocations. Nobody is doing
* multi-seg allocations yet though.
* XXX Certain AGP hardware does.
*/
*vaddr = contigmalloc(dmat->maxsize, M_DEVBUF, mflags,
0ul, dmat->lowaddr, dmat->alignment? dmat->alignment : 1ul,
dmat->boundary);
}
==============================================================
My lowaddr is BUS_SPACE_MAXADDR and I'm allocating 2k blocks which have
to be 4k-aligned, which would imply the first if branch.
Surely the code should adhere to the alignment restrictions and not
simply allocate memory without checking, or am I missing something here?
Cheers,
Gerald
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4214D6A0.9010803>
