Poking-mm initialization might require to duplicate the PGD in early stage. Initialize the PGD cache earlier to prevent boot failures.
Unified · Split
| @@ -373,14 +373,14 @@ static void pgd_prepopulate_user_pmd(struct mm_struct *mm, · 372 unmodified lines | ||
| 373 | 373 | |
| 374 | 374 | static struct kmem_cache *pgd_cache; |
| 375 | 375 | |
| 376 | −static int __init pgd_cache_init(void) | |
| 376 | +void __init pgd_cache_init(void) | |
| 377 | 377 | { |
| 378 | 378 | /* |
| 379 | 379 | * When PAE kernel is running as a Xen domain, it does not use |
| 380 | 380 | * shared kernel pmd. And this requires a whole page for pgd. |
| 381 | 381 | */ |
| 382 | 382 | if (!SHARED_KERNEL_PMD) |
| 383 | − return 0; | |
| 383 | + return; | |
| 384 | 384 | |
| 385 | 385 | /* |
| 386 | 386 | * when PAE kernel is not running as a Xen domain, it uses |
| @@ -390,9 +390,7 @@ static int __init pgd_cache_init(void) · 3 unmodified lines | ||
| 390 | 390 | */ |
| 391 | 391 | pgd_cache = kmem_cache_create("pgd_cache", PGD_SIZE, PGD_ALIGN, |
| 392 | 392 | SLAB_PANIC, NULL); |
| 393 | − return 0; | |
| 394 | 393 | } |
| 395 | −core_initcall(pgd_cache_init); | |
| 396 | 394 | |
| 397 | 395 | static inline pgd_t *_pgd_alloc(void) |
| 398 | 396 | { |
| @@ -420,6 +418,10 @@ static inline void _pgd_free(pgd_t *pgd) · 21 unmodified lines | ||
| 420 | 418 | } |
| 421 | 419 | #else |
| 422 | 420 | |
| 421 | +void __init pgd_cache_init(void) | |
| 422 | +{ | |
| 423 | +} | |
| 424 | + | |
| 423 | 425 | static inline pgd_t *_pgd_alloc(void) |
| 424 | 426 | { |
| 425 | 427 | return (pgd_t *)__get_free_pages(PGALLOC_GFP, PGD_ALLOCATION_ORDER); |
| @@ -1126,6 +1126,8 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn, · 1125 unmodified lines | ||
| 1126 | 1126 | static inline void init_espfix_bsp(void) { } |
| 1127 | 1127 | #endif |
| 1128 | 1128 | |
| 1129 | +extern void __init pgd_cache_init(void); | |
| 1130 | + | |
| 1129 | 1131 | #ifndef __HAVE_ARCH_PFN_MODIFY_ALLOWED |
| 1130 | 1132 | static inline bool pfn_modify_allowed(unsigned long pfn, pgprot_t prot) |
| 1131 | 1133 | { |
| @@ -506,6 +506,8 @@ void __init __weak mem_encrypt_init(void) { } · 505 unmodified lines | ||
| 506 | 506 | |
| 507 | 507 | void __init __weak poking_init(void) { } |
| 508 | 508 | |
| 509 | +void __init __weak pgd_cache_init(void) { } | |
| 510 | + | |
| 509 | 511 | bool initcall_debug; |
| 510 | 512 | core_param(initcall_debug, initcall_debug, bool, 0644); |
| 511 | 513 | |
| @@ -537,6 +539,7 @@ static void __init mm_init(void) · 25 unmodified lines | ||
| 537 | 539 | init_espfix_bsp(); |
| 538 | 540 | /* Should be run after espfix64 is set up. */ |
| 539 | 541 | pti_init(); |
| 542 | + pgd_cache_init(); | |
| 540 | 543 | } |
| 541 | 544 | |
| 542 | 545 | void __init __weak arch_call_rest_init(void) |