malloc(9) and its alignment

Ian Lepore ian at FreeBSD.org
Wed Feb 12 14:19:54 UTC 2014


On Wed, 2014-02-12 at 02:02 +0000, Gumpula, Suresh wrote:
> Hi,
> It appears  the malloc(9) returns 8 byte aligned ( UMA_ALIGN_PTR) pointers, but in bus_dmamem_alloc  we might end up checking for greater alignment
> if we take malloc(9) path instead contig_malloc.
> Can someone please confirm if malloc(9) returns different alignment pointers ?
> 
> bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags,
>                  bus_dmamap_t *mapp)
> {
>         /*
>          * XXX:
>          * (dmat->alignment < dmat->maxsize) is just a quick hack; the exact
>          * alignment guarantees of malloc need to be nailed down, and the
>          * code below should be rewritten to take that into account.
>          *
>          * In the meantime, we'll warn the user if malloc gets it wrong.
>          */
>         if ((dmat->maxsize <= PAGE_SIZE) &&
>            (dmat->alignment < dmat->maxsize) &&
>             dmat->lowaddr >= ptoa((vm_paddr_t)Maxmem)) {
>                 *vaddr = malloc(dmat->maxsize, M_DEVBUF, mflags);
>         } else {
> 
>                 *vaddr = contigmalloc(dmat->maxsize, M_DEVBUF, mflags,
>                     0ul, dmat->lowaddr, dmat->alignment? dmat->alignment : 1ul,
>                     dmat->boundary);
>        } 
>         if (vtophys(*vaddr) & (dmat->alignment - 1)) {
>                 NETAPP_MUTED_PRINTF("bus_dmamem_alloc failed to align memory properly.\n");
> 
> Regards,
> Suresh

In my experience, the effective malloc(9) alignment ends up being the
same as MINALLOCSIZE, which is UMA_SMALLEST_UNIT, which is 16 bytes on a
system with 4K pages.  At $work we overrode MINALLOCSIZE to 32 to work
around cache line alignment problems in busdma for ARM systems a few
years ago.

There is a newer set of busdma allocator routines available in
kern/subr_busdma_bufalloc.c which are designed to give a platform more
control over alignment of busdma buffers smaller than a page.  An
example of using them can be found in arm/busdma_machdep[-v6].c.  As far
as I know, they're only being used on ARM platforms right now.

-- Ian




More information about the freebsd-hackers mailing list