diff options
| author | Tejun Heo <tj@kernel.org> | 2009-08-14 01:41:02 -0400 |
|---|---|---|
| committer | Tejun Heo <tj@kernel.org> | 2009-08-14 01:45:31 -0400 |
| commit | 384be2b18a5f9475eab9ca2bdfa95cc1a04ef59c (patch) | |
| tree | 04c93f391a1b65c8bf8d7ba8643c07d26c26590a /arch/arm/include/asm/pgtable.h | |
| parent | a76761b621bcd8336065c4fe3a74f046858bc34c (diff) | |
| parent | 142d44b0dd6741a64a7bdbe029110e7c1dcf1d23 (diff) | |
Merge branch 'percpu-for-linus' into percpu-for-next
Conflicts:
arch/sparc/kernel/smp_64.c
arch/x86/kernel/cpu/perf_counter.c
arch/x86/kernel/setup_percpu.c
drivers/cpufreq/cpufreq_ondemand.c
mm/percpu.c
Conflicts in core and arch percpu codes are mostly from commit
ed78e1e078dd44249f88b1dd8c76dafb39567161 which substituted many
num_possible_cpus() with nr_cpu_ids. As for-next branch has moved all
the first chunk allocators into mm/percpu.c, the changes are moved
from arch code to mm/percpu.c.
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'arch/arm/include/asm/pgtable.h')
| -rw-r--r-- | arch/arm/include/asm/pgtable.h | 53 |
1 files changed, 39 insertions, 14 deletions
diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h index 1cd2d6416bda..c433c6c73112 100644 --- a/arch/arm/include/asm/pgtable.h +++ b/arch/arm/include/asm/pgtable.h | |||
| @@ -285,15 +285,6 @@ extern struct page *empty_zero_page; | |||
| 285 | #define pte_young(pte) (pte_val(pte) & L_PTE_YOUNG) | 285 | #define pte_young(pte) (pte_val(pte) & L_PTE_YOUNG) |
| 286 | #define pte_special(pte) (0) | 286 | #define pte_special(pte) (0) |
| 287 | 287 | ||
| 288 | /* | ||
| 289 | * The following only works if pte_present() is not true. | ||
| 290 | */ | ||
| 291 | #define pte_file(pte) (pte_val(pte) & L_PTE_FILE) | ||
| 292 | #define pte_to_pgoff(x) (pte_val(x) >> 2) | ||
| 293 | #define pgoff_to_pte(x) __pte(((x) << 2) | L_PTE_FILE) | ||
| 294 | |||
| 295 | #define PTE_FILE_MAX_BITS 30 | ||
| 296 | |||
| 297 | #define PTE_BIT_FUNC(fn,op) \ | 288 | #define PTE_BIT_FUNC(fn,op) \ |
| 298 | static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; } | 289 | static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; } |
| 299 | 290 | ||
| @@ -384,16 +375,50 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | |||
| 384 | 375 | ||
| 385 | extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; | 376 | extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; |
| 386 | 377 | ||
| 387 | /* Encode and decode a swap entry. | 378 | /* |
| 379 | * Encode and decode a swap entry. Swap entries are stored in the Linux | ||
| 380 | * page tables as follows: | ||
| 388 | * | 381 | * |
| 389 | * We support up to 32GB of swap on 4k machines | 382 | * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 |
| 383 | * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 | ||
| 384 | * <--------------- offset --------------------> <--- type --> 0 0 | ||
| 385 | * | ||
| 386 | * This gives us up to 127 swap files and 32GB per swap file. Note that | ||
| 387 | * the offset field is always non-zero. | ||
| 390 | */ | 388 | */ |
| 391 | #define __swp_type(x) (((x).val >> 2) & 0x7f) | 389 | #define __SWP_TYPE_SHIFT 2 |
| 392 | #define __swp_offset(x) ((x).val >> 9) | 390 | #define __SWP_TYPE_BITS 7 |
| 393 | #define __swp_entry(type,offset) ((swp_entry_t) { ((type) << 2) | ((offset) << 9) }) | 391 | #define __SWP_TYPE_MASK ((1 << __SWP_TYPE_BITS) - 1) |
| 392 | #define __SWP_OFFSET_SHIFT (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT) | ||
| 393 | |||
| 394 | #define __swp_type(x) (((x).val >> __SWP_TYPE_SHIFT) & __SWP_TYPE_MASK) | ||
| 395 | #define __swp_offset(x) ((x).val >> __SWP_OFFSET_SHIFT) | ||
| 396 | #define __swp_entry(type,offset) ((swp_entry_t) { ((type) << __SWP_TYPE_SHIFT) | ((offset) << __SWP_OFFSET_SHIFT) }) | ||
| 397 | |||
| 394 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) | 398 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) |
| 395 | #define __swp_entry_to_pte(swp) ((pte_t) { (swp).val }) | 399 | #define __swp_entry_to_pte(swp) ((pte_t) { (swp).val }) |
| 396 | 400 | ||
| 401 | /* | ||
| 402 | * It is an error for the kernel to have more swap files than we can | ||
| 403 | * encode in the PTEs. This ensures that we know when MAX_SWAPFILES | ||
| 404 | * is increased beyond what we presently support. | ||
| 405 | */ | ||
| 406 | #define MAX_SWAPFILES_CHECK() BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > __SWP_TYPE_BITS) | ||
| 407 | |||
| 408 | /* | ||
| 409 | * Encode and decode a file entry. File entries are stored in the Linux | ||
| 410 | * page tables as follows: | ||
| 411 | * | ||
| 412 | * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 | ||
| 413 | * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 | ||
| 414 | * <------------------------ offset -------------------------> 1 0 | ||
| 415 | */ | ||
| 416 | #define pte_file(pte) (pte_val(pte) & L_PTE_FILE) | ||
| 417 | #define pte_to_pgoff(x) (pte_val(x) >> 2) | ||
| 418 | #define pgoff_to_pte(x) __pte(((x) << 2) | L_PTE_FILE) | ||
| 419 | |||
| 420 | #define PTE_FILE_MAX_BITS 30 | ||
| 421 | |||
| 397 | /* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ | 422 | /* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ |
| 398 | /* FIXME: this is not correct */ | 423 | /* FIXME: this is not correct */ |
| 399 | #define kern_addr_valid(addr) (1) | 424 | #define kern_addr_valid(addr) (1) |
