|
@@ -115,6 +115,8 @@ static inline void pgd_list_del(pgd_t *pgd)
|
|
|
|
|
|
#define UNSHARED_PTRS_PER_PGD \
|
|
|
(SHARED_KERNEL_PMD ? KERNEL_PGD_BOUNDARY : PTRS_PER_PGD)
|
|
|
+#define MAX_UNSHARED_PTRS_PER_PGD \
|
|
|
+ max_t(size_t, KERNEL_PGD_BOUNDARY, PTRS_PER_PGD)
|
|
|
|
|
|
|
|
|
static void pgd_set_mm(pgd_t *pgd, struct mm_struct *mm)
|
|
@@ -181,6 +183,7 @@ static void pgd_dtor(pgd_t *pgd)
|
|
|
* and initialize the kernel pmds here.
|
|
|
*/
|
|
|
#define PREALLOCATED_PMDS UNSHARED_PTRS_PER_PGD
|
|
|
+#define MAX_PREALLOCATED_PMDS MAX_UNSHARED_PTRS_PER_PGD
|
|
|
|
|
|
/*
|
|
|
* We allocate separate PMDs for the kernel part of the user page-table
|
|
@@ -189,6 +192,7 @@ static void pgd_dtor(pgd_t *pgd)
|
|
|
*/
|
|
|
#define PREALLOCATED_USER_PMDS (static_cpu_has(X86_FEATURE_PTI) ? \
|
|
|
KERNEL_PGD_PTRS : 0)
|
|
|
+#define MAX_PREALLOCATED_USER_PMDS KERNEL_PGD_PTRS
|
|
|
|
|
|
void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd)
|
|
|
{
|
|
@@ -210,7 +214,9 @@ void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd)
|
|
|
|
|
|
/* No need to prepopulate any pagetable entries in non-PAE modes. */
|
|
|
#define PREALLOCATED_PMDS 0
|
|
|
+#define MAX_PREALLOCATED_PMDS 0
|
|
|
#define PREALLOCATED_USER_PMDS 0
|
|
|
+#define MAX_PREALLOCATED_USER_PMDS 0
|
|
|
#endif /* CONFIG_X86_PAE */
|
|
|
|
|
|
static void free_pmds(struct mm_struct *mm, pmd_t *pmds[], int count)
|
|
@@ -428,8 +434,8 @@ static inline void _pgd_free(pgd_t *pgd)
|
|
|
pgd_t *pgd_alloc(struct mm_struct *mm)
|
|
|
{
|
|
|
pgd_t *pgd;
|
|
|
- pmd_t *u_pmds[PREALLOCATED_USER_PMDS];
|
|
|
- pmd_t *pmds[PREALLOCATED_PMDS];
|
|
|
+ pmd_t *u_pmds[MAX_PREALLOCATED_USER_PMDS];
|
|
|
+ pmd_t *pmds[MAX_PREALLOCATED_PMDS];
|
|
|
|
|
|
pgd = _pgd_alloc();
|
|
|
|