David, On Tue, Jan 26, 2010 at 6:58 PM, Manuel Lauss <manuel.lauss@xxxxxxxxxxxxxx> wrote: > On Tue, Jan 26, 2010 at 6:44 PM, David Daney <ddaney@xxxxxxxxxxxxxxxxxx> wrote: >> Manuel Lauss wrote: >>> >>> DBDMA descriptors need to be located at 32-byte aligned addresses; >>> however kmalloc rarely delivers such addresses. The dbdma code >>> works around that by allocating 63 bytes and re-aligning the >>> descriptor base afterwards. Hoewever when freeing memory it does >>> not account for this adjustment and trips the kfree debugcheck: >>> >> >> Correct me if I am wrong, but don't kmalloc et al. return blocks aligned >> boundaries of the size rounded up the the next power of two? So if you >> need 32-byte aligned addresses, just use a size value of 32 or greater. You >> wouldn't have to add 63 and do masking and remember the membase value as you >> do in the patch. > > The description is not completely correct (I suck a writing those): > It allocates a number > of descriptor entries (64 bytes each) specified by the driver in a single block: > > desc_base = (u32)kmalloc(entries * sizeof(au1x_ddma_desc_t), > GFP_KERNEL|GFP_DMA); > if (desc_base == 0) > return 0; > > if (desc_base & 0x1f) { > > So far the 3 users I have (mmc, spi, audio) always return true on the above > check (2 descriptors for audio for instance). ... but only if CONFIG_DEBUG_SLAB is enabled. You are correct in that kmalloc() returns aligned blocks with a non-debug slab allocator and this fix becomes superfluous. I'll try to confirm this with the other allocators and resend with a fixed description. Thank you for the pointer! Manuel Lauss