malloc(9) and its alignment
Gumpula, Suresh
Suresh.Gumpula at netapp.com
Wed Feb 12 19:40:18 UTC 2014
Thanks Ian for the reply. I will look at the ARM code, but I was thinking why malloc(9) does not return bucket size aligned pointers.
Regards,
Suresh
-----Original Message-----
From: Ian Lepore [mailto:ian at FreeBSD.org]
Sent: Wednesday, February 12, 2014 9:20 AM
To: Gumpula, Suresh
Cc: freebsd-hackers at freebsd.org
Subject: Re: malloc(9) and its alignment
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