Re: [RFC PATCH] usb: hcd: warn about URB buffers that are not DMA aligned and are about to be DMA mapped

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, Jun 15, 2013 at 9:10 PM, Jussi Kivilinna <jussi.kivilinna@xxxxxx> wrote:
> On 15.06.2013 15:07, Ming Lei wrote:
>> On Sat, Jun 15, 2013 at 6:19 PM, Jussi Kivilinna <jussi.kivilinna@xxxxxx> wrote:
>>> On 15.06.2013 10:41, Ming Lei wrote:
>>>> Cc: netdev
>>>>
>>>> On Fri, Jun 14, 2013 at 9:38 PM, Jussi Kivilinna <jussi.kivilinna@xxxxxx> wrote:
>>>>> Appearently some out-of-tree USB host drivers do not handle DMA alignment for
>>>>
>>>> Looks these host drivers have to face the fact that the transfer buffer is often
>>>> DMA non-aligned from network device drivers(in fact, the buffer is from
>>>> network protocol stack), if you run usbnet, then you will get the added warning
>>>> immediately.
>>>>
>>>
>>> Yes, getting warning immediately, but once, and blaming host driver seems ok.
>>
>> We do know the fact of non-aligned transfer buffer from network, which has been
>> for long time, so does it make sense to print warning and annoy people?
>
> It's only printed if host controller driver is not behaving correctly.

If you make sure the warning is only printed on broken controller,
that is fine.

>
> I have changed the message to be printed for v2-patch, and it is now:
> dev_WARN_ONCE(hcd->self.controller, 1,
>         "broken USB host controller driver; does not correctly handle DMA alignment for urb->transfer_buffer (offset: %d).\n",
>         dma_offset);
>
> I sent the patch as RFC since I'm not sure.. maybe annoying warnings make

That is fine.

> people aware of issues that they don't yet know of and things get fixed?

I mean it isn't good to annoy people who are using good host controller, :-)

>>
>>>
>>>>> URB buffers and let core/hcd.c to do the mapping on architectures that have
>>>>> minimum DMA alignment requirements. This leads to random memory corruptions
>>>>> and crashes when using USB device drivers that use unaligned URB buffers.
>>>>
>>>> Maybe you should check the dma mapping/unmapping implementation of
>>>> the arch, non-aligned buffer should have be covered by the API easily.
>>>>
>>>> Also USB Host controller should have supported non-aligned DMA buffer.
>>>
>>> From what I found, there was some discussion about these issues around 2010:
>>>  http://lists.infradead.org/pipermail/linux-arm-kernel/2010-August/022983.html
>>
>> From the discussion,  people think that HCD should handle the unaligned buffer,
>> right?
>
> Yes, that's how I understood it.
>
>>
>>>
>>> To me, it seems that non-aligned buffers cannot be easily handled by all archs
>>> at dma mapping/unmapping phase and that HCD driver should do the alignment on
>>
>> If the memory which shares cache line with transfer buffer can't be
>> accessed during
>> DMA transfer(between URB submit and complete), dma mapping/unmapping
>> should have handled it.
>>
>> About the network transfer buffer case, I think it should be true,
>> otherwise there
>> should have lots of memory corruption reports about usb network drivers.
>> Fortunately, there are seldom such reports.
>>
>
> Another reason why rtl8192cu is so hard, is that it uses pre-allocated array
> for buffers of multiple URBs, and more than one transfer buffer can reside on
> same cache line.

If so, that should be bug inside rtl8192, and more than one transfer
buffer shares
one cache line should be avoided, I understand the buffer isn't from
network stack,
don't I?

>
>>> archs that set ARCH_DMA_MINALIGN. For example, ehci_tegra does copy unaligned
>>> transfer buffers to temporary aligned buffers before letting them to USB core.
>>
>> Yes, if host controller can't handle this, the HCD has to work around
>> the problem. Anyway, most of host controllers can deal with the it,
>> can't they?
>
> Can they? Maybe they can handle most cases of unaligned buffers, but not some
> corner cases, like transfer buffers on same cache line.

Of course, most of in-tree host controller can handle non-aligned buffer.

If transfer buffers share one same cache line, it should be bug in driver,
not fault of host controller.

>
>>
>>>
>>>>
>>>>>
>>>>> Instead of fixing host drivers, users end up posting bug reports against
>>>>> those USB device drivers that use unaligned buffers for URB; such as with
>>>>> rtl8192cu (http://thread.gmane.org/gmane.linux.kernel.wireless.general/105631).
>>>>
>>>> Not only rtl8192cu driver, all USB network device drivers have the problem.
>>>>
>>>>>
>>>>> Patch makes this issue more visible at core level, and hopefully gives hint
>>>>> for future hcd driver implementors about this problem.
>>>>
>>>> So please find the root cause first, and don't add the noise now.
>>>
>>> I think the root cause is that host driver is letting pass non-aligned buffers
>>> to core on archs that have ARCH_DMA_MINALIGN set.
>>
>> No, I don't think so, about the problem, the dma alignment requirement should
>> be from your host controller.
>>
>> As I said above, dma mapping/unmapping should be capable of dealing with
>> the unaligned buffer if no one touches memory which shares cacheline with
>> URB->transfer_buffer during URB transfer.
>
> How can you guarantee that when you allow unaligned URB buffers?

As far as the network driver is concerned, the network stack should guarantee
memory shared cacheline with skb->data won't be accessed during transfer.

>
> You can have the buffer as part of some larger structure and send out async URB.

That is bug in the driver, and not the situation I mentioned.

I mean if the non-aligned buffer is skb->data, it should be OK. But if
the buffer is allocated inside driver itself and not skb buffer, it is better
to keep aligned since driver can do it.

> Then while buffer is DMA mapped and send async to hw, you use other parts of
> that structure even if it shares cacheline with the buffer. You might issue
> multiple URBs with transfer buffers within same cacheline. I would expect that
> to be acceptable or URB documentation should say something against such.
>
>>
>> Looks you need to know why the memory corruption happens. Is it caused
>> by non-aligned arch mapping/unmapping? or by host controller hardware when
>> dealing with non-aligned transfer buffer?
>>
>>> The warning given just before such unaligned buffer is passed to dma_map_single,
>>> which requires ARCH_DMA_MINALIGN alignment. This seems reasonable to me.
>>
>> ARCH_DMA_MINALIGN means that kmalloc() should return aligned dma buffer.
>>
>> Again, you have to accept the fact in which transfer buffer from
>> network stack is
>> non-aligned.
>>
>
> Yes, that is the message I'm trying to make visible so that host drivers,
> that don't handle such, get fixed.

Please only print the warning on the host controller which can't deal with
non-aligned buffer.

> Hm.. rethink this a bit.
>
> Transfer buffer might be dma aligned but shorter than cacheline and end of cacheline
> used as something else. Manual alignment by host driver does not catch that
> or fix that.
> So, yes.. dma mapping should work with unaligned buffers, but maybe the actual
> problem is multiple buffers from same cacheline.

That is bug in driver.


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




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux