On Wed, Oct 20, 2004 at 01:56:02AM -0400, Jes Sorensen wrote:
> Ralf> On Mon, Oct 18, 2004 at 04:44:17AM -0400, Jes Sorensen wrote:
> >> Dual address cycles, ie. 64 bit addressing is fscked on the 1250
> >> from what I remember. Correct way to work around this is to stick
> >> all physical memory outside the 32 bit space into ZONE_HIGHMEM -
> >> had a patch for 2.4, but I lost it ages ago ;-(
> Ralf> The Momentum Jaguar suffers from similar problems, so I've
> Ralf> implemented that for Linux 2.6 as CONFIG_LIMITED_DMA.
> Wouldn't it be better to always have the highmem zone configured and
> then just fill it up with pages if you have a b0rked platform?
On these platform I enable CONFIG_HIGHMEM and because they don't support
real highmem in sense of requiring other mappings than KSEG0 for access
by the processor I replace kmap() etc. with the non-highmem variants
from <linux/highmem.h>. Filling in page->virtual on startup and defining
WANT_PAGE_VIRTUAL makes sure the mapping overhead stays low. An ugly
solution but probably the only one acceptable upstream and fortunately
there are now nicer variants of the architecture available that don't
need such tricks.
> The cost of this is miniscule.
I wish it was. The kernel has this preference for ZONE_NORMAL over
ZONE_HIGHMEM but on this particular platform ZONE_HIGHMEM with it's
memory controller integrated into the CPU itself provides better performance
than ZONE_NORMAL which resides in memory controller that's separate from
the processor in an external system controller.
If further optimizations to were of interest I'd probably try to play a
bit with build_zonelists_node() ...