diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-05-19 10:10:15 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-05-19 10:10:15 -0700 | 
| commit | 86a78a8b8d0414455c2174852968ce54205add82 (patch) | |
| tree | 333fd5f6bd0a20855ec6cda3bfb2646a960fe226 | |
| parent | bcd1739788e2ea111d0d2efe1ed6633d9f6a20da (diff) | |
| parent | 672eaf37db9f99fd794eed2c68a8b3b05d484081 (diff) | |
| download | linux-86a78a8b8d0414455c2174852968ce54205add82.tar.bz2 | |
Merge tag 'powerpc-5.2-2' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
Pull powerpc fixes from Michael Ellerman:
 "One fix going back to stable, for a bug on 32-bit introduced when we
  added support for THREAD_INFO_IN_TASK.
  A fix for a typo in a recent rework of our hugetlb code that leads to
  crashes on 64-bit when using hugetlbfs with a 4K PAGE_SIZE.
  Two fixes for our recent rework of the address layout on 64-bit hash
  CPUs, both only triggered when userspace tries to access addresses
  outside the user or kernel address ranges.
  Finally a fix for a recently introduced double free in an error path
  in our cacheinfo code.
  Thanks to: Aneesh Kumar K.V, Christophe Leroy, Sachin Sant, Tobin C.
  Harding"
* tag 'powerpc-5.2-2' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
  powerpc/cacheinfo: Remove double free
  powerpc/mm/hash: Fix get_region_id() for invalid addresses
  powerpc/mm: Drop VM_BUG_ON in get_region_id()
  powerpc/mm: Fix crashes with hugepages & 4K pages
  powerpc/32s: fix flush_hash_pages() on SMP
| -rw-r--r-- | arch/powerpc/include/asm/book3s/64/hash.h | 6 | ||||
| -rw-r--r-- | arch/powerpc/kernel/cacheinfo.c | 1 | ||||
| -rw-r--r-- | arch/powerpc/mm/book3s32/hash_low.S | 3 | ||||
| -rw-r--r-- | arch/powerpc/mm/hugetlbpage.c | 2 | 
4 files changed, 7 insertions, 5 deletions
| diff --git a/arch/powerpc/include/asm/book3s/64/hash.h b/arch/powerpc/include/asm/book3s/64/hash.h index 1d1183048cfd..2781ebf6add4 100644 --- a/arch/powerpc/include/asm/book3s/64/hash.h +++ b/arch/powerpc/include/asm/book3s/64/hash.h @@ -93,6 +93,7 @@  #define VMALLOC_REGION_ID	NON_LINEAR_REGION_ID(H_VMALLOC_START)  #define IO_REGION_ID		NON_LINEAR_REGION_ID(H_KERN_IO_START)  #define VMEMMAP_REGION_ID	NON_LINEAR_REGION_ID(H_VMEMMAP_START) +#define INVALID_REGION_ID	(VMEMMAP_REGION_ID + 1)  /*   * Defines the address of the vmemap area, in its own region on @@ -119,14 +120,15 @@ static inline int get_region_id(unsigned long ea)  	if (id == 0)  		return USER_REGION_ID; +	if (id != (PAGE_OFFSET >> 60)) +		return INVALID_REGION_ID; +  	if (ea < H_KERN_VIRT_START)  		return LINEAR_MAP_REGION_ID; -	VM_BUG_ON(id != 0xc);  	BUILD_BUG_ON(NON_LINEAR_REGION_ID(H_VMALLOC_START) != 2);  	region_id = NON_LINEAR_REGION_ID(ea); -	VM_BUG_ON(region_id > VMEMMAP_REGION_ID);  	return region_id;  } diff --git a/arch/powerpc/kernel/cacheinfo.c b/arch/powerpc/kernel/cacheinfo.c index f2ed3ef4b129..862e2890bd3d 100644 --- a/arch/powerpc/kernel/cacheinfo.c +++ b/arch/powerpc/kernel/cacheinfo.c @@ -767,7 +767,6 @@ static void cacheinfo_create_index_dir(struct cache *cache, int index,  				  cache_dir->kobj, "index%d", index);  	if (rc) {  		kobject_put(&index_dir->kobj); -		kfree(index_dir);  		return;  	} diff --git a/arch/powerpc/mm/book3s32/hash_low.S b/arch/powerpc/mm/book3s32/hash_low.S index e27792d0b744..8366c2abeafc 100644 --- a/arch/powerpc/mm/book3s32/hash_low.S +++ b/arch/powerpc/mm/book3s32/hash_low.S @@ -539,7 +539,8 @@ _GLOBAL(flush_hash_pages)  #ifdef CONFIG_SMP  	lis	r9, (mmu_hash_lock - PAGE_OFFSET)@ha  	addi	r9, r9, (mmu_hash_lock - PAGE_OFFSET)@l -	lwz	r8,TASK_CPU(r2) +	tophys	(r8, r2) +	lwz	r8, TASK_CPU(r8)  	oris	r8,r8,9  10:	lwarx	r0,0,r9  	cmpi	0,r0,0 diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c index c5c9ff2d7afc..b5d92dc32844 100644 --- a/arch/powerpc/mm/hugetlbpage.c +++ b/arch/powerpc/mm/hugetlbpage.c @@ -556,7 +556,7 @@ static int __init add_huge_page_size(unsigned long long size)  	if (size <= PAGE_SIZE || !is_power_of_2(size))  		return -EINVAL; -	mmu_psize = check_and_get_huge_psize(size); +	mmu_psize = check_and_get_huge_psize(shift);  	if (mmu_psize < 0)  		return -EINVAL; |