|
@@ -180,15 +180,21 @@ static inline int pgd_large(pgd_t pgd) { return 0; }
|
|
/*
|
|
/*
|
|
* Encode and de-code a swap entry
|
|
* Encode and de-code a swap entry
|
|
*
|
|
*
|
|
- * | ... | 11| 10| 9|8|7|6|5| 4| 3|2|1|0| <- bit number
|
|
|
|
- * | ... |SW3|SW2|SW1|G|L|D|A|CD|WT|U|W|P| <- bit names
|
|
|
|
- * | OFFSET (14->63) | TYPE (9-13) |0|X|X|X| X| X|X|X|0| <- swp entry
|
|
|
|
|
|
+ * | ... | 11| 10| 9|8|7|6|5| 4| 3|2| 1|0| <- bit number
|
|
|
|
+ * | ... |SW3|SW2|SW1|G|L|D|A|CD|WT|U| W|P| <- bit names
|
|
|
|
+ * | OFFSET (14->63) | TYPE (9-13) |0|0|X|X| X| X|X|SD|0| <- swp entry
|
|
*
|
|
*
|
|
* G (8) is aliased and used as a PROT_NONE indicator for
|
|
* G (8) is aliased and used as a PROT_NONE indicator for
|
|
* !present ptes. We need to start storing swap entries above
|
|
* !present ptes. We need to start storing swap entries above
|
|
* there. We also need to avoid using A and D because of an
|
|
* there. We also need to avoid using A and D because of an
|
|
* erratum where they can be incorrectly set by hardware on
|
|
* erratum where they can be incorrectly set by hardware on
|
|
* non-present PTEs.
|
|
* non-present PTEs.
|
|
|
|
+ *
|
|
|
|
+ * SD (1) in swp entry is used to store soft dirty bit, which helps us
|
|
|
|
+ * remember soft dirty over page migration
|
|
|
|
+ *
|
|
|
|
+ * Bit 7 in swp entry should be 0 because pmd_present checks not only P,
|
|
|
|
+ * but also L and G.
|
|
*/
|
|
*/
|
|
#define SWP_TYPE_FIRST_BIT (_PAGE_BIT_PROTNONE + 1)
|
|
#define SWP_TYPE_FIRST_BIT (_PAGE_BIT_PROTNONE + 1)
|
|
#define SWP_TYPE_BITS 5
|
|
#define SWP_TYPE_BITS 5
|