WT memory type on x86_64?

From: Andy Lutomirski
Date: Wed Apr 24 2013 - 15:34:02 EST


For an upcoming (and, sadly, NDA'd [1]) project, I may need to use
write-through memory. I'd like to gauge how unpleasant this will be.

AFAICT, modern CPUs allow the WT type to be set using MTRR or a PAT
entry. Sadly, MTRRs are in short supply, and the four fully-usable
PAT slots are used for UC, UC-, WB, and WC. I can keep my fingers
crossed and hope that there are enough free MTRRs, or I could try to
free up a PAT entry.

How nasty will the latter be? I just looked at two rather different
modern Sandy Bridge machines, and BIOS doesn't appear to set up any
MTRRs in the WC or WP states. As long as those MTRR types aren't
used, I think the UC- PAT entry is useless -- it behaves identically
to UC. Lots of DRM drivers, though, seen to add a WC MTRR to cover
video memory. Is there any need for this on modern machines? That
is, are there any drivers that actually need the mtrr_add call to
succeed on a machine that has a working PAT?

If not, then here's a proposal: At startup, if there are no WC or WP
MTRRs and the CPU is new enough, then set a flag for an alternative
PAT. In alternative PAT mode, UC- is replaced with WT in the PAT and
mtrr_add fails when attempting to add a WC or WP entry. Add
set_memory_wt, etc. They fail in non-alternative-PAT mode. This gets
a bit unpleasant, since _PAGE_CACHE_UC_MINUS will have a different
meaning depending on the mode.

A less conservative proposal would be to stop using UC- in the PAT
entirely. The memtype code could learn to emulate UC- when there's an
overlapping WC or WP MTRR.

Any thoughts? Are there known errata here? Is there a good reason
why the kernel needs UC-? Will this be such a big can of worms that I
should just hope there's an available MTRR?

--Andy

[1] I hope to be able to upstream all kernel code related to this
project. It will be neat -- I promise. It will depend on convincing
the people on the other end of the NDA that they should let me.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/