[PATCH 05/11] powerpc/8xx: Optimise access to swapper_pg_dir

Subsystems: linux for powerpc (32-bit and 64-bit), the rest

STALE4230d

5 messages, 3 authors, 2015-01-06 · open the first message on its own page

[PATCH 05/11] powerpc/8xx: Optimise access to swapper_pg_dir

From: Christophe Leroy <hidden>
Date: 2014-12-16 15:06:41

All accessed to PGD entries are done via 0(r11).
By using lower part of swapper_pg_dir as load index to r11, we can remove the
ori instruction.

Signed-off-by: Christophe Leroy <redacted>

---
 arch/powerpc/kernel/head_8xx.S | 22 ++++++++++------------
 1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S
index ae05f28..aa45225 100644
--- a/arch/powerpc/kernel/head_8xx.S
+++ b/arch/powerpc/kernel/head_8xx.S
@@ -322,13 +322,12 @@ InstructionTLBMiss:
 	mfspr	r11, SPRN_M_TW	/* Get level 1 table base address */
 #ifdef CONFIG_MODULES
 	beq	3f
-	lis	r11, (swapper_pg_dir-PAGE_OFFSET)@h
-	ori	r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
+	lis	r11, (swapper_pg_dir-PAGE_OFFSET)@ha
 3:
 #endif
 	/* Insert level 1 index */
 	rlwimi	r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29
-	lwz	r11, 0(r11)	/* Get the level 1 entry */
+	lwz	r11, (swapper_pg_dir-PAGE_OFFSET)@l(r11)	/* Get the level 1 entry */
 
 	/* Load the MI_TWC with the attributes for this "segment." */
 	MTSPR_CPU6(SPRN_MI_TWC, r11, r3)	/* Set segment attributes */
@@ -376,12 +375,11 @@ DataStoreTLBMiss:
 	andis.	r11, r10, 0x8000
 	mfspr	r11, SPRN_M_TW	/* Get level 1 table base address */
 	beq	3f
-	lis	r11, (swapper_pg_dir-PAGE_OFFSET)@h
-	ori	r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
+	lis	r11, (swapper_pg_dir-PAGE_OFFSET)@ha
 3:
 	/* Insert level 1 index */
 	rlwimi	r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29
-	lwz	r11, 0(r11)	/* Get the level 1 entry */
+	lwz	r11, (swapper_pg_dir-PAGE_OFFSET)@l(r11)	/* Get the level 1 entry */
 
 	/* We have a pte table, so load fetch the pte from the table.
 	 */
@@ -510,12 +508,11 @@ FixupDAR:/* Entry point for dcbx workaround. */
 	mfspr	r10, SPRN_SRR0
 	andis.	r11, r10, 0x8000	/* Address >= 0x80000000 */
 	mfspr	r11, SPRN_M_TW	/* Get level 1 table base address */
-	beq-	3f		/* Branch if user space */
-	lis	r11, (swapper_pg_dir-PAGE_OFFSET)@h
-	ori	r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
+	beq	3f
+	lis	r11, (swapper_pg_dir-PAGE_OFFSET)@ha
 	/* Insert level 1 index */
 3:	rlwimi	r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29
-	lwz	r11, 0(r11)	/* Get the level 1 entry */
+	lwz	r11, (swapper_pg_dir-PAGE_OFFSET)@l(r11)	/* Get the level 1 entry */
 	rlwinm	r11, r11,0,0,19	/* Extract page descriptor page address */
 	/* Insert level 2 index */
 	rlwimi	r11, r10, 32 - (PAGE_SHIFT - 2), 32 - PAGE_SHIFT, 29
@@ -670,8 +667,7 @@ start_here:
 	 * init's THREAD like the context switch code does, but this is
 	 * easier......until someone changes init's static structures.
 	 */
-	lis	r6, swapper_pg_dir@h
-	ori	r6, r6, swapper_pg_dir@l
+	lis	r6, swapper_pg_dir@ha
 	tophys(r6,r6)
 #ifdef CONFIG_8xx_CPU6
 	lis	r4, cpu6_errata_word@h
@@ -850,6 +846,8 @@ _GLOBAL(set_context)
 	stw	r4, 0x4(r5)
 #endif
 
+	li	r5, (swapper_pg_dir-PAGE_OFFSET)@l
+	sub	r4, r4, r5
 #ifdef CONFIG_8xx_CPU6
 	lis	r6, cpu6_errata_word@h
 	ori	r6, r6, cpu6_errata_word@l
-- 
2.1.0

