All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] MIPS: jump_label: Remove redundant nops
@ 2019-04-05 22:50 Paul Burton
  2019-04-05 22:50 ` [PATCH 2/3] MIPS: jump_label: Use compact branches for >= r6 Paul Burton
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Paul Burton @ 2019-04-05 22:50 UTC (permalink / raw)
  To: linux-mips; +Cc: Paul Burton

Both arch_static_branch() & arch_static_branch_jump() emit a control
transfer instruction (ie. branch or jump) without disabling assembler
re-ordering. As such the assembler will automatically fill their delay
slots.

Both functions follow their branch or jump with an explicit nop that at
first appears to be there to fill the delay slot, but given that the
assembler will do that the explicit nops serve no purpose & we end up
with our branch or jump followed by 2 nops. Remove the redundant nops.

Signed-off-by: Paul Burton <paul.burton@mips.com>
---

 arch/mips/include/asm/jump_label.h | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/arch/mips/include/asm/jump_label.h b/arch/mips/include/asm/jump_label.h
index e4456e450f94..df04449b261b 100644
--- a/arch/mips/include/asm/jump_label.h
+++ b/arch/mips/include/asm/jump_label.h
@@ -29,7 +29,7 @@
 static __always_inline bool arch_static_branch(struct static_key *key, bool branch)
 {
 	asm_volatile_goto("1:\t" B_INSN " 2f\n\t"
-		"2:\tnop\n\t"
+		"2:\t.insn\n\t"
 		".pushsection __jump_table,  \"aw\"\n\t"
 		WORD_INSN " 1b, %l[l_yes], %0\n\t"
 		".popsection\n\t"
@@ -43,7 +43,6 @@ static __always_inline bool arch_static_branch(struct static_key *key, bool bran
 static __always_inline bool arch_static_branch_jump(struct static_key *key, bool branch)
 {
 	asm_volatile_goto("1:\tj %l[l_yes]\n\t"
-		"nop\n\t"
 		".pushsection __jump_table,  \"aw\"\n\t"
 		WORD_INSN " 1b, %l[l_yes], %0\n\t"
 		".popsection\n\t"
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/3] MIPS: jump_label: Use compact branches for >= r6
  2019-04-05 22:50 [PATCH 1/3] MIPS: jump_label: Remove redundant nops Paul Burton
@ 2019-04-05 22:50 ` Paul Burton
  2019-04-05 22:50 ` [PATCH 3/3] MIPS: generic: Enable CONFIG_JUMP_LABEL Paul Burton
  2019-04-15 17:37 ` [PATCH 1/3] MIPS: jump_label: Remove redundant nops Paul Burton
  2 siblings, 0 replies; 4+ messages in thread
From: Paul Burton @ 2019-04-05 22:50 UTC (permalink / raw)
  To: linux-mips; +Cc: Paul Burton

MIPSr6 introduced compact branches which have no delay slots. Make use
of them for jump labels in order to avoid the need for a nop to fill the
branch or jump delay slot, saving 4 bytes of code for each static branch.

Signed-off-by: Paul Burton <paul.burton@mips.com>
---

 arch/mips/include/asm/jump_label.h | 12 +++++++++---
 arch/mips/kernel/jump_label.c      | 30 +++++++++++++++++++++++++-----
 2 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/arch/mips/include/asm/jump_label.h b/arch/mips/include/asm/jump_label.h
index df04449b261b..3185fd3220ec 100644
--- a/arch/mips/include/asm/jump_label.h
+++ b/arch/mips/include/asm/jump_label.h
@@ -11,6 +11,7 @@
 #ifndef __ASSEMBLY__
 
 #include <linux/types.h>
+#include <asm/isa-rev.h>
 
 #define JUMP_LABEL_NOP_SIZE 4
 
@@ -21,9 +22,14 @@
 #endif
 
 #ifdef CONFIG_CPU_MICROMIPS
-#define B_INSN "b32"
+# define B_INSN "b32"
+# define J_INSN "j32"
+#elif MIPS_ISA_REV >= 6
+# define B_INSN "bc"
+# define J_INSN "bc"
 #else
-#define B_INSN "b"
+# define B_INSN "b"
+# define J_INSN "j"
 #endif
 
 static __always_inline bool arch_static_branch(struct static_key *key, bool branch)
