| From: David Hildenbrand <david@redhat.com> |
| Subject: nios2/mm: refactor swap PTE layout |
| Date: Fri, 13 Jan 2023 18:10:13 +0100 |
| |
| nios2 disables swap for a good reason: it doesn't even provide sufficient |
| type bits as required by core MM. However, swap entries are nowadays also |
| used for other purposes (migration entries, PTE markers, HWPoison, ...), |
| and accidential use could be problematic. |
| |
| Let's properly use 5 bits for the swap type and document the layout. Bits |
| 26--31 should get ignored by hardware completely, so they can be used. |
| |
| Link: https://lkml.kernel.org/r/20230113171026.582290-14-david@redhat.com |
| Signed-off-by: David Hildenbrand <david@redhat.com> |
| Cc: Dinh Nguyen <dinguyen@kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| |
| --- a/arch/nios2/include/asm/pgtable.h~nios2-mm-refactor-swap-pte-layout |
| +++ a/arch/nios2/include/asm/pgtable.h |
| @@ -232,19 +232,21 @@ static inline unsigned long pmd_page_vad |
| __FILE__, __LINE__, pgd_val(e)) |
| |
| /* |
| - * Encode and decode a swap entry (must be !pte_none(pte) && !pte_present(pte): |
| + * Encode/decode swap entries and swap PTEs. Swap PTEs are all PTEs that |
| + * are !pte_none() && !pte_present(). |
| * |
| - * 31 30 29 28 27 26 25 24 23 22 21 20 19 18 ... 1 0 |
| - * 0 0 0 0 type. 0 0 0 0 0 0 offset......... |
| + * Format of swap PTEs: |
| * |
| - * This gives us up to 2**2 = 4 swap files and 2**20 * 4K = 4G per swap file. |
| + * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 |
| + * 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 |
| + * 0 < type -> 0 0 0 0 0 0 <-------------- offset ---------------> |
| * |
| - * Note that the offset field is always non-zero, thus !pte_none(pte) is always |
| - * true. |
| + * Note that the offset field is always non-zero if the swap type is 0, thus |
| + * !pte_none() is always true. |
| */ |
| -#define __swp_type(swp) (((swp).val >> 26) & 0x3) |
| +#define __swp_type(swp) (((swp).val >> 26) & 0x1f) |
| #define __swp_offset(swp) ((swp).val & 0xfffff) |
| -#define __swp_entry(type, off) ((swp_entry_t) { (((type) & 0x3) << 26) \ |
| +#define __swp_entry(type, off) ((swp_entry_t) { (((type) & 0x1f) << 26) \ |
| | ((off) & 0xfffff) }) |
| #define __swp_entry_to_pte(swp) ((pte_t) { (swp).val }) |
| #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) |
| _ |