|
|
@@ -909,6 +909,20 @@ static void populate_pte(struct cpa_data *cpa,
|
|
|
|
|
|
pte = pte_offset_kernel(pmd, start);
|
|
|
|
|
|
+ /*
|
|
|
+ * Set the GLOBAL flags only if the PRESENT flag is
|
|
|
+ * set otherwise pte_present will return true even on
|
|
|
+ * a non present pte. The canon_pgprot will clear
|
|
|
+ * _PAGE_GLOBAL for the ancient hardware that doesn't
|
|
|
+ * support it.
|
|
|
+ */
|
|
|
+ if (pgprot_val(pgprot) & _PAGE_PRESENT)
|
|
|
+ pgprot_val(pgprot) |= _PAGE_GLOBAL;
|
|
|
+ else
|
|
|
+ pgprot_val(pgprot) &= ~_PAGE_GLOBAL;
|
|
|
+
|
|
|
+ pgprot = canon_pgprot(pgprot);
|
|
|
+
|
|
|
while (num_pages-- && start < end) {
|
|
|
set_pte(pte, pfn_pte(cpa->pfn, pgprot));
|
|
|
|