[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20190226103450.GA2989@redhat.com>
Date: Tue, 26 Feb 2019 11:34:51 +0100
From: Stanislaw Gruszka <sgruszka@...hat.com>
To: Joerg Roedel <joro@...tes.org>
Cc: Lorenzo Bianconi <lorenzo.bianconi@...hat.com>,
Rosen Penev <rosenp@...il.com>,
linux-wireless <linux-wireless@...r.kernel.org>,
Samuel Sieb <samuel@...b.net>,
Alexander Duyck <alexander.h.duyck@...ux.intel.com>,
iommu@...ts.linux-foundation.org, linux-kernel@...r.kernel.org
Subject: Re: MT76x2U crashes XHCI driver on AMD Ryzen system
On Tue, Feb 26, 2019 at 11:05:36AM +0100, Joerg Roedel wrote:
> On Mon, Feb 18, 2019 at 03:37:48PM +0100, Stanislaw Gruszka wrote:
> > 0001-mt76x02u-use-usb_bulk_msg-to-upload-firmware.patch
> > 0002-mt76usb-do-not-use-compound-head-page-for-SG-I-O.patch
> >
> > Or problem can be solved by just one of it (either first or second).
> >
> > Additionally I'm not 100% sure if
> >
> > 0002-mt76usb-do-not-use-compound-head-page-for-SG-I-O.patch
> >
> > is correct. So perhaps some IOMMU maintainer could look at it.
>
> The patch looks good, but I don't understand why it is needed. The AMD
> IOMMU driver should handle sg->offset > PAGE_SIZE just fine. Can you
> verify that this is the problem? I will look into that again if it turns
> out there is bug in the IOMMU driver.
I'm try to get that information from bug reporter, but I can't get it so
far.
If sg->offset > PAGE_SIZE is fine then most likely we have problem with
alignment. We use page_frag_alloc() in mt76usb for buffer allocation
in scheme like this
page_frag_alloc(max_payload); // something like 14434
page_frag_alloc(1024);
page_frag_alloc(2048)
page_frag_alloc(2048)
page_frag_alloc(2048)
...
page_frag_alloc works smart and fast way internally by allocating
fragments just but changing internal offset:
offset = nc->offset - fragsz;
if (unlikely(offset < 0)) {
page = virt_to_page(nc->va);
.
.
.
}
nc->offset = offset;
return nc->va + offset;
but unlike other allocators like kmalloc that make effort to provide
ARCH_DMA_MINALIGN buffers, it does not care about alignment. Above
scheme of allocation in mt76usb breaks it.
Note hat issue is with dma_map_sg(), switching to dma_map_single()
by using urb->transfer_buffer instead of urb->sg make things work
on AMD IOMMU.
Stanislaw
Powered by blists - more mailing lists