2011-02-01 18:08:01

by Andi Kleen

[permalink] [raw]
Subject: Re: b44 driver causes panic when using swiotlb

On Mon, Jan 31, 2011 at 06:54:21PM -0600, Robert Hancock wrote:
> On 01/31/2011 10:36 AM, Andi Kleen wrote:
> >On Mon, Jan 31, 2011 at 10:54:12AM -0500, Chuck Ebbert wrote:
> >>The b44 driver is triggering this panic in swiotlb_map_page():
> >>
> >> if (!dma_capable(dev, dev_addr, size))
> >> panic("map_single: bounce buffer is not DMA'ble");
> >>
> >>The kernel log says the bounce buffers are at 0xdb400000, but b44 can
> >>only do DMA to the first 1GB of memory:
> >
> >b44 needs to use GFP_DMA then and do its own custom bouncing.
> >The standard pci_map_* bounce buffering is only designed for at least
> >32bit capable devices.
>
> That seems wrong - it's a documented API and that restriction isn'

Please read the documentation. When PCI DMA cannot handle it
it returns failure. That is what happened here.

Besides historically PCI-DMA never handled < 4GB.

> documented. Either it should comply with the request or return a
> failure if it can't accomodate it, not just blow up internally.

It does return failure, that is what breaks the driver because
it doesn't handle it.

> There's no reason the driver should have to deal with this on its
> own.

Even if swiotlb could handle it, other implementations of PCI-DMA
can not

> In this case the DMA mapping code should really be falling back to
> GFP_DMA automatically if the IOMMU aperture is outside the DMA mask
> of the device.

No, no -- you cannot allocate memory in DMA API. It's forbidden.
Some paths that use it cannot tolerate it.

-Andi

--
[email protected] -- Speaking for myself only


2011-02-01 21:44:43

by Robert Hancock

[permalink] [raw]
Subject: Re: b44 driver causes panic when using swiotlb

On Tue, Feb 1, 2011 at 12:07 PM, Andi Kleen <[email protected]> wrote:
> On Mon, Jan 31, 2011 at 06:54:21PM -0600, Robert Hancock wrote:
>> On 01/31/2011 10:36 AM, Andi Kleen wrote:
>> >On Mon, Jan 31, 2011 at 10:54:12AM -0500, Chuck Ebbert wrote:
>> >>The b44 driver is triggering this panic in swiotlb_map_page():
>> >>
>> >> ? ? ? ? if (!dma_capable(dev, dev_addr, size))
>> >> ? ? ? ? ? ? ? ? panic("map_single: bounce buffer is not DMA'ble");
>> >>
>> >>The kernel log says the bounce buffers are at 0xdb400000, but b44 can
>> >>only do DMA to the first 1GB of memory:
>> >
>> >b44 needs to use GFP_DMA then and do its own custom bouncing.
>> >The standard pci_map_* bounce buffering is only designed for at least
>> >32bit capable devices.
>>
>> That seems wrong - it's a documented API and that restriction isn'
>
> Please read the documentation. When PCI DMA cannot handle it
> it returns failure. That is what happened here.

Apparently not, given that it hit a panic inside the swiotlb code..