Merge tag 'powerpc-4.7-4' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 25 Jun 2016 13:01:48 +0000 (06:01 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 25 Jun 2016 13:01:48 +0000 (06:01 -0700)
Pull powerpc fixes from Michael Ellerman:
 "mm/radix (Aneesh Kumar K.V):
   - Update to tlb functions ric argument
   - Flush page walk cache when freeing page table
   - Update Radix tree size as per ISA 3.0

  mm/hash (Aneesh Kumar K.V):
   - Use the correct PPP mask when updating HPTE
   - Don't add memory coherence if cache inhibited is set

  eeh (Gavin Shan):
   - Fix invalid cached PE primary bus

  bpf/jit (Naveen N. Rao):
   - Disable classic BPF JIT on ppc64le

  .. and fix faults caused by radix patching of SLB miss handler
  (Michael Ellerman)"

* tag 'powerpc-4.7-4' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
  powerpc/bpf/jit: Disable classic BPF JIT on ppc64le
  powerpc: Fix faults caused by radix patching of SLB miss handler
  powerpc/eeh: Fix invalid cached PE primary bus
  powerpc/mm/radix: Update Radix tree size as per ISA 3.0
  powerpc/mm/hash: Don't add memory coherence if cache inhibited is set
  powerpc/mm/hash: Use the correct PPP mask when updating HPTE
  powerpc/mm/radix: Flush page walk cache when freeing page table
  powerpc/mm/radix: Update to tlb functions ric argument

1  2 
arch/powerpc/include/asm/book3s/64/pgalloc.h

@@@ -41,7 -41,7 +41,7 @@@ extern struct kmem_cache *pgtable_cache
                        pgtable_cache[(shift) - 1];     \
                })
  
 -#define PGALLOC_GFP GFP_KERNEL | __GFP_NOTRACK | __GFP_REPEAT | __GFP_ZERO
 +#define PGALLOC_GFP GFP_KERNEL | __GFP_NOTRACK | __GFP_ZERO
  
  extern pte_t *pte_fragment_alloc(struct mm_struct *, unsigned long, int);
  extern void pte_fragment_free(unsigned long *, int);
@@@ -56,7 -56,7 +56,7 @@@ static inline pgd_t *radix__pgd_alloc(s
        return (pgd_t *)__get_free_page(PGALLOC_GFP);
  #else
        struct page *page;
 -      page = alloc_pages(PGALLOC_GFP, 4);
 +      page = alloc_pages(PGALLOC_GFP | __GFP_REPEAT, 4);
        if (!page)
                return NULL;
        return (pgd_t *) page_address(page);
@@@ -93,7 -93,8 +93,7 @@@ static inline void pgd_populate(struct 
  
  static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr)
  {
 -      return kmem_cache_alloc(PGT_CACHE(PUD_INDEX_SIZE),
 -                              GFP_KERNEL|__GFP_REPEAT);
 +      return kmem_cache_alloc(PGT_CACHE(PUD_INDEX_SIZE), GFP_KERNEL);
  }
  
  static inline void pud_free(struct mm_struct *mm, pud_t *pud)
@@@ -109,12 -110,18 +109,17 @@@ static inline void pud_populate(struct 
  static inline void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,
                                    unsigned long address)
  {
+       /*
+        * By now all the pud entries should be none entries. So go
+        * ahead and flush the page walk cache
+        */
+       flush_tlb_pgtable(tlb, address);
          pgtable_free_tlb(tlb, pud, PUD_INDEX_SIZE);
  }
  
  static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
  {
 -      return kmem_cache_alloc(PGT_CACHE(PMD_CACHE_INDEX),
 -                              GFP_KERNEL|__GFP_REPEAT);
 +      return kmem_cache_alloc(PGT_CACHE(PMD_CACHE_INDEX), GFP_KERNEL);
  }
  
  static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
  static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
                                    unsigned long address)
  {
+       /*
+        * By now all the pud entries should be none entries. So go
+        * ahead and flush the page walk cache
+        */
+       flush_tlb_pgtable(tlb, address);
          return pgtable_free_tlb(tlb, pmd, PMD_CACHE_INDEX);
  }
  
@@@ -149,7 -161,7 +159,7 @@@ static inline pgtable_t pmd_pgtable(pmd
  static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
                                          unsigned long address)
  {
 -      return (pte_t *)__get_free_page(GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO);
 +      return (pte_t *)__get_free_page(GFP_KERNEL | __GFP_ZERO);
  }
  
  static inline pgtable_t pte_alloc_one(struct mm_struct *mm,
@@@ -196,7 -208,11 +206,11 @@@ static inline void pte_free(struct mm_s
  static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table,
                                  unsigned long address)
  {
-       tlb_flush_pgtable(tlb, address);
+       /*
+        * By now all the pud entries should be none entries. So go
+        * ahead and flush the page walk cache
+        */
+       flush_tlb_pgtable(tlb, address);
        pgtable_free_tlb(tlb, table, 0);
  }