set_pte() is no longer atomic with PAE36.

Stephen C. Tweedie (sct@redhat.com)
Thu, 2 Dec 1999 14:27:47 GMT


Hi,

Ingo, do we not have a bit of a problem with set_pte() on PAE36-enabled
builds now?

#define set_pte(pteptr, pteval) ((*(pteptr)) = (pteval))

would seem to be a problem: the 64-bit write is not atomic. When
setting an unused pte, we want the word containing the page present bit
to be the last word written. When clearing a pte, though, we need the
page present bit to be cleared before we invalidate the high order word,
otherwise we're in trouble if another cpu populates its tlb whilte the
pte is in an inconsistent (but valid, to the cpu) state.

Modifying an existing pte (eg. for COW) is probably even harder: do we
need to clear the page-present bit while we modify the high word?
Simply setting the dirty or accessed bits should pose no such problem,
but relocating a page looks as if it could bite here.

Basically, as long as we can assume that another cpu will only ever see
a pte with the page-present bit clear or a completely valid pte, all
should be fine. Or have I missed something fundamental?

--Stephen

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/