@@ -844,14 +844,25 @@ void __init paging_init(void)
844
844
*/
845
845
static unsigned long unused_pmd_start __meminitdata ;
846
846
847
+ static void * __meminit vmemmap_va_to_kaddr (unsigned long vmemmap_va )
848
+ {
849
+ void * kaddr = (void * )vmemmap_va ;
850
+ pgd_t * pgd = __va (read_cr3_pa ());
851
+
852
+ if (init_mm .pgd != pgd )
853
+ kaddr = __va (slow_virt_to_phys (kaddr ));
854
+
855
+ return kaddr ;
856
+ }
857
+
847
858
static void __meminit vmemmap_flush_unused_pmd (void )
848
859
{
849
860
if (!unused_pmd_start )
850
861
return ;
851
862
/*
852
863
* Clears (unused_pmd_start, PMD_END]
853
864
*/
854
- memset (( void * ) unused_pmd_start , PAGE_UNUSED ,
865
+ memset (vmemmap_va_to_kaddr ( unused_pmd_start ) , PAGE_UNUSED ,
855
866
ALIGN (unused_pmd_start , PMD_SIZE ) - unused_pmd_start );
856
867
unused_pmd_start = 0 ;
857
868
}
@@ -882,7 +893,7 @@ static void __meminit __vmemmap_use_sub_pmd(unsigned long start)
882
893
* case the first memmap never gets initialized e.g., because the memory
883
894
* block never gets onlined).
884
895
*/
885
- memset (( void * ) start , 0 , sizeof (struct page ));
896
+ memset (vmemmap_va_to_kaddr ( start ) , 0 , sizeof (struct page ));
886
897
}
887
898
888
899
static void __meminit vmemmap_use_sub_pmd (unsigned long start , unsigned long end )
@@ -924,7 +935,7 @@ static void __meminit vmemmap_use_new_sub_pmd(unsigned long start, unsigned long
924
935
* Mark with PAGE_UNUSED the unused parts of the new memmap range
925
936
*/
926
937
if (!IS_ALIGNED (start , PMD_SIZE ))
927
- memset (( void * ) page , PAGE_UNUSED , start - page );
938
+ memset (vmemmap_va_to_kaddr ( page ) , PAGE_UNUSED , start - page );
928
939
929
940
/*
930
941
* We want to avoid memset(PAGE_UNUSED) when populating the vmemmap of
0 commit comments