bus_dmamem_alloc strangeness

Gerald Heinig gheinig at syskonnect.de
Thu Feb 17 09:39:24 PST 2005


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


More information about the freebsd-hackers mailing list