Re: [PATCH 05/11] powerpc/8xx: Optimise access to swapper_pg_dir

From: Joakim Tjernlund <hidden>
Date: 2015-01-05 18:33:49

On Tue, 2014-12-16 at 16:03 +0100, Christophe Leroy wrote:
All accessed to PGD entries are done via 0(r11).
By using lower part of swapper_pg_dir as load index to r11, we can remove=
 the
ori instruction.
=20
Signed-off-by: Christophe Leroy <redacted>
Nice :)
Acked-by: Joakim Tjernlund <redacted>
quoted hunk
=20
---
 arch/powerpc/kernel/head_8xx.S | 22 ++++++++++------------
 1 file changed, 10 insertions(+), 12 deletions(-)
=20
diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8x=
x.S
quoted hunk
index ae05f28..aa45225 100644
--- a/arch/powerpc/kernel/head_8xx.S
+++ b/arch/powerpc/kernel/head_8xx.S
@@ -322,13 +322,12 @@ InstructionTLBMiss:
        mfspr   r11, SPRN_M_TW/* Get level 1 table base address */
 #ifdef CONFIG_MODULES
        beq     3f
-       lis     r11, (swapper_pg_dir-PAGE_OFFSET)@h
-       ori     r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
+       lis     r11, (swapper_pg_dir-PAGE_OFFSET)@ha
 3:
 #endif
        /* Insert level 1 index */
        rlwimi  r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) =
<< 1, 29
-       lwz     r11, 0(r11)/* Get the level 1 entry */
+       lwz     r11, (swapper_pg_dir-PAGE_OFFSET)@l(r11)/* Get the level =
1 entry */
quoted hunk
=20
        /* Load the MI_TWC with the attributes for this "segment." */
        MTSPR_CPU6(SPRN_MI_TWC, r11, r3)/* Set segment attributes */
@@ -376,12 +375,11 @@ DataStoreTLBMiss:
        andis.  r11, r10, 0x8000
        mfspr   r11, SPRN_M_TW/* Get level 1 table base address */
        beq     3f
-       lis     r11, (swapper_pg_dir-PAGE_OFFSET)@h
-       ori     r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
+       lis     r11, (swapper_pg_dir-PAGE_OFFSET)@ha
 3:
        /* Insert level 1 index */
        rlwimi  r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) =
<< 1, 29
-       lwz     r11, 0(r11)/* Get the level 1 entry */
+       lwz     r11, (swapper_pg_dir-PAGE_OFFSET)@l(r11)/* Get the level =
1 entry */
quoted hunk
=20
        /* We have a pte table, so load fetch the pte from the table.
                */
@@ -510,12 +508,11 @@ FixupDAR:/* Entry point for dcbx workaround. */
        mfspr   r10, SPRN_SRR0
        andis.  r11, r10, 0x8000/* Address >=3D 0x80000000 */
        mfspr   r11, SPRN_M_TW/* Get level 1 table base address */
-       beq-    3f      /* Branch if user space */
-       lis     r11, (swapper_pg_dir-PAGE_OFFSET)@h
-       ori     r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
+       beq     3f
+       lis     r11, (swapper_pg_dir-PAGE_OFFSET)@ha
        /* Insert level 1 index */
 3:     rlwimi  r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) =
<< 1, 29
-       lwz     r11, 0(r11)/* Get the level 1 entry */
+       lwz     r11, (swapper_pg_dir-PAGE_OFFSET)@l(r11)/* Get the level =
1 entry */
quoted hunk
        rlwinm  r11, r11,0,0,19/* Extract page descriptor page address */
        /* Insert level 2 index */
        rlwimi  r11, r10, 32 - (PAGE_SHIFT - 2), 32 - PAGE_SHIFT, 29
@@ -670,8 +667,7 @@ start_here:
                * init's THREAD like the context switch code does, but th=
is is
                * easier......until someone changes init's static structu=
res.
quoted hunk
                */
-       lis     r6, swapper_pg_dir@h
-       ori     r6, r6, swapper_pg_dir@l
+       lis     r6, swapper_pg_dir@ha
        tophys(r6,r6)
 #ifdef CONFIG_8xx_CPU6
        lis     r4, cpu6_errata_word@h
@@ -850,6 +846,8 @@ _GLOBAL(set_context)
        stw     r4, 0x4(r5)
 #endif
=20
+       li      r5, (swapper_pg_dir-PAGE_OFFSET)@l
+       sub     r4, r4, r5
 #ifdef CONFIG_8xx_CPU6
        lis     r6, cpu6_errata_word@h
        ori     r6, r6, cpu6_errata_word@l=

