arch/tile: don't set the homecache of a PTE unless appropriate
authorChris Metcalf <cmetcalf@tilera.com>
Thu, 29 Mar 2012 19:36:53 +0000 (15:36 -0400)
committerChris Metcalf <cmetcalf@tilera.com>
Mon, 2 Apr 2012 16:13:05 +0000 (12:13 -0400)
We make sure not to try to set the home for an MMIO PTE (on tilegx)
or a PTE that isn't referencing memory managed by Linux.

Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
arch/tile/mm/pgtable.c

index 8730369..6b9a109 100644 (file)
@@ -469,10 +469,18 @@ void __set_pte(pte_t *ptep, pte_t pte)
 
 void set_pte(pte_t *ptep, pte_t pte)
 {
-       struct page *page = pfn_to_page(pte_pfn(pte));
-
-       /* Update the home of a PTE if necessary */
-       pte = pte_set_home(pte, page_home(page));
+       if (pte_present(pte) &&
+           (!CHIP_HAS_MMIO() || hv_pte_get_mode(pte) != HV_PTE_MODE_MMIO)) {
+               /* The PTE actually references physical memory. */
+               unsigned long pfn = pte_pfn(pte);
+               if (pfn_valid(pfn)) {
+                       /* Update the home of the PTE from the struct page. */
+                       pte = pte_set_home(pte, page_home(pfn_to_page(pfn)));
+               } else if (hv_pte_get_mode(pte) == 0) {
+                       /* remap_pfn_range(), etc, must supply PTE mode. */
+                       panic("set_pte(): out-of-range PFN and mode 0\n");
+               }
+       }
 
        __set_pte(ptep, pte);
 }