[DTrace-devel] [PATCH] Move free(%r0) in stack() actions

eugene.loh at oracle.com eugene.loh at oracle.com
Sat Dec 4 00:58:16 UTC 2021


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

We should free BPF_REG_0 as soon as it has been used for the last
time and before calling dt_cg_probe_error().

Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
 libdtrace/dt_cg.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 13feae17..16690037 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -1641,10 +1641,10 @@ dt_cg_act_stack(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
 	emit(dlp,  BPF_CALL_HELPER(BPF_FUNC_get_stack));
 	dt_regset_free_args(drp);
 	emit(dlp,  BPF_BRANCH_IMM(BPF_JSGE, BPF_REG_0, 0, lbl_valid));
+	dt_regset_free(drp, BPF_REG_0);
 	dt_cg_probe_error(pcb, -1, DTRACEFLT_BADSTACK, 0);
 	emitl(dlp, lbl_valid,
 		   BPF_NOP());
-	dt_regset_free(drp, BPF_REG_0);
 }
 
 static void
@@ -1811,10 +1811,10 @@ dt_cg_act_ustack(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
 	emit(dlp,  BPF_CALL_HELPER(BPF_FUNC_get_stack));
 	dt_regset_free_args(drp);
 	emit(dlp,  BPF_BRANCH_IMM(BPF_JSGE, BPF_REG_0, 0, lbl_valid));
+	dt_regset_free(drp, BPF_REG_0);
 	dt_cg_probe_error(pcb, -1, DTRACEFLT_BADSTACK, 0);
 	emitl(dlp, lbl_valid,
 		   BPF_NOP());
-	dt_regset_free(drp, BPF_REG_0);
 }
 
 typedef void dt_cg_action_f(dt_pcb_t *, dt_node_t *, dtrace_actkind_t);
-- 
2.18.4




More information about the DTrace-devel mailing list