[PATCH] [Powerpc] fix switch_slb handling of 1T ESID values

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

STALE6897d

3 messages, 2 authors, 2007-10-27 · open the first message on its own page

[PATCH] [Powerpc] fix switch_slb handling of 1T ESID values

From: Will Schmidt <hidden>
Date: 2007-10-26 20:46:53

[Powerpc] fix switch_slb handling of 1T ESID values

Now that we have 1TB segment size support, we need to be using the
GET_ESID_1T macro when comparing ESID values for pc,stack, and
unmapped_base within switch_slb() when we're on a CPU that supports it.

This also happens to fix a duplicate-slb-entry inspired machine-check
exception I was seeing when trying to run java on a power6 partition.

Tested on power6 and power5.

Signed-Off-By:  Will Schmidt <redacted>

---

There is a similar bit of code in stab.c switch_stab().  Should this change also be made there?
---

 arch/powerpc/mm/slb.c |   19 ++++++++++++++-----
 1 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c
index bbd2c51..0c527d7 100644
--- a/arch/powerpc/mm/slb.c
+++ b/arch/powerpc/mm/slb.c
@@ -193,16 +193,25 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm)
 		return;
 	slb_allocate(pc);
 
-	if (GET_ESID(pc) == GET_ESID(stack))
-		return;
+	if (cpu_has_feature(CPU_FTR_1T_SEGMENT)) {
+		if (GET_ESID_1T(pc) == GET_ESID_1T(stack))
+			return;
+	} else
+		if (GET_ESID(pc) == GET_ESID(stack))
+			return;
 
 	if (is_kernel_addr(stack))
 		return;
 	slb_allocate(stack);
 
-	if ((GET_ESID(pc) == GET_ESID(unmapped_base))
-	    || (GET_ESID(stack) == GET_ESID(unmapped_base)))
-		return;
+	if (cpu_has_feature(CPU_FTR_1T_SEGMENT)) {
+		if ((GET_ESID_1T(pc) == GET_ESID_1T(unmapped_base))
+		    || (GET_ESID_1T(stack) == GET_ESID_1T(unmapped_base)))
+			return;
+	} else
+		if ((GET_ESID(pc) == GET_ESID(unmapped_base))
+		    || (GET_ESID(stack) == GET_ESID(unmapped_base)))
+			return;
 
 	if (is_kernel_addr(unmapped_base))
 		return;

Re: [PATCH] [Powerpc] fix switch_slb handling of 1T ESID values

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Date: 2007-10-27 04:19:40

On Fri, 2007-10-26 at 15:46 -0500, Will Schmidt wrote:
[Powerpc] fix switch_slb handling of 1T ESID values

Now that we have 1TB segment size support, we need to be using the
GET_ESID_1T macro when comparing ESID values for pc,stack, and
unmapped_base within switch_slb() when we're on a CPU that supports it.

This also happens to fix a duplicate-slb-entry inspired machine-check
exception I was seeing when trying to run java on a power6 partition.

Tested on power6 and power5.

Signed-Off-By:  Will Schmidt <redacted>
Good catch !

A minor comment is maybe you could factor out the code better doing
something like a ESID_COMPARE() macro ?
---

There is a similar bit of code in stab.c switch_stab().  Should this change also be made there?
---
There is no machine that does stab and 1T segments.

Ben.
quoted hunk
 arch/powerpc/mm/slb.c |   19 ++++++++++++++-----
 1 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c
index bbd2c51..0c527d7 100644
--- a/arch/powerpc/mm/slb.c
+++ b/arch/powerpc/mm/slb.c
@@ -193,16 +193,25 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm)
 		return;
 	slb_allocate(pc);
 
-	if (GET_ESID(pc) == GET_ESID(stack))
-		return;
+	if (cpu_has_feature(CPU_FTR_1T_SEGMENT)) {
+		if (GET_ESID_1T(pc) == GET_ESID_1T(stack))
+			return;
+	} else
+		if (GET_ESID(pc) == GET_ESID(stack))
+			return;
 
 	if (is_kernel_addr(stack))
 		return;
 	slb_allocate(stack);
 
-	if ((GET_ESID(pc) == GET_ESID(unmapped_base))
-	    || (GET_ESID(stack) == GET_ESID(unmapped_base)))
-		return;
+	if (cpu_has_feature(CPU_FTR_1T_SEGMENT)) {
+		if ((GET_ESID_1T(pc) == GET_ESID_1T(unmapped_base))
+		    || (GET_ESID_1T(stack) == GET_ESID_1T(unmapped_base)))
+			return;
+	} else
+		if ((GET_ESID(pc) == GET_ESID(unmapped_base))
+		    || (GET_ESID(stack) == GET_ESID(unmapped_base)))
+			return;
 
 	if (is_kernel_addr(unmapped_base))
 		return;

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Re: [PATCH] [Powerpc] fix switch_slb handling of 1T ESID values

From: Will Schmidt <hidden>
Date: 2007-10-27 17:36:28

On Sat, 2007-10-27 at 14:19 +1000, Benjamin Herrenschmidt wrote:
On Fri, 2007-10-26 at 15:46 -0500, Will Schmidt wrote:
quoted
[Powerpc] fix switch_slb handling of 1T ESID values

Now that we have 1TB segment size support, we need to be using the
GET_ESID_1T macro when comparing ESID values for pc,stack, and
unmapped_base within switch_slb() when we're on a CPU that supports it.

This also happens to fix a duplicate-slb-entry inspired machine-check
exception I was seeing when trying to run java on a power6 partition.

Tested on power6 and power5.

Signed-Off-By:  Will Schmidt <redacted>
Good catch !

A minor comment is maybe you could factor out the code better doing
something like a ESID_COMPARE() macro ?
Yeah, thats a good idea.   I'll spin up a new patch in the next day or
so.   
It occurred to me that I should continue to use GET_ESID when the user
address is < 1T too. 
quoted
---

There is a similar bit of code in stab.c switch_stab().  Should this change also be made there?
---
There is no machine that does stab and 1T segments.
Ok, thanks for the clarification. 

-Will
Ben.
quoted
 arch/powerpc/mm/slb.c |   19 ++++++++++++++-----
 1 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c
index bbd2c51..0c527d7 100644
--- a/arch/powerpc/mm/slb.c
+++ b/arch/powerpc/mm/slb.c
@@ -193,16 +193,25 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm)
 		return;
 	slb_allocate(pc);
 
-	if (GET_ESID(pc) == GET_ESID(stack))
-		return;
+	if (cpu_has_feature(CPU_FTR_1T_SEGMENT)) {
+		if (GET_ESID_1T(pc) == GET_ESID_1T(stack))
+			return;
+	} else
+		if (GET_ESID(pc) == GET_ESID(stack))
+			return;
 
 	if (is_kernel_addr(stack))
 		return;
 	slb_allocate(stack);
 
-	if ((GET_ESID(pc) == GET_ESID(unmapped_base))
-	    || (GET_ESID(stack) == GET_ESID(unmapped_base)))
-		return;
+	if (cpu_has_feature(CPU_FTR_1T_SEGMENT)) {
+		if ((GET_ESID_1T(pc) == GET_ESID_1T(unmapped_base))
+		    || (GET_ESID_1T(stack) == GET_ESID_1T(unmapped_base)))
+			return;
+	} else
+		if ((GET_ESID(pc) == GET_ESID(unmapped_base))
+		    || (GET_ESID(stack) == GET_ESID(unmapped_base)))
+			return;
 
 	if (is_kernel_addr(unmapped_base))
 		return;

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help