@@ -585,7 +585,18 @@ static inline int pmd_trans_huge(pmd_t pmd)
585
585
586
586
#define pmd_write (pmd ) pte_write(pmd_pte(pmd))
587
587
588
- #define pmd_mkhuge (pmd ) (__pmd(pmd_val(pmd) & ~PMD_TABLE_BIT))
588
+ static inline pmd_t pmd_mkhuge (pmd_t pmd )
589
+ {
590
+ /*
591
+ * It's possible that the pmd is present-invalid on entry
592
+ * and in that case it needs to remain present-invalid on
593
+ * exit. So ensure the VALID bit does not get modified.
594
+ */
595
+ pmdval_t mask = PMD_TYPE_MASK & ~PTE_VALID ;
596
+ pmdval_t val = PMD_TYPE_SECT & ~PTE_VALID ;
597
+
598
+ return __pmd ((pmd_val (pmd ) & ~mask ) | val );
599
+ }
589
600
590
601
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
591
602
#define pmd_devmap (pmd ) pte_devmap(pmd_pte(pmd))
@@ -613,7 +624,18 @@ static inline pmd_t pmd_mkspecial(pmd_t pmd)
613
624
#define pud_mkyoung (pud ) pte_pud(pte_mkyoung(pud_pte(pud)))
614
625
#define pud_write (pud ) pte_write(pud_pte(pud))
615
626
616
- #define pud_mkhuge (pud ) (__pud(pud_val(pud) & ~PUD_TABLE_BIT))
627
+ static inline pud_t pud_mkhuge (pud_t pud )
628
+ {
629
+ /*
630
+ * It's possible that the pud is present-invalid on entry
631
+ * and in that case it needs to remain present-invalid on
632
+ * exit. So ensure the VALID bit does not get modified.
633
+ */
634
+ pudval_t mask = PUD_TYPE_MASK & ~PTE_VALID ;
635
+ pudval_t val = PUD_TYPE_SECT & ~PTE_VALID ;
636
+
637
+ return __pud ((pud_val (pud ) & ~mask ) | val );
638
+ }
617
639
618
640
#define __pud_to_phys (pud ) __pte_to_phys(pud_pte(pud))
619
641
#define __phys_to_pud_val (phys ) __phys_to_pte_val(phys)
0 commit comments