]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blame - src/patches/suse-2.6.27.39/patches.arch/ppc-valid-hugepage-size-hugetlb_get_unmapped_area.patch
Fix oinkmaster patch.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.arch / ppc-valid-hugepage-size-hugetlb_get_unmapped_area.patch
CommitLineData
2cb7cef9
BS
1Subject: Check for valid hugepage size in hugetlb_get_unmapped_area
2From: Brian King <brking@linux.vnet.ibm.com>
3References: 456433 - LTC50170
4
5It looks like most of the hugetlb code is doing the correct thing if
6hugepages are not supported, but the mmap code is not. If we get into
7the mmap code when hugepages are not supported, such as in an LPAR
8which is running Active Memory Sharing, we can oops the kernel. This
9patch fixes the oops being seen in this path.
10
11ops: Kernel access of bad area, sig: 11 [#1]
12SMP NR_CPUS=1024 NUMA pSeries
13Modules linked in: nfs(N) lockd(N) nfs_acl(N) sunrpc(N) ipv6(N) fuse(N) loop(N)
14dm_mod(N) sg(N) ibmveth(N) sd_mod(N) crc_t10dif(N) ibmvscsic(N)
15scsi_transport_srp(N) scsi_tgt(N) scsi_mod(N)
16Supported: No
17NIP: c000000000038d60 LR: c00000000003945c CTR: c0000000000393f0
18REGS: c000000077e7b830 TRAP: 0300 Tainted: G
19(2.6.27.5-bz50170-2-ppc64)
20MSR: 8000000000009032 <EE,ME,IR,DR> CR: 44000448 XER: 20000001
21DAR: c000002000af90a8, DSISR: 0000000040000000
22TASK = c00000007c1b8600[4019] 'hugemmap01' THREAD: c000000077e78000 CPU: 6
23GPR00: 0000001fffffffe0 c000000077e7bab0 c0000000009a4e78 0000000000000000
24GPR04: 0000000000010000 0000000000000001 00000000ffffffff 0000000000000001
25GPR08: 0000000000000000 c000000000af90c8 0000000000000001 0000000000000000
26GPR12: 000000000000003f c000000000a73880 0000000000000000 0000000000000000
27GPR16: 0000000000000000 0000000000000000 0000000000000000 0000000000010000
28GPR20: 0000000000000000 0000000000000003 0000000000010000 0000000000000001
29GPR24: 0000000000000003 0000000000000000 0000000000000001 ffffffffffffffb5
30GPR28: c000000077ca2e80 0000000000000000 c00000000092af78 0000000000010000
31NIP [c000000000038d60] .slice_get_unmapped_area+0x6c/0x4e0
32LR [c00000000003945c] .hugetlb_get_unmapped_area+0x6c/0x80
33Call Trace:
34[c000000077e7bbc0] [c00000000003945c] .hugetlb_get_unmapped_area+0x6c/0x80
35[c000000077e7bc30] [c000000000107e30] .get_unmapped_area+0x64/0xd8
36[c000000077e7bcb0] [c00000000010b140] .do_mmap_pgoff+0x140/0x420
37[c000000077e7bd80] [c00000000000bf5c] .sys_mmap+0xc4/0x140
38[c000000077e7be30] [c0000000000086b4] syscall_exit+0x0/0x40
39Instruction dump:
40fac1ffb0 fae1ffb8 fb01ffc0 fb21ffc8 fb41ffd0 fb61ffd8 fb81ffe0 fbc1fff0
41fbe1fff8 f821fef1 f8c10158 f8e10160 <7d49002e> f9010168 e92d01b0 eb4902b0
42
43Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
44Signed-off-by: Olaf Hering <olh@suse.de>
45
46---
47 arch/powerpc/mm/hugetlbpage.c | 3 +++
48 1 file changed, 3 insertions(+)
49
50--- a/arch/powerpc/mm/hugetlbpage.c
51+++ b/arch/powerpc/mm/hugetlbpage.c
52@@ -500,6 +500,9 @@ unsigned long hugetlb_get_unmapped_area(
53 {
54 struct hstate *hstate = hstate_file(file);
55 int mmu_psize = shift_to_mmu_psize(huge_page_shift(hstate));
56+
57+ if (!mmu_huge_psizes[mmu_psize])
58+ return -EINVAL;
59 return slice_get_unmapped_area(addr, len, flags, mmu_psize, 1, 0);
60 }
61