Re: [PATCH] i386: PAE entries must have their low word cleared first

From: Hugh Dickins
Date: Wed Apr 26 2006 - 10:46:55 EST


On Wed, 26 Apr 2006, Jan Beulich wrote:

> During Xen development we noticed that writes to 64-bit variables may get
> coded as high-word-before-low-word writes by gcc. Consequently, when
> invalidating a PAE page table entry, the low word must be explicitly written
> first, as otherwise, as pointed out by Keir, speculative execution may result
> in a partially modified (and still valid) translation to be used, which has,
> according to the specification, the potential of dead-locking the machine.

If that's so (I don't trust my judgement on matters of speculative
execution), then I think you'd do better to replace the *ptep = __pte(0)
by pte_clear(mm, addr, ptep), and so avoid your ugly #ifdef'ing: please
check, but I think you'll find that reduces to just the barrier you want.
CC'ed Zach since it's his optimization, and he'll judge that spexecution.

Hugh

> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
> Cc: Keir Fraser <Keir.Fraser@xxxxxxxxxxxx>
>
> diff -Npru /home/jbeulich/tmp/linux-2.6.17-rc2/include/asm-i386/pgtable.h
> 2.6.17-rc2-i386-pae-ptep_get_and_clear_full/include/asm-i386/pgtable.h
> --- /home/jbeulich/tmp/linux-2.6.17-rc2/include/asm-i386/pgtable.h 2006-04-26 10:56:03.000000000 +0200
> +++ 2.6.17-rc2-i386-pae-ptep_get_and_clear_full/include/asm-i386/pgtable.h 2006-04-24 12:28:37.000000000 +0200
> @@ -268,7 +268,15 @@ static inline pte_t ptep_get_and_clear_f
> pte_t pte;
> if (full) {
> pte = *ptep;
> +#ifdef CONFIG_X86_PAE
> + /* Cannot do this in a single step, as the compiler
> + may issue the two stores in either order. */
> + ptep->pte_low = 0;
> + barrier();
> + ptep->pte_high = 0;
> +#else
> *ptep = __pte(0);
> +#endif
> } else {
> pte = ptep_get_and_clear(mm, addr, ptep);
> }
>
>
> -
> 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/
>
-
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/