Re: [git pull] x86 fixes

Ingo Molnar
2009-01-12T20:53:30Z

* Linus Torvalds <torvalds@linux-foundation.org> wrote:

>
>
> On Mon, 12 Jan 2009, Pallipadi, Venkatesh wrote:
> > + if (strict_prot ||
> > + (want_flags == _PAGE_CACHE_UC_MINUS &&
> > + flags == _PAGE_CACHE_WB) ||
> > + (want_flags == _PAGE_CACHE_WC &&
> > + flags == _PAGE_CACHE_WB)) {
>
> Please don't write code like this.
>
> Do it as an inline function that returns true/false and has comments on
> what the hell is going on.

I have asked Venki to do a minimal 'combo' patch that isolates just the
functional changes. (it is otherwise identical to Venki's PAT changes.)

The reason why we wanted to re-test the functional changes was that
Torsten's crash looks very weird: double Call Trace line, a crash in the
scsi/ata code, showing the after-effects of some sort of memory corruption
there.

Connection to the x86-fixes patchset did not seem impossible [a theory
would be: cache aliasing problems causing memory corruption], but
nevertheless it was all quite weird. So we wanted an isolated repeat test
for just the functional changes.

The 7 patches lined up for you (but quarantined from x86/urgent for now,
until the crash Torsten got is investigated) introduce the above condition
cleanly, as:

+static inline int is_new_memtype_allowed(unsigned long flags,
+ unsigned long new_flags)
+{
+ /*
+ * Certain new memtypes are not allowed with certain
+ * requested memtype:
+ * - request is uncached, return cannot be write-back
+ * - request is write-combine, return cannot be write-back
+ */
+ if ((flags == _PAGE_CACHE_UC_MINUS &&
+ new_flags == _PAGE_CACHE_WB) ||
+ (flags == _PAGE_CACHE_WC &&
+ new_flags == _PAGE_CACHE_WB)) {
+ return 0;
+ }
+
+ return 1;
+}

Ingo