diff options
author | Zachary Amsden <zach@vmware.com> | 2007-05-02 13:27:19 -0400 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2007-05-02 13:27:19 -0400 |
commit | 9e5e3162b2d5e4466187ecd63c9eec2de33cb7bc (patch) | |
tree | e0d9231574833f17b509bc2ca1971af90f657eb2 /include/asm-i386/pgtable.h | |
parent | 142dd975911fdd82b1b6f6617cd20ac90a8ccf00 (diff) |
[PATCH] i386: pte simplify ops
Add comment and condense code to make use of native_local_ptep_get_and_clear
function. Also, it turns out the 2-level and 3-level paging definitions were
identical, so move the common definition into pgtable.h
Signed-off-by: Zachary Amsden <zach@vmware.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Andi Kleen <ak@suse.de>
Diffstat (limited to 'include/asm-i386/pgtable.h')
-rw-r--r-- | include/asm-i386/pgtable.h | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/include/asm-i386/pgtable.h b/include/asm-i386/pgtable.h index 00e97a9d367e..c6b8b944120c 100644 --- a/include/asm-i386/pgtable.h +++ b/include/asm-i386/pgtable.h | |||
@@ -269,6 +269,16 @@ extern void vmalloc_sync_all(void); | |||
269 | #define pte_update_defer(mm, addr, ptep) do { } while (0) | 269 | #define pte_update_defer(mm, addr, ptep) do { } while (0) |
270 | #endif | 270 | #endif |
271 | 271 | ||
272 | /* local pte updates need not use xchg for locking */ | ||
273 | static inline pte_t native_local_ptep_get_and_clear(pte_t *ptep) | ||
274 | { | ||
275 | pte_t res = *ptep; | ||
276 | |||
277 | /* Pure native function needs no input for mm, addr */ | ||
278 | native_pte_clear(NULL, 0, ptep); | ||
279 | return res; | ||
280 | } | ||
281 | |||
272 | /* | 282 | /* |
273 | * We only update the dirty/accessed state if we set | 283 | * We only update the dirty/accessed state if we set |
274 | * the dirty bit by hand in the kernel, since the hardware | 284 | * the dirty bit by hand in the kernel, since the hardware |
@@ -343,8 +353,11 @@ static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, unsigned long | |||
343 | { | 353 | { |
344 | pte_t pte; | 354 | pte_t pte; |
345 | if (full) { | 355 | if (full) { |
346 | pte = *ptep; | 356 | /* |
347 | native_pte_clear(mm, addr, ptep); | 357 | * Full address destruction in progress; paravirt does not |
358 | * care about updates and native needs no locking | ||
359 | */ | ||
360 | pte = native_local_ptep_get_and_clear(ptep); | ||
348 | } else { | 361 | } else { |
349 | pte = ptep_get_and_clear(mm, addr, ptep); | 362 | pte = ptep_get_and_clear(mm, addr, ptep); |
350 | } | 363 | } |