[DTrace-devel] [PATCH 14/14] Simplify strcmp.S

eugene.loh at oracle.com eugene.loh at oracle.com
Thu Nov 3 19:52:26 UTC 2022


From: Eugene Loh <eugene.loh at oracle.com>

The code branched depending on whether the first string is known
to be a pointer to D-managed storage.  If we simply assume that
the storage is never D-managed, we can save two instructions as
well as a conditional jump (the bane of the BPF verifier).  The
execution path ends up a couple of instructions either longer or
shorter depending on the case.  The resulting implementation is
closer to that of other string subroutines.

Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
 bpf/strcmp.S | 31 ++++++++++++-------------------
 1 file changed, 12 insertions(+), 19 deletions(-)

diff --git a/bpf/strcmp.S b/bpf/strcmp.S
index cf5e48e6..8147e257 100644
--- a/bpf/strcmp.S
+++ b/bpf/strcmp.S
@@ -88,12 +88,10 @@ dt_strcmp_not :
  *     if (r0 > r6) goto Lsame;
  *     if (r0 > r7) goto Lsame;
  *
- *     r6 = &s[r0];
- *     r7 = &tmp2[r0];
+ *     r7 = tmp2[r0];
  *
- *     if (flags & 1) { } else { bpf_probe_read(tmp1, 1, r6); r6 = tmp1; }
- *     r6 = *r6;
- *     r7 = *r7;
+ *     bpf_probe_read(tmp1, 1, &s[r0]);
+ *     r6 = tmp1[0];
  *
  *     // if all chars are the same, break tie on string length
  * Lsame:
@@ -165,24 +163,19 @@ dt_strcmp :
 	jgt	%r0, %r6, .Lsame	/* if (r0 > r6) goto Lsame */
 	jgt	%r0, %r7, .Lsame	/* if (r0 > r7) goto Lsame */
 
-	ldxdw	%r6, [%fp+-8]
-	add	%r6, %r0		/* r6 = &s[r0] */
 	ldxdw	%r7, [%fp+-32]
-	add	%r7, %r0		/* r7 = &tmp2[r0] */
+	add	%r7, %r0
+	ldxb	%r7, [%r7+0]
+	and	%r7, 0xff		/* r7 = tmp2[r0] */
 
-	jset	%r9, 1, .Ls_is_dptr
 	ldxdw	%r1, [%fp+-24]
 	mov	%r2, 1
-	mov	%r3, %r6
-	mov	%r6, %r1		/* r6 = tmp1 (after the helper call) */
-	call	BPF_FUNC_probe_read	/* bpf_probe_read(tmp1, 1, r6) */
-.Ls_is_dptr:
-
-	ldxb	%r6, [%r6+0]		/* r6 = *r6 */
-	and	%r6, 0xff
-
-	ldxb	%r7, [%r7+0]		/* r7 = *r7 */
-	and	%r7, 0xff
+	ldxdw	%r3, [%fp+-8]
+	add	%r3, %r0
+	call	BPF_FUNC_probe_read	/* bpf_probe_read(tmp1, 1, &s[r0]) */
+	ldxdw	%r6, [%fp+-24]
+	ldxb	%r6, [%r6+0]
+	and	%r6, 0xff		/* r6 = tmp1[0] */
 
 .Lsame:
 	jle	%r6, %r7, 2		/* if (r6 > r7) return +1 */
-- 
2.18.4




More information about the DTrace-devel mailing list