[DTrace-devel] [PATCH] Fix length stored by strjoin() and optimise the implementation
Kris Van Hees
kris.van.hees at oracle.com
Mon Nov 15 17:32:02 UTC 2021
Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
bpf/strjoin.S | 63 +++++++++++++++++++++++++++++----------------------
1 file changed, 36 insertions(+), 27 deletions(-)
diff --git a/bpf/strjoin.S b/bpf/strjoin.S
index da7afa3e..2f78695a 100644
--- a/bpf/strjoin.S
+++ b/bpf/strjoin.S
@@ -19,39 +19,48 @@ dt_strjoin:
mov %r7, %r2 /* %r7 = s1 */
mov %r8, %r3 /* %r8 = s2 */
- mov %r1, %r7
- call dt_strlen
- mov %r6, %r0 /* len = dt_strlen(s1) */
- add %r7, DT_STRLEN_BYTES /* s1 += 2 */
-
- mov %r1, %r8
- call dt_strlen
- add %r6, %r0 /* len += dt_strlen(s2) */
- add %r8, DT_STRLEN_BYTES /* s2 += 2 */
-
- mov %r1, %r6
- mov %r2, %r9
- call dt_strlen_store /* dt_strlen_store(len, dst) */
- add %r9, DT_STRLEN_BYTES /* dst += 2 */
-
lddw %r6, STRSZ
- add %r6, 1
- and %r6, 0xffffffff /* len = (STRSZ + 1) & 0xffffffff */
+ add %r6, 1 /* cnt = STRSZ + 1 */
- mov %r1, %r9
+ add %r1, DT_STRLEN_BYTES /* dst is in %r1 already */
mov %r2, %r6
mov %r3, %r7
- call BPF_FUNC_probe_read_str /* cnt = bpf_probe_read_str(dst, len s1) */
- jslt %r0, 0, .L1 /* if (cnt < 0) goto .L1 */
- jslt %r0, 1, .L2 /* if (cnt < 1) goto .L2 */
- sub %r0, 1 /* cnt-- */
- add %r9, %r0 /* dst += cnt */
- sub %r6, %r0 /* len -= cnt */
-.L2:
+ add %r3, DT_STRLEN_BYTES
+ call BPF_FUNC_probe_read_str /*
+ * rc = probe_read_str(
+ * &dst[DT_STRLEN_BYTES],
+ * cnt,
+ * &s1[DT_STRLEN_BYTES]);
+ */
+ jslt %r0, 0, .Lexit /* if (rc < 0) goto .Lexit; */
+ mov %r7, %r0 /* len = rc */
+ jslt %r7, 1, .Ls2_only /* if (len < 1) goto .Ls2_only; */
+ sub %r7, 1 /* len-- */
+ jsge %r7, %r6, .Lset_len /* if (len >= cnt) goto .Lset_len; */
+
+.Ls2_only:
mov %r1, %r9
+ add %r1, DT_STRLEN_BYTES
+ add %r1, %r7
mov %r2, %r6
+ sub %r2, %r7
mov %r3, %r8
- call BPF_FUNC_probe_read_str /* bpf_probe_read_str(dst, len, s2 */
-.L1:
+ add %r3, DT_STRLEN_BYTES
+ call BPF_FUNC_probe_read_str /*
+ * rc = probe_read_str(
+ * &dst[DT_STRLEN_BYTES + len],
+ * cnt - len,
+ * &s2[DT_STRLEN_BYTES]);
+ */
+ jslt %r0, 0, .Lexit /* if (rc < 0) goto .Lset_len; */
+ add %r7, %r0
+ sub %r7, 1 /* len += rc - 1 */
+
+.Lset_len:
+ mov %r1, %r7
+ mov %r2, %r9
+ call dt_strlen_store /* dt_strlen_store(len - 1, dst) */
+
+.Lexit:
exit
.size dt_strjoin, .-dt_strjoin
--
2.33.0
More information about the DTrace-devel
mailing list