Manuel Lauss wrote:
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.
Oh no! I make this assumption in my drivers. If CONFIG_DEBUG_SLAB
causes it to not be true... Bad news.
David Daney
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