From: Alan Stern <stern@rowland.harvard.edu>
To: Daniel Mack <daniel@caiaq.de>
Cc: linux-kernel@vger.kernel.org, Pedro Ribeiro <pedrib@gmail.com>,
akpm@linux-foundation.org, Greg KH <gregkh@suse.de>,
alsa-devel@alsa-project.org, linux-usb@vger.kernel.org
Subject: Re: USB transfer_buffer allocations on 64bit systems
Date: Wed, 7 Apr 2010 11:46:17 -0400 (EDT) [thread overview]
Message-ID: <Pine.LNX.4.44L0.1004071120200.1779-100000@iolanthe.rowland.org> (raw)
In-Reply-To: <20100407151125.GJ30801@buzzloop.caiaq.de>
On Wed, 7 Apr 2010, Daniel Mack wrote:
> > > The fix is to use usb_buffer_alloc() for that purpose which ensures
> > > memory that is suitable for DMA. And on x86_64, this also means that the
> > > upper 32 bits of the address returned are all 0's.
> >
> > That is not a good fix. usb_buffer_alloc() provides coherent memory,
> > which is not what we want. I believe the correct fix is to specify the
> > GFP_DMA32 flag in the kzalloc() call.
> >
> > Of course, some EHCI hardware _is_ capable of using 64-bit addresses.
> > But not all, and other controller types aren't. In principle we could
> > create a new allocation routine, which would take a pointer to the USB
> > bus as an additional argument and use it to decide whether the memory
> > needs to lie below 4 GB. I'm not sure adding this extra complexity
> > would be worthwhile.
>
> Well, I thought this is exactly what the usb_buffer_alloc() abstraction
> functions are there for. We already pass a pointer to a struct
> usb_device, so the routine knows which host controller it operates on.
> So we can safely dispatch all the magic inside this function, no?
No. It says so right in the title line of the kerneldoc:
* usb_buffer_alloc - allocate dma-consistent buffer for URB_NO_xxx_DMA_MAP
That is not what people want when they call kzalloc or kmalloc.
> If not, I would rather introduce a new function than adding GFP_ flags
> to all existing drivers.
All right. But there would have to be _two_ new functions: one acting
like kmalloc and another acting like kzalloc. I guess they should take
a pointer to struct usb_device as an argument, like usb_buffer_alloc.
> I vote for a clean solution, a fixup of existing implementations and
> a clear note about how to allocate buffers for USB drivers. I believe
> faulty allocations of this kind can explain quite a lot of problems on
> x86_64 machines.
There is one awkward aspect of usb_buffer_alloc which perhaps could
be fixed at the same time. Under some conditions (for example, if the
controller needs to use internal bounce buffers) it will return
ordinary memory obtained using kmalloc rather than consistent memory.
But it doesn't tell the caller when it has done so, and consequently
the caller will always specify URB_NO_TRANSFER_DMA_MAP when using the
buffer. The proper flag to use should be returned to the caller.
Or alternatively, instead of allocating regular memory the routine
could simply fail. Then the caller would be responsible for checking
and using regular memory instead of dma-consistent memory. Of course,
that would put an even larger burden on the caller than just forcing it
to keep track of what flag to use.
> > > If what I've stated is true, there are quite some more drivers affected
> > > by this issue.
> >
> > Practically every USB driver, I should think. And maybe a lot of
> > non-USB drivers too.
>
> I found many such problems in drivers/media/{dvb,video},
> drivers/usb/serial, sound/usb and even in the USB core. If we agree on
> how to fix that nicely, I can take some of them.
I guess we could rename usb_buffer_alloc(). A more accurate name would
be something like usb_alloc_consistent() (except for the fact that
the routine falls back to regular memory if the controller can't use
consistent memory.) Then we could have usb_malloc() and usb_zalloc()
in addition.
Alan Stern
next prev parent reply other threads:[~2010-04-07 15:46 UTC|newest]
Thread overview: 95+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-04-07 9:06 USB transfer_buffer allocations on 64bit systems Daniel Mack
[not found] ` <p2g581ef6d61004070220z1153d40ez955b356e01220848@mail.gmail.com>
2010-04-07 9:26 ` USB HID gadget driver (was: Re: USB transfer_buffer allocations on 64bit systems) Daniel Mack
2010-04-07 14:59 ` USB transfer_buffer allocations on 64bit systems Alan Stern
2010-04-07 15:11 ` Daniel Mack
2010-04-07 15:31 ` Greg KH
2010-04-07 15:35 ` Daniel Mack
2010-04-07 15:51 ` Greg KH
[not found] ` <20100407155122.GA13974-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2010-04-07 16:04 ` Alan Stern
2010-04-08 6:09 ` Oliver Neukum
[not found] ` <201004080809.11756.oliver-GvhC2dPhHPQdnm+yROfE0A@public.gmane.org>
2010-04-08 11:07 ` Daniel Mack
2010-04-07 15:55 ` Alan Stern
2010-04-07 16:16 ` Daniel Mack
2010-04-07 16:47 ` Alan Stern
2010-04-07 17:55 ` Takashi Iwai
2010-04-07 17:59 ` Daniel Mack
2010-04-07 18:06 ` Takashi Iwai
2010-04-07 19:13 ` Alan Stern
2010-04-08 0:33 ` Greg KH
2010-04-09 0:01 ` Robert Hancock
[not found] ` <4BBE6E57.6020600-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2010-04-09 16:50 ` Sarah Sharp
2010-04-09 23:38 ` Robert Hancock
2010-04-10 8:34 ` Daniel Mack
2010-04-10 17:02 ` [alsa-devel] " Robert Hancock
2010-04-12 18:56 ` Sarah Sharp
2010-04-12 20:39 ` Robert Hancock
2010-04-12 20:58 ` Sarah Sharp
[not found] ` <Pine.LNX.4.44L0.1004071452560.5760-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2010-04-07 23:59 ` Robert Hancock
2010-04-12 11:17 ` [PATCH] USB: rename usb_buffer_alloc() and usb_buffer_free() Daniel Mack
[not found] ` <1271071045-3112-1-git-send-email-daniel-rDUAYElUppE@public.gmane.org>
2010-04-13 18:16 ` Daniel Mack
[not found] ` <20100413181631.GT30801-ahpEBR4enfnCULTFXS99ULNAH6kLmebB@public.gmane.org>
2010-04-13 19:27 ` Alan Stern
2010-04-13 20:26 ` Greg KH
2010-04-13 21:47 ` Daniel Mack
2010-04-07 17:52 ` USB transfer_buffer allocations on 64bit systems Takashi Iwai
2010-04-07 15:46 ` Alan Stern [this message]
2010-04-08 6:12 ` Oliver Neukum
[not found] ` <201004080812.04419.oliver-GvhC2dPhHPQdnm+yROfE0A@public.gmane.org>
2010-04-08 16:59 ` Alan Stern
2010-04-08 21:24 ` Oliver Neukum
2010-04-08 22:20 ` Alan Stern
2010-04-09 6:04 ` Oliver Neukum
[not found] ` <201004090804.36213.oliver-GvhC2dPhHPQdnm+yROfE0A@public.gmane.org>
2010-04-09 14:41 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1004091033150.1852-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2010-04-09 14:50 ` Oliver Neukum
[not found] ` <201004091650.31488.oliver-GvhC2dPhHPQdnm+yROfE0A@public.gmane.org>
2010-04-09 15:15 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1004091114500.1852-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2010-04-09 20:51 ` Oliver Neukum
2010-04-09 21:21 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1004071036060.1779-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2010-04-07 16:54 ` Oliver Neukum
[not found] ` <201004071854.55530.oliver-GvhC2dPhHPQdnm+yROfE0A@public.gmane.org>
2010-04-07 17:00 ` Daniel Mack
2010-04-07 23:55 ` Robert Hancock
[not found] ` <4BBD1B6F.3000205-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2010-04-08 2:10 ` Alan Stern
2010-04-08 7:30 ` Daniel Mack
[not found] ` <20100408073041.GO30801-ahpEBR4enfnCULTFXS99ULNAH6kLmebB@public.gmane.org>
2010-04-08 16:57 ` Alan Stern
2010-04-08 17:17 ` Pedro Ribeiro
[not found] ` <Pine.LNX.4.44L0.1004081245330.1720-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2010-04-08 23:13 ` Pedro Ribeiro
2010-04-09 16:01 ` Alan Stern
2010-04-09 18:09 ` Daniel Mack
[not found] ` <20100409180942.GK30801-ahpEBR4enfnCULTFXS99ULNAH6kLmebB@public.gmane.org>
2010-04-09 18:19 ` Pedro Ribeiro
[not found] ` <w2r74fd948d1004091119j9f33d8a6kc1824d9243abf38b-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-04-09 19:34 ` Alan Stern
2010-04-09 20:14 ` Daniel Mack
[not found] ` <Pine.LNX.4.44L0.1004091529240.1852-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2010-04-09 20:25 ` [LKML] " Konrad Rzeszutek Wilk
[not found] ` <20100409202533.GA8983-6K5HmflnPlqSPmnEAIUT9EEOCMrvLtNR@public.gmane.org>
2010-04-09 21:23 ` Alan Stern
2010-04-09 22:11 ` Robert Hancock
2010-04-12 10:48 ` Daniel Mack
2010-04-12 12:06 ` Pedro Ribeiro
2010-04-10 12:49 ` Daniel Mack
[not found] ` <20100410124912.GP30801-ahpEBR4enfnCULTFXS99ULNAH6kLmebB@public.gmane.org>
2010-04-10 13:21 ` Pedro Ribeiro
2010-04-12 8:59 ` Andi Kleen
2010-04-12 11:14 ` Daniel Mack
[not found] ` <20100412111439.GU30801-ahpEBR4enfnCULTFXS99ULNAH6kLmebB@public.gmane.org>
2010-04-12 11:53 ` Andi Kleen
2010-04-12 12:11 ` Pedro Ribeiro
[not found] ` <q2z74fd948d1004120511hebf19eaauc41ee9ed25dea19e-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-04-12 12:12 ` Andi Kleen
2010-04-12 12:32 ` Daniel Mack
2010-04-12 12:47 ` Andi Kleen
2010-04-12 12:54 ` Daniel Mack
2010-04-12 15:43 ` Andi Kleen
[not found] ` <20100412154323.GP18855-qrUzlfsMFqo/4alezvVtWx2eb7JE58TQ@public.gmane.org>
2010-04-12 16:17 ` Alan Stern
2010-04-12 16:29 ` Andi Kleen
2010-04-12 16:57 ` Alan Stern
2010-04-12 17:15 ` Daniel Mack
[not found] ` <20100412171507.GB30801-ahpEBR4enfnCULTFXS99ULNAH6kLmebB@public.gmane.org>
2010-04-12 17:22 ` Andi Kleen
2010-04-12 17:56 ` Daniel Mack
2010-04-12 17:52 ` [LKML] " Konrad Rzeszutek Wilk
2010-04-13 18:22 ` Daniel Mack
[not found] ` <20100413182233.GR30807-ahpEBR4enfnCULTFXS99ULNAH6kLmebB@public.gmane.org>
2010-04-13 23:46 ` Pedro Ribeiro
2010-04-14 10:09 ` Daniel Mack
2010-04-14 10:47 ` Pedro Ribeiro
2010-04-14 11:02 ` Pedro Ribeiro
2010-04-14 13:18 ` [LKML] " Konrad Rzeszutek Wilk
[not found] ` <t2w74fd948d1004140347k3447bffapb73856eacddfde55-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-04-14 14:08 ` Alan Stern
2010-04-14 16:36 ` Daniel Mack
[not found] ` <20100414163637.GV30807-ahpEBR4enfnCULTFXS99ULNAH6kLmebB@public.gmane.org>
2010-04-14 17:21 ` Pedro Ribeiro
2010-04-15 7:35 ` Daniel Mack
[not found] <g2h74fd948d1004141820ladc1941eo732d059dd678df0a@mail.gmail.com>
[not found] ` <Pine.LNX.4.44L0.1004151114490.1562-100000@iolanthe.rowland.org>
[not found] ` <t2r74fd948d1004191716l49dedc2p25a27da39bcc614a@mail.gmail.com>
2010-05-07 7:48 ` Daniel Mack
2010-05-07 9:47 ` Clemens Ladisch
2010-05-07 10:24 ` Daniel Mack
2010-05-07 14:51 ` [alsa-devel] " Alan Stern
2010-05-10 2:50 ` FUJITA Tomonori
2010-05-10 9:21 ` David Woodhouse
2010-05-07 11:42 ` [alsa-devel] " Oliver Neukum
2010-05-07 11:47 ` Oliver Neukum
2010-05-07 11:58 ` Daniel Mack
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Pine.LNX.4.44L0.1004071120200.1779-100000@iolanthe.rowland.org \
--to=stern@rowland.harvard.edu \
--cc=akpm@linux-foundation.org \
--cc=alsa-devel@alsa-project.org \
--cc=daniel@caiaq.de \
--cc=gregkh@suse.de \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=pedrib@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).