From: Rohan McLure <redacted>
[ Upstream commit 4df0221f9ded8c39aecfb1a80cef346026671cb7 ]
Syscall handlers should not be invoked internally by their symbol names,
as these symbols defined by the architecture-defined SYSCALL_DEFINE
macro. Fortunately, in the case of ppc64_personality, its call to
sys_personality can be replaced with an invocation to the
equivalent ksys_personality inline helper in <linux/syscalls.h>.
Signed-off-by: Rohan McLure <redacted>
Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220921065605.1051927-13-rmclure@linux.ibm.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
arch/powerpc/kernel/syscalls.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
@@ -109,7 +109,7 @@ long ppc64_personality(unsigned long personality)if(personality(current->personality)==PER_LINUX32&&personality(personality)==PER_LINUX)personality=(personality&~PER_MASK)|PER_LINUX32;-ret=sys_personality(personality);+ret=ksys_personality(personality);if(personality(ret)==PER_LINUX32)ret=(ret&~PER_MASK)|PER_LINUX;returnret;
From: "Aneesh Kumar K.V" <redacted>
[ Upstream commit 7dd3a7b90bca2c12e2146a47d63cf69a2f5d7e89 ]
Powerpc architecture supports 16GB hugetlb pages with hash translation.
For 4K page size, this is implemented as a hugepage directory entry at
PGD level and for 64K it is implemented as a huge page pte at PUD level
With 16GB hugetlb size, offset within a page is greater than 32 bits.
Hence switch to use unsigned long type when using hugepd_shift.
In order to keep things simpler, we make sure we always use unsigned
long type when using hugepd_shift() even though all the hugetlb page
size won't require that.
The hugetlb_free_p*d_range changes are all related to nohash usage where
we can have multiple pgd entries pointing to the same hugepd entries.
Hence on book3s64 where we can have > 4GB hugetlb page size we will
always find more < next even if we compute the value of more correctly.
Hence there is no functional change in this patch except that it fixes
the below warning.
UBSAN: shift-out-of-bounds in arch/powerpc/mm/hugetlbpage.c:499:21
shift exponent 34 is too large for 32-bit type 'int'
CPU: 39 PID: 1673 Comm: a.out Not tainted 6.0.0-rc2-00327-gee88a56e8517-dirty #1
Call Trace:
dump_stack_lvl+0x98/0xe0 (unreliable)
ubsan_epilogue+0x18/0x70
__ubsan_handle_shift_out_of_bounds+0x1bc/0x390
hugetlb_free_pgd_range+0x5d8/0x600
free_pgtables+0x114/0x290
exit_mmap+0x150/0x550
mmput+0xcc/0x210
do_exit+0x420/0xdd0
do_group_exit+0x4c/0xd0
sys_exit_group+0x24/0x30
system_call_exception+0x250/0x600
system_call_common+0xec/0x250
Signed-off-by: Aneesh Kumar K.V <redacted>
[mpe: Drop generic change to be sent separately, change 1ULL to 1UL]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220908072440.258301-1-aneesh.kumar@linux.ibm.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
arch/powerpc/mm/hugetlbpage.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
From: Nicholas Piggin <npiggin@gmail.com>
[ Upstream commit 0fa6831811f62cfc10415d731bcf9fde2647ad81 ]
irq soft-masking means that when Linux irqs are disabled, the MSR[EE]
value can change from 1 to 0 asynchronously: if a masked interrupt of
the PACA_IRQ_MUST_HARD_MASK variety fires while irqs are disabled,
the masked handler will return with MSR[EE]=0.
This means a sequence like mtmsr(mfmsr() | MSR_FP) is racy if it can
be called with local irqs disabled, unless a hard_irq_disable has been
done.
Reported-by: Sachin Sant <redacted>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20221004051157.308999-2-npiggin@gmail.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
arch/powerpc/include/asm/hw_irq.h | 24 ++++++++++++++++++++++++
arch/powerpc/kernel/process.c | 4 ++--
2 files changed, 26 insertions(+), 2 deletions(-)
@@ -131,7 +131,7 @@ unsigned long msr_check_and_set(unsigned long bits)#endifif(oldmsr!=newmsr)-mtmsr_isync(newmsr);+newmsr=mtmsr_isync_irqsafe(newmsr);returnnewmsr;}
@@ -150,7 +150,7 @@ void __msr_check_and_clear(unsigned long bits)#endifif(oldmsr!=newmsr)-mtmsr_isync(newmsr);+mtmsr_isync_irqsafe(newmsr);}EXPORT_SYMBOL(__msr_check_and_clear);