History

x86/mm: Initialize PGD cache during mm initialization

Poking-mm initialization might require to duplicate the PGD in early stage. Initialize the PGD cache earlier to prevent boot failures.

Nadav Amit committed 7 years ago

Commit caa84131 parent 39507463 files · +11 −4Browse files

Unified · Split

3 files
  1. arch/x86/mm/pgtable.c +6 −4
  2. include/asm-generic/pgtable.h +2 −0
  3. init/main.c +3 −0
arch/x86/mm/pgtable.c+6−4
@@ -373,14 +373,14 @@ static void pgd_prepopulate_user_pmd(struct mm_struct *mm, · 372 unmodified lines
373 373
374static struct kmem_cache *pgd_cache;374static struct kmem_cache *pgd_cache;
375 375
376static int __init pgd_cache_init(void)376void __init pgd_cache_init(void)
377{377{
378 /*378 /*
379 * When PAE kernel is running as a Xen domain, it does not use379 * When PAE kernel is running as a Xen domain, it does not use
380 * shared kernel pmd. And this requires a whole page for pgd.380 * shared kernel pmd. And this requires a whole page for pgd.
381 */381 */
382 if (!SHARED_KERNEL_PMD)382 if (!SHARED_KERNEL_PMD)
383 return 0;383 return;
384 384
385 /*385 /*
386 * when PAE kernel is not running as a Xen domain, it uses386 * 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 pgd_cache = kmem_cache_create("pgd_cache", PGD_SIZE, PGD_ALIGN,391 pgd_cache = kmem_cache_create("pgd_cache", PGD_SIZE, PGD_ALIGN,
392 SLAB_PANIC, NULL);392 SLAB_PANIC, NULL);
393 return 0;
394}393}
395core_initcall(pgd_cache_init);
396 394
397static inline pgd_t *_pgd_alloc(void)395static 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#else419#else
422 420
421void __init pgd_cache_init(void)
422{
423}
424
423static inline pgd_t *_pgd_alloc(void)425static inline pgd_t *_pgd_alloc(void)
424{426{
425 return (pgd_t *)__get_free_pages(PGALLOC_GFP, PGD_ALLOCATION_ORDER);427 return (pgd_t *)__get_free_pages(PGALLOC_GFP, PGD_ALLOCATION_ORDER);
include/asm-generic/pgtable.h+2−0
@@ -1126,6 +1126,8 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn, · 1125 unmodified lines
1126static inline void init_espfix_bsp(void) { }1126static inline void init_espfix_bsp(void) { }
1127#endif1127#endif
1128 1128
1129extern void __init pgd_cache_init(void);
1130
1129#ifndef __HAVE_ARCH_PFN_MODIFY_ALLOWED1131#ifndef __HAVE_ARCH_PFN_MODIFY_ALLOWED
1130static inline bool pfn_modify_allowed(unsigned long pfn, pgprot_t prot)1132static inline bool pfn_modify_allowed(unsigned long pfn, pgprot_t prot)
1131{1133{
init/main.c+3−0
@@ -506,6 +506,8 @@ void __init __weak mem_encrypt_init(void) { } · 505 unmodified lines
506 506
507void __init __weak poking_init(void) { }507void __init __weak poking_init(void) { }
508 508
509void __init __weak pgd_cache_init(void) { }
510
509bool initcall_debug;511bool initcall_debug;
510core_param(initcall_debug, initcall_debug, bool, 0644);512core_param(initcall_debug, initcall_debug, bool, 0644);
511 513
@@ -537,6 +539,7 @@ static void __init mm_init(void) · 25 unmodified lines
537 init_espfix_bsp();539 init_espfix_bsp();
538 /* Should be run after espfix64 is set up. */540 /* Should be run after espfix64 is set up. */
539 pti_init();541 pti_init();
542 pgd_cache_init();
540}543}
541 544
542void __init __weak arch_call_rest_init(void)545void __init __weak arch_call_rest_init(void)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t