RE: [PATCH 05/11] powerpc/8xx: Optimise access to swapper_pg_dir

From: David Laight <hidden>
Date: 2015-01-06 13:06:35

PiBPbiBUdWUsIDIwMTQtMTItMTYgYXQgMTY6MDMgKzAxMDAsIENocmlzdG9waGUgTGVyb3kgd3Jv
dGU6DQo+ID4gQWxsIGFjY2Vzc2VkIHRvIFBHRCBlbnRyaWVzIGFyZSBkb25lIHZpYSAwKHIxMSku
DQo+ID4gQnkgdXNpbmcgbG93ZXIgcGFydCBvZiBzd2FwcGVyX3BnX2RpciBhcyBsb2FkIGluZGV4
IHRvIHIxMSwgd2UgY2FuIHJlbW92ZSB0aGUNCj4gPiBvcmkgaW5zdHJ1Y3Rpb24uDQo+ID4NCj4g
PiBTaWduZWQtb2ZmLWJ5OiBDaHJpc3RvcGhlIExlcm95IDxjaHJpc3RvcGhlLmxlcm95QGMtcy5m
cj4NCj4gDQo+IE5pY2UgOikNCj4gQWNrZWQtYnk6IEpvYWtpbSBUamVybmx1bmQgPGpvYWtpbS50
amVybmx1bmRAdHJhbnNtb2RlLnNlPg0KPiANCj4gPg0KPiA+IC0tLQ0KPiA+ICBhcmNoL3Bvd2Vy
cGMva2VybmVsL2hlYWRfOHh4LlMgfCAyMiArKysrKysrKysrLS0tLS0tLS0tLS0tDQo+ID4gIDEg
ZmlsZSBjaGFuZ2VkLCAxMCBpbnNlcnRpb25zKCspLCAxMiBkZWxldGlvbnMoLSkNCj4gPg0KPiA+
IGRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfOHh4LlMgYi9hcmNoL3Bvd2Vy
cGMva2VybmVsL2hlYWRfOHh4LlMNCj4gPiBpbmRleCBhZTA1ZjI4Li5hYTQ1MjI1IDEwMDY0NA0K
PiA+IC0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF84eHguUw0KPiA+ICsrKyBiL2FyY2gv
cG93ZXJwYy9rZXJuZWwvaGVhZF84eHguUw0KPiA+IEBAIC0zMjIsMTMgKzMyMiwxMiBAQCBJbnN0
cnVjdGlvblRMQk1pc3M6DQo+ID4gICAgICAgICBtZnNwciAgIHIxMSwgU1BSTl9NX1RXLyogR2V0
IGxldmVsIDEgdGFibGUgYmFzZSBhZGRyZXNzICovDQo+ID4gICNpZmRlZiBDT05GSUdfTU9EVUxF
Uw0KPiA+ICAgICAgICAgYmVxICAgICAzZg0KPiA+IC0gICAgICAgbGlzICAgICByMTEsIChzd2Fw
cGVyX3BnX2Rpci1QQUdFX09GRlNFVClAaA0KPiA+IC0gICAgICAgb3JpICAgICByMTEsIHIxMSwg
KHN3YXBwZXJfcGdfZGlyLVBBR0VfT0ZGU0VUKUBsDQo+ID4gKyAgICAgICBsaXMgICAgIHIxMSwg
KHN3YXBwZXJfcGdfZGlyLVBBR0VfT0ZGU0VUKUBoYQ0KPiA+ICAzOg0KPiA+ICAjZW5kaWYNCj4g
PiAgICAgICAgIC8qIEluc2VydCBsZXZlbCAxIGluZGV4ICovDQo+ID4gICAgICAgICBybHdpbWkg
IHIxMSwgcjEwLCAzMiAtICgoUEFHRV9TSElGVCAtIDIpIDw8IDEpLCAoUEFHRV9TSElGVCAtIDIp
IDw8IDEsIDI5DQo+ID4gLSAgICAgICBsd3ogICAgIHIxMSwgMChyMTEpLyogR2V0IHRoZSBsZXZl
bCAxIGVudHJ5ICovDQo+ID4gKyAgICAgICBsd3ogICAgIHIxMSwgKHN3YXBwZXJfcGdfZGlyLVBB
R0VfT0ZGU0VUKUBsKHIxMSkvKiBHZXQgdGhlIGxldmVsIDEgZW50cnkgKi8NCj4gPg0KDQpPbiB0
aGUgZmFjZSBvZiBpdCB0aGF0IGZyYWdtZW50IGRvZXNuJ3QgbG9vayByaWdodCB3aGVuIENPTkZJ
R19NT0RVTEVTIGlzIHVuZGVmaW5lZC4NCg0KCURhdmlkDQoNCg==