@@ -42,7 +48,7 @@ static __always_inline bool arch_static_branch(struct static_key *key, bool bran
 
 static __always_inline bool arch_static_branch_jump(struct static_key *key, bool branch)
 {
-	asm_volatile_goto("1:\tj %l[l_yes]\n\t"
+	asm_volatile_goto("1:\t" J_INSN " %l[l_yes]\n\t"
 		".pushsection __jump_table,  \"aw\"\n\t"
 		WORD_INSN " 1b, %l[l_yes], %0\n\t"
 		".popsection\n\t"
diff --git a/arch/mips/kernel/jump_label.c b/arch/mips/kernel/jump_label.c
index ab943927f97a..662c8db9f45b 100644
--- a/arch/mips/kernel/jump_label.c
+++ b/arch/mips/kernel/jump_label.c
@@ -40,18 +40,38 @@ void arch_jump_label_transform(struct jump_entry *e,
 {
 	union mips_instruction *insn_p;
 	union mips_instruction insn;
+	long offset;
 
 	insn_p = (union mips_instruction *)msk_isa16_mode(e->code);
 
-	/* Jump only works within an aligned region its delay slot is in. */
-	BUG_ON((e->target & ~J_RANGE_MASK) != ((e->code + 4) & ~J_RANGE_MASK));
-
 	/* Target must have the right alignment and ISA must be preserved. */
 	BUG_ON((e->target & J_ALIGN_MASK) != J_ISA_BIT);
 
 	if (type == JUMP_LABEL_JMP) {
-		insn.j_format.opcode = J_ISA_BIT ? mm_j32_op : j_op;
-		insn.j_format.target = e->target >> J_RANGE_SHIFT;
+		if (!IS_ENABLED(CONFIG_CPU_MICROMIPS) && MIPS_ISA_REV >= 6) {
+			offset = e->target - ((unsigned long)insn_p + 4);
+			offset >>= 2;
+
+			/*
+			 * The branch offset must fit in the instruction's 26
+			 * bit field.
+			 */
+			WARN_ON((offset >= BIT(25)) ||
+				(offset < -(long)BIT(25)));
+
+			insn.j_format.opcode = bc6_op;
+			insn.j_format.target = offset;
+		} else {
+			/*
+			 * Jump only works within an aligned region its delay
+			 * slot is in.
+			 */
+			WARN_ON((e->target & ~J_RANGE_MASK) !=
+				((e->code + 4) & ~J_RANGE_MASK));
+
+			insn.j_format.opcode = J_ISA_BIT ? mm_j32_op : j_op;
+			insn.j_format.target = e->target >> J_RANGE_SHIFT;
+		}
 	} else {
 		insn.word = 0; /* nop */
 	}
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 3/3] MIPS: generic: Enable CONFIG_JUMP_LABEL
  2019-04-05 22:50 [PATCH 1/3] MIPS: jump_label: Remove redundant nops Paul Burton
  2019-04-05 22:50 ` [PATCH 2/3] MIPS: jump_label: Use compact branches for >= r6 Paul Burton
@ 2019-04-05 22:50 ` Paul Burton
  2019-04-15 17:37 ` [PATCH 1/3] MIPS: jump_label: Remove redundant nops Paul Burton
  2 siblings, 0 replies; 4+ messages in thread
From: Paul Burton @ 2019-04-05 22:50 UTC (permalink / raw)
  To: linux-mips; +Cc: Paul Burton

Enable CONFIG_JUMP_LABEL for generic configs in order to better optimize
at runtime and get better test coverage for our jump label support.

Signed-off-by: Paul Burton <paul.burton@mips.com>
---

 arch/mips/configs/generic_defconfig | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/mips/configs/generic_defconfig b/arch/mips/configs/generic_defconfig
index 5d80521e5d5a..714169e411cf 100644
--- a/arch/mips/configs/generic_defconfig
+++ b/arch/mips/configs/generic_defconfig
@@ -26,6 +26,7 @@ CONFIG_MIPS_CPS=y
 CONFIG_HIGHMEM=y
 CONFIG_NR_CPUS=16
 CONFIG_MIPS_O32_FP64_SUPPORT=y
+CONFIG_JUMP_LABEL=y
 CONFIG_MODULES=y
 CONFIG_MODULE_UNLOAD=y
 CONFIG_TRIM_UNUSED_KSYMS=y
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/3] MIPS: jump_label: Remove redundant nops
  2019-04-05 22:50 [PATCH 1/3] MIPS: jump_label: Remove redundant nops Paul Burton
  2019-04-05 22:50 ` [PATCH 2/3] MIPS: jump_label: Use compact branches for >= r6 Paul Burton
  2019-04-05 22:50 ` [PATCH 3/3] MIPS: generic: Enable CONFIG_JUMP_LABEL Paul Burton
@ 2019-04-15 17:37 ` Paul Burton
  2 siblings, 0 replies; 4+ messages in thread
From: Paul Burton @ 2019-04-15 17:37 UTC (permalink / raw)
  To: Paul Burton; +Cc: linux-mips, Paul Burton, linux-mips

Hello,

Paul Burton wrote:
> Both arch_static_branch() & arch_static_branch_jump() emit a control
> transfer instruction (ie. branch or jump) without disabling assembler
> re-ordering. As such the assembler will automatically fill their delay
> slots.
> 
> Both functions follow their branch or jump with an explicit nop that at
> first appears to be there to fill the delay slot, but given that the
> assembler will do that the explicit nops serve no purpose & we end up
> with our branch or jump followed by 2 nops. Remove the redundant nops.
> 
> Signed-off-by: Paul Burton <paul.burton@mips.com>

Series applied to mips-next.

Thanks,
    Paul

[ This message was auto-generated; if you believe anything is incorrect
  then please email paul.burton@mips.com to report it. ]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2019-04-15 17:37 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-05 22:50 [PATCH 1/3] MIPS: jump_label: Remove redundant nops Paul Burton
2019-04-05 22:50 ` [PATCH 2/3] MIPS: jump_label: Use compact branches for >= r6 Paul Burton
2019-04-05 22:50 ` [PATCH 3/3] MIPS: generic: Enable CONFIG_JUMP_LABEL Paul Burton
2019-04-15 17:37 ` [PATCH 1/3] MIPS: jump_label: Remove redundant nops Paul Burton

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.