>> pci_{,un}map_single, so they should work. I suspect all real non-PCI
>> USB controllers are either on a bus that can access all main memory or
>> are specific to an architecture that is known to allocate the kernel
>Wrong already. x86 with more than 4Gb of memory
linux-2.5.1-pre8/include/asm-i386/processor.h defines
alloc_task_struct to call __get_free_pages *without* __GFP_HIGHMEM
set. So, I believe the stack will always be allocated from pages
below 4GB.
>> [...] all architectures currently appear to support
>> [DMA from kernel stack] anyhow.
>I've seen no evidence of this. None at all.
You're asking me to prove a negative, which I can only do by
looking at the instances available (the PCI drivers and a statement
about a USB driver for SuperH) and ask for an example of a problem.
I've checked the PCI drivers; the SuperH device is apparently on the
processor core, so it is quite unlikely that it would be unable to
drive any of the high address lines. So, all I can do is invite
people to point out a real example and investigate. In practice, all
USB controllers seem to be implimentations of {O,U,E}HCI, which is
based on bus mastering rather than using a PC's DMA controller, and
the controllers are either PCI devices or are embedded on the CPU
or motherboard chipset.
>The DMA mapping document also says
>| This rule also means that you may not use kernel image addresses
>| (ie. items in the kernel's data/text/bss segment, or your driver's)
>| nor may you use kernel stack addresses for DMA. Both of these items
>| might be mapped somewhere entirely different than the rest of physical
>| memory.
The USB drivers do not DMA from those values directly. They
DMA from the result of pci_map_single, which is supposed to handle
that remapping on architectures that require it (and just returns the
address on the architectures where no remapping is required).
>> have the CPU read it. This requires pointing the USB controllers at
>> kernel read only data. For packets that have to be computed at run
[...]
>kernel read only data in a module is vmalloc space. Your data might even be
>split across two pages
Theoretically, pci_{,un}map_single's spec is that it should
handle this (presuamably by copying the data). In practice, I don't
want to incur the performance cost of pci_{,un}map_single thinking
about that.
I think the ways to avoid this are simple enough to make USB
transfers from kernel stack and data still worth doing, but thanks for
raising this interesting point which I had not thought of. For
example, since the problem that you suggest is also potentially
applicable to the kernel stack, it means that I would have to change
my patch to usb_control_cmd in drivers/usb/usb.c to ensure 8 byte
alignment, which may not be worth it, given that it is a routine that
I want to eliminate eventually. There are other cases (which currently
call usb_control_cmd), where I think I would want to still have the
performance benefit of using the stack rather than kmalloc/kfree.
Adam J. Richter __ ______________ 4880 Stevens Creek Blvd, Suite 104
[EMAIL PROTECTED] \ / San Jose, California 95129-1034
+1 408 261-6630 | g g d r a s i l United States of America
fax +1 408 261-6631 "Free Software For The Rest Of Us."
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel