Received: from mail.onstor.com (66.201.51.107) by exch1.onstor.net
 (10.0.0.225) with Microsoft SMTP Server id 8.1.311.2; Tue, 12 May 2009
 15:47:20 -0700
Received: from psmtp.com ([64.18.0.51]) by mail.onstor.com with Microsoft
 SMTPSVC(6.0.3790.3959);	 Tue, 12 May 2009 15:47:19 -0700
Received: from source ([213.58.128.207]) by exprod5mx255.postini.com
 ([64.18.4.11]) with SMTP;	Tue, 12 May 2009 15:47:19 PDT
Received: from localhost.localdomain ([127.0.0.1]:45392 "EHLO
	ftp.linux-mips.org" rhost-flags-OK-OK-OK-FAIL) by ftp.linux-mips.org	with
 ESMTP id S20025456AbZELWrR (ORCPT	<rfc822;andy.sharp@onstor.com>); Tue, 12
 May 2009 23:47:17 +0100
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 12 May 2009 23:47:00
 +0100 (BST)
Received: from mail3.caviumnetworks.com ([12.108.191.235]:48258 "EHLO
	mail3.caviumnetworks.com" rhost-flags-OK-OK-OK-OK)	by ftp.linux-mips.org with
 ESMTP id S20026351AbZELWqw (ORCPT	<rfc822;linux-mips@linux-mips.org>); Tue,
 12 May 2009 23:46:52 +0100
Received: from exch4.caveonetworks.com (Not Verified[192.168.16.23]) by
 mail3.caviumnetworks.com with MailMarshal (v6,2,2,3503)	id <B4a09fc2e0000>;
 Tue, 12 May 2009 18:46:09 -0400
Received: from exch4.caveonetworks.com ([192.168.16.23]) by
 exch4.caveonetworks.com with Microsoft SMTPSVC(6.0.3790.3959);	 Tue, 12 May
 2009 15:45:20 -0700
Received: from dd1.caveonetworks.com ([64.169.86.201]) by
 exch4.caveonetworks.com over TLS secured channel with Microsoft
 SMTPSVC(6.0.3790.3959);	 Tue, 12 May 2009 15:45:20 -0700
Received: from dd1.caveonetworks.com (localhost.localdomain [127.0.0.1])	by
 dd1.caveonetworks.com (8.14.2/8.14.2) with ESMTP id n4CMjH4n004035;	Tue, 12
 May 2009 15:45:17 -0700
Received: (from ddaney@localhost)	by dd1.caveonetworks.com
 (8.14.2/8.14.2/Submit) id n4CMjGOH004033;	Tue, 12 May 2009 15:45:16 -0700
From: David Daney <ddaney@caviumnetworks.com>
To: "linux-mips@linux-mips.org" <linux-mips@linux-mips.org>,
	"ralf@linux-mips.org" <ralf@linux-mips.org>
CC: David Daney <ddaney@caviumnetworks.com>
Sender: "linux-mips-bounce@linux-mips.org" <linux-mips-bounce@linux-mips.org>
Date: Tue, 12 May 2009 15:45:16 -0700
Subject: [PATCH] MIPS: Don't branch to eret in TLB refill.
Thread-Topic: [PATCH] MIPS: Don't branch to eret in TLB refill.
Thread-Index: AcnTU5us3G+KSiCbRe2YYSZewtdSeg==
Message-ID: <1242168316-4009-1-git-send-email-ddaney@caviumnetworks.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Exchange-Organization-AuthAs: Internal
X-MS-Exchange-Organization-AuthMechanism: 0b
X-MS-Exchange-Organization-AuthSource: exch1.onstor.net
X-MS-Has-Attach:
X-Auto-Response-Suppress: All
X-MS-TNEF-Correlator:
x-originalarrivaltime: 12 May 2009 22:45:20.0395 (UTC)
 FILETIME=[5420C5B0:01C9D353]
x-ems-stamp: dZ7lZ3Zyz1UvmVnjdHgIhA==
x-ems-proccessed: 2K3Xl1OQTInXD6xxuA8z3Q==
errors-to: linux-mips-bounce@linux-mips.org
x-pstn-neptune: 0/0/0.00/0
x-pstn-levels: (S:93.77399/99.90000 CV:99.9000 FC:95.5390 LC:95.5390
 R:95.9108 P:95.9108 M:97.0282 C:98.6951 )
x-list: linux-mips
x-archive-position: 22696
x-ecartis-version: Ecartis v1.0.0
x-original-sender: ddaney@caviumnetworks.com
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0

If the TLB refill handler is too bit and needs to be split, there is
no need to branch around the split if the branch target would be an
eret.  Since the eret returns from the handler, control flow never
passes it.  A branch to an eret is equivalent to the eret itself.

Signed-off-by: David Daney <ddaney@caviumnetworks.com>
---
 arch/mips/mm/tlbex.c |   50 +++++++++++++++++++++++++++++++++-------------=
----
 1 files changed, 33 insertions(+), 17 deletions(-)

diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c
index 4dc4f3e..ffa7104 100644
--- a/arch/mips/mm/tlbex.c
+++ b/arch/mips/mm/tlbex.c
@@ -656,6 +656,7 @@ static void __cpuinit build_r4000_tlb_refill_handler(vo=
id)
 	struct uasm_reloc *r =3D relocs;
 	u32 *f;
 	unsigned int final_len;
+	int split_on_eret;
=20
 	memset(tlb_handler, 0, sizeof(tlb_handler));
 	memset(labels, 0, sizeof(labels));
@@ -684,6 +685,13 @@ static void __cpuinit build_r4000_tlb_refill_handler(v=
oid)
 	build_update_entries(&p, K0, K1);
 	build_tlb_write_entry(&p, &l, &r, tlb_random);
 	uasm_l_leave(&l, p);
+
+	/*
+	 * Check to see if the eret will be the last instruction
+	 * before the split.  If it is, there is no need to branch
+	 * around the split, as we are returning.
+	 */
+	split_on_eret =3D (p - tlb_handler =3D=3D 31);
 	uasm_i_eret(&p); /* return from trap */
=20
 #ifdef CONFIG_64BIT
@@ -723,28 +731,36 @@ static void __cpuinit build_r4000_tlb_refill_handler(=
void)
 		uasm_copy_handler(relocs, labels, tlb_handler, p, f);
 		final_len =3D p - tlb_handler;
 	} else {
-		u32 *split =3D tlb_handler + 30;
-
-		/*
-		 * Find the split point.
-		 */
-		if (uasm_insn_has_bdelay(relocs, split - 1))
-			split--;
+		u32 *split;
+		if (split_on_eret) {
+			split =3D tlb_handler + 32;
+		} else {
+			split =3D tlb_handler + 30;
+
+			/*
+			 * Find the split point.
+			 */
+			if (uasm_insn_has_bdelay(relocs, split - 1))
+				split--;
+		}
=20
 		/* Copy first part of the handler. */
 		uasm_copy_handler(relocs, labels, tlb_handler, split, f);
 		f +=3D split - tlb_handler;
=20
-		/* Insert branch. */
-		uasm_l_split(&l, final_handler);
-		uasm_il_b(&f, &r, label_split);
-		if (uasm_insn_has_bdelay(relocs, split))
-			uasm_i_nop(&f);
-		else {
-			uasm_copy_handler(relocs, labels, split, split + 1, f);
-			uasm_move_labels(labels, f, f + 1, -1);
-			f++;
-			split++;
+		if (!split_on_eret) {
+			/* Insert branch. */
+			uasm_l_split(&l, final_handler);
+			uasm_il_b(&f, &r, label_split);
+			if (uasm_insn_has_bdelay(relocs, split))
+				uasm_i_nop(&f);
+			else {
+				uasm_copy_handler(relocs, labels,
+						  split, split + 1, f);
+				uasm_move_labels(labels, f, f + 1, -1);
+				f++;
+				split++;
+			}
 		}
=20
 		/* Copy the rest of the handler. */
--=20
1.6.0.6


