Message ID | 1267172983-28721-3-git-send-email-Joakim.Tjernlund@transmode.se (mailing list archive) |
---|---|
State | Accepted, archived |
Commit | 4afb0be7ccda0ca551cc37572bab74ba4a3c18dd |
Delegated to: | Benjamin Herrenschmidt |
Headers | show |
On Fri, 2010-02-26 at 09:29 +0100, Joakim Tjernlund wrote: > +#ifdef CONFIG_MODULES > + /* Only modules will cause ITLB Misses as we always > + * pin the first 8MB of kernel memory */ > andi. r11, r10, 0x0800 /* Address >= 0x80000000 */ > beq 3f > lis r11, swapper_pg_dir@h > ori r11, r11, swapper_pg_dir@l > rlwimi r10, r11, 0, 2, 19 > 3: > +#endif You can optimize that further I think... You can probably just remove the code above, and add something to do_page_fault() that lazily copies the kernel PGD entries from swapper_pg_dir to the app pgdir. (You can even pre-fill that when creating a new mm). Cheers, Ben.
Benjamin Herrenschmidt <benh@kernel.crashing.org> wrote on 2010/03/16 22:19:36: > > On Fri, 2010-02-26 at 09:29 +0100, Joakim Tjernlund wrote: > > +#ifdef CONFIG_MODULES > > + /* Only modules will cause ITLB Misses as we always > > + * pin the first 8MB of kernel memory */ > > andi. r11, r10, 0x0800 /* Address >= 0x80000000 */ > > beq 3f > > lis r11, swapper_pg_dir@h > > ori r11, r11, swapper_pg_dir@l > > rlwimi r10, r11, 0, 2, 19 > > 3: > > +#endif > > You can optimize that further I think... > > You can probably just remove the code above, and add something to > do_page_fault() that lazily copies the kernel PGD entries from > swapper_pg_dir to the app pgdir. (You can even pre-fill that when > creating a new mm). I did look at this at some point and could not figure out how to do this.
diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S index ecc4a02..84ca1d9 100644 --- a/arch/powerpc/kernel/head_8xx.S +++ b/arch/powerpc/kernel/head_8xx.S @@ -318,12 +318,16 @@ InstructionTLBMiss: /* If we are faulting a kernel address, we have to use the * kernel page tables. */ +#ifdef CONFIG_MODULES + /* Only modules will cause ITLB Misses as we always + * pin the first 8MB of kernel memory */ andi. r11, r10, 0x0800 /* Address >= 0x80000000 */ beq 3f lis r11, swapper_pg_dir@h ori r11, r11, swapper_pg_dir@l rlwimi r10, r11, 0, 2, 19 3: +#endif lwz r11, 0(r10) /* Get the level 1 entry */ rlwinm. r10, r11,0,0,19 /* Extract page descriptor page address */ beq 2f /* If zero, don't try to find a pte */