@@ -63,6 +63,7 @@ static pmd_t bm_pmd[PTRS_PER_PMD] __page_aligned_bss __maybe_unused;
6363static pud_t bm_pud [PTRS_PER_PUD ] __page_aligned_bss __maybe_unused ;
6464
6565static DEFINE_SPINLOCK (swapper_pgdir_lock );
66+ static DEFINE_MUTEX (fixmap_lock );
6667
6768void set_swapper_pgd (pgd_t * pgdp , pgd_t pgd )
6869{
@@ -294,18 +295,6 @@ static void alloc_init_cont_pmd(pud_t *pudp, unsigned long addr,
294295 } while (addr = next , addr != end );
295296}
296297
297- static inline bool use_1G_block (unsigned long addr , unsigned long next ,
298- unsigned long phys )
299- {
300- if (PAGE_SHIFT != 12 )
301- return false;
302-
303- if (((addr | next | phys ) & ~PUD_MASK ) != 0 )
304- return false;
305-
306- return true;
307- }
308-
309298static void alloc_init_pud (pgd_t * pgdp , unsigned long addr , unsigned long end ,
310299 phys_addr_t phys , pgprot_t prot ,
311300 phys_addr_t (* pgtable_alloc )(int ),
@@ -329,6 +318,12 @@ static void alloc_init_pud(pgd_t *pgdp, unsigned long addr, unsigned long end,
329318 }
330319 BUG_ON (p4d_bad (p4d ));
331320
321+ /*
322+ * No need for locking during early boot. And it doesn't work as
323+ * expected with KASLR enabled.
324+ */
325+ if (system_state != SYSTEM_BOOTING )
326+ mutex_lock (& fixmap_lock );
332327 pudp = pud_set_fixmap_offset (p4dp , addr );
333328 do {
334329 pud_t old_pud = READ_ONCE (* pudp );
@@ -338,7 +333,8 @@ static void alloc_init_pud(pgd_t *pgdp, unsigned long addr, unsigned long end,
338333 /*
339334 * For 4K granule only, attempt to put down a 1GB block
340335 */
341- if (use_1G_block (addr , next , phys ) &&
336+ if (pud_sect_supported () &&
337+ ((addr | next | phys ) & ~PUD_MASK ) == 0 &&
342338 (flags & NO_BLOCK_MAPPINGS ) == 0 ) {
343339 pud_set_huge (pudp , phys , prot );
344340
@@ -359,6 +355,8 @@ static void alloc_init_pud(pgd_t *pgdp, unsigned long addr, unsigned long end,
359355 } while (pudp ++ , addr = next , addr != end );
360356
361357 pud_clear_fixmap ();
358+ if (system_state != SYSTEM_BOOTING )
359+ mutex_unlock (& fixmap_lock );
362360}
363361
364362static void __create_pgd_mapping (pgd_t * pgdir , phys_addr_t phys ,
0 commit comments