On 11/25/2014 01:14 PM, Sergei Shtylyov wrote:
> On 11/25/2014 3:11 PM, Sebastian Andrzej Siewior wrote:
> 
>>>> the following error pops up during "testusb -a -t 10"
>>>> | musb-hdrc musb-hdrc.1.auto: dma_pool_free buffer-128,
>>>> f134e000/be842000 (bad dma)
>>>> hcd_buffer_create() creates a few buffers, the smallest has 32 bytes of
>>>> size. ARCH_KMALLOC_MINALIGN is set to 64 bytes. This combo results in
>>>> hcd_buffer_alloc() returning memory which is 32bytes aligned and it
>>>> might by identified by buffer_offset() as another buffer. This means
>>>> the
>>>> buffer which is on a 32byte boundary will not get freed, instead it
>>>> tries to free another buffer with the error message.
> 
>>>> This patch fixes the issue by creating the smallest DMA buffer with the
>>>> size of ARCH_KMALLOC_MINALIGN. This will be either 32 or 64 bytes.
>>>> If the
>>>> ARCH_KMALLOC_MINALIGN is 128 (currently powerpc64, mips ip32, x86
>>>> pentium
>>>> 4) then it will create the first buffer with 128 bytes and will have
>>>> only 3
>>>> buffers in total. There is a BUILD_BUG_ON() now in case someone has a
>>>> ARCH_KMALLOC_MINALIGN greater than 256 bytes.
> 
>>>     Reading the patch, the actual limit seems to be 128 instead.
> 
>> if ARCH_KMALLOC_MINALIGN is greater than 64. What did I wrong?
> 
>    Either limit of 256 in the change log or BUILD_BUG_ON() itself.

Now I understand. You complain that BUILD_BUG_ON() is >128 and the
changelog says >256. Good. The changelog is wrong. I will update it once
I learn from Alan what he wants to be changed. Thanks for spotting
it.

>>>> Cc: sta...@vger.kernel.org
>>>> Signed-off-by: Sebastian Andrzej Siewior <bige...@linutronix.de>
>>>> ---
>>>>    drivers/usb/core/buffer.c | 5 +++++
>>>>    include/linux/usb/hcd.h   | 8 ++++++--
>>>>    2 files changed, 11 insertions(+), 2 deletions(-)
> 
>>>> diff --git a/drivers/usb/core/buffer.c b/drivers/usb/core/buffer.c
>>>> index 684ef70dc09d..a80d1ec8b1b0 100644
>>>> --- a/drivers/usb/core/buffer.c
>>>> +++ b/drivers/usb/core/buffer.c
>>> [...]
>>>> @@ -58,6 +62,7 @@ int hcd_buffer_create(struct usb_hcd *hcd)
>>>>            !(hcd->driver->flags & HCD_LOCAL_MEM))
>>>>            return 0;
>>>>
>>>> +    BUILD_BUG_ON(ARCH_KMALLOC_MINALIGN > 128);
>>>>        for (i = 0; i < HCD_BUFFER_POOLS; i++) {
>>>>            size = pool_max[i];
>>>>            if (!size)
>>> [...]
> 
>> Sebastian
> 
> WBR, Sergei
> 

Sebatian
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to