Re: [PATCH 05/11] powerpc/8xx: Optimise access to swapper_pg_dir

From: leroy christophe <hidden>
Date: 2015-01-06 13:27:43

Le 06/01/2015 13:08, David Laight a écrit :
quoted
On Tue, 2014-12-16 at 16:03 +0100, Christophe Leroy wrote:
quoted
All accessed to PGD entries are done via 0(r11).
By using lower part of swapper_pg_dir as load index to r11, we can remove the
ori instruction.

Signed-off-by: Christophe Leroy <redacted>
Nice :)
Acked-by: Joakim Tjernlund <redacted>
quoted
---
  arch/powerpc/kernel/head_8xx.S | 22 ++++++++++------------
  1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S
index ae05f28..aa45225 100644
--- a/arch/powerpc/kernel/head_8xx.S
+++ b/arch/powerpc/kernel/head_8xx.S
@@ -322,13 +322,12 @@ InstructionTLBMiss:
         mfspr   r11, SPRN_M_TW/* Get level 1 table base address */
  #ifdef CONFIG_MODULES
         beq     3f
-       lis     r11, (swapper_pg_dir-PAGE_OFFSET)@h
-       ori     r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
+       lis     r11, (swapper_pg_dir-PAGE_OFFSET)@ha
  3:
  #endif
         /* Insert level 1 index */
         rlwimi  r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29
-       lwz     r11, 0(r11)/* Get the level 1 entry */
+       lwz     r11, (swapper_pg_dir-PAGE_OFFSET)@l(r11)/* Get the level 1 entry */
On the face of it that fragment doesn't look right when CONFIG_MODULES is undefined.

	David
I'm not sure I understand what you mean.

The other part of the patch adds the following:
+    li    r5, (swapper_pg_dir-PAGE_OFFSET)@l
+    sub    r4, r4, r5

r4 is the value put into SPRN_M_TW, so I don't see what may be wrong.

Christophe

RE: [PATCH 05/11] powerpc/8xx: Optimise access to swapper_pg_dir

From: David Laight <hidden>
Date: 2015-01-06 14:42:16

From: leroy christophe
Le 06/01/2015 13:08, David Laight a =E9crit :
quoted
quoted
On Tue, 2014-12-16 at 16:03 +0100, Christophe Leroy wrote:
quoted
All accessed to PGD entries are done via 0(r11).
By using lower part of swapper_pg_dir as load index to r11, we can re=
move the
quoted
quoted
quoted
ori instruction.

Signed-off-by: Christophe Leroy <redacted>
Nice :)
Acked-by: Joakim Tjernlund <redacted>
quoted
---
  arch/powerpc/kernel/head_8xx.S | 22 ++++++++++------------
  1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/hea=
d_8xx.S
quoted
quoted
quoted
index ae05f28..aa45225 100644
--- a/arch/powerpc/kernel/head_8xx.S
+++ b/arch/powerpc/kernel/head_8xx.S
@@ -322,13 +322,12 @@ InstructionTLBMiss:
         mfspr   r11, SPRN_M_TW/* Get level 1 table base address */
  #ifdef CONFIG_MODULES
         beq     3f
-       lis     r11, (swapper_pg_dir-PAGE_OFFSET)@h
-       ori     r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
+       lis     r11, (swapper_pg_dir-PAGE_OFFSET)@ha
  3:
  #endif
         /* Insert level 1 index */
         rlwimi  r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT =
- 2) << 1, 29
quoted
quoted
quoted
-       lwz     r11, 0(r11)/* Get the level 1 entry */
+       lwz     r11, (swapper_pg_dir-PAGE_OFFSET)@l(r11)/* Get the le=
vel 1 entry */
quoted
quoted
quoted
On the face of it that fragment doesn't look right when CONFIG_MODULES =
is undefined.
quoted
	David
I'm not sure I understand what you mean.
=20
The other part of the patch adds the following:
+    li    r5, (swapper_pg_dir-PAGE_OFFSET)@l
+    sub    r4, r4, r5
=20
r4 is the value put into SPRN_M_TW, so I don't see what may be wrong.
Ok, but it is completely non-obvious.
You probably need to change some comments somewhere about what is held
in SPRN_M_TW - since it is no longer the L1 base address, but that value
offset by some 'random' amount.

	David
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help