Messages in this thread | | | Date | Thu, 2 Dec 1999 14:27:47 GMT | From | "Stephen C. Tweedie" <> | Subject | set_pte() is no longer atomic with PAE36. |
| |
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/
| |