powerpc fixes for 5.1 #7
One regression fix. Changes we merged to STRICT_KERNEL_RWX on 32-bit were causing crashes under load on some machines depending on memory layout. Thanks to: Christophe Leroy. -----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJczY3sAAoJEFHr6jzI4aWA9UkP/3iM1wt/L3iYpmfPA0MJ4h4f oEB2WR4KFhBHcMbLKUNS0m9MfecAxHyrFXW46lnFbqVLbaJ3rBSRBitTySo1VnT3 wJKJi/rEf1uNmjxFTKRuE4eL1+4H2OVbwF+CLRB4jaILBmgDyvgYQDkeYQE689ut VjLA1C/8PRlKFO/82nGPaASdugqk4o+swxNxODhG+Bjv+9KGSinK4LN6zqyLoU/f aS4APLO59xd6vXosDZRiK6C5efoMu+8kAm8/pyA9E8+0TFTdrtZcPrbCme9Vj9xh i1Ruzxf9njZaSG37TQpgaFA/IKlSjBqAdaRmA6dy7fQ+GAOpt7YhtNIhk9prvOT6 uGarcHuusQ/Nhy0pb+Kt5H90RKzcZr/pgDEjhujJdCnVozQnX4fvkOjm8SvV6vc4 ucy2zzraMRo3OTvs38YAyGj/MPxOvMYZ1G+v/rAxpfvmdDl6KQ3uCvSczujP7qo6 49VfvfENGRTQhb+KSQtD4VtR9rFvMco5F8m1TFlYI1+RcoxHqqcR8aTK22wQvs45 2J97mkOvVeIp2pO7+yB5c2t3rPG9Qg9ARifnxXyF+9Cb1h1USy3vF2zUCj+wZSeP l+cYYcjrk/C6btDTVARMOXLKyeB4CWHaSCz8s3HIrXkuZsJbA3/qGi25mCWAEOVj 1qN6UpFNICtXOHBCAPYx =/m4Q -----END PGP SIGNATURE----- Merge tag 'powerpc-5.1-7' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux Pull powerpc fix from Michael Ellerman: "One regression fix. Changes we merged to STRICT_KERNEL_RWX on 32-bit were causing crashes under load on some machines depending on memory layout. Thanks to Christophe Leroy" * tag 'powerpc-5.1-7' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: powerpc/32s: Fix BATs setting with CONFIG_STRICT_KERNEL_RWX
This commit is contained in:
commit
6203838dec
@ -98,10 +98,20 @@ static int find_free_bat(void)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function calculates the size of the larger block usable to map the
|
||||
* beginning of an area based on the start address and size of that area:
|
||||
* - max block size is 8M on 601 and 256 on other 6xx.
|
||||
* - base address must be aligned to the block size. So the maximum block size
|
||||
* is identified by the lowest bit set to 1 in the base address (for instance
|
||||
* if base is 0x16000000, max size is 0x02000000).
|
||||
* - block size has to be a power of two. This is calculated by finding the
|
||||
* highest bit set to 1.
|
||||
*/
|
||||
static unsigned int block_size(unsigned long base, unsigned long top)
|
||||
{
|
||||
unsigned int max_size = (cpu_has_feature(CPU_FTR_601) ? 8 : 256) << 20;
|
||||
unsigned int base_shift = (fls(base) - 1) & 31;
|
||||
unsigned int base_shift = (ffs(base) - 1) & 31;
|
||||
unsigned int block_shift = (fls(top - base) - 1) & 31;
|
||||
|
||||
return min3(max_size, 1U << base_shift, 1U << block_shift);
|
||||
@ -157,7 +167,7 @@ static unsigned long __init __mmu_mapin_ram(unsigned long base, unsigned long to
|
||||
|
||||
unsigned long __init mmu_mapin_ram(unsigned long base, unsigned long top)
|
||||
{
|
||||
int done;
|
||||
unsigned long done;
|
||||
unsigned long border = (unsigned long)__init_begin - PAGE_OFFSET;
|
||||
|
||||
if (__map_without_bats) {
|
||||
@ -169,10 +179,10 @@ unsigned long __init mmu_mapin_ram(unsigned long base, unsigned long top)
|
||||
return __mmu_mapin_ram(base, top);
|
||||
|
||||
done = __mmu_mapin_ram(base, border);
|
||||
if (done != border - base)
|
||||
if (done != border)
|
||||
return done;
|
||||
|
||||
return done + __mmu_mapin_ram(border, top);
|
||||
return __mmu_mapin_ram(border, top);
|
||||
}
|
||||
|
||||
void mmu_mark_initmem_nx(void)
|
||||
|
Loading…
Reference in New Issue
Block a user