[DTrace-devel] [PATCH 1/3] Allocate exit label in dt_cg_tramp_prologue rather than each provider
Eugene Loh
eugene.loh at oracle.com
Tue Sep 29 23:04:02 PDT 2020
Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
On 09/29/2020 04:14 PM, Kris Van Hees wrote:
> Every provider implementation was allocating an id for the exit label
> that is used in the trampoline prologue and epilogue. Now the label
> id is allocated in and returned by dt_cg_tramp_prologue() (and its
> *_act() variant). That id is to be passed to dt_cg_tramp_epilogue()
> (or the *_advance() variant) to ensure that the same label is used
> throughout the trampoline.
>
> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
> libdtrace/dt_cg.c | 15 ++++++++++-----
> libdtrace/dt_cg.h | 5 ++---
> libdtrace/dt_prov_dtrace.c | 4 ++--
> libdtrace/dt_prov_fbt.c | 4 ++--
> libdtrace/dt_prov_profile.c | 4 ++--
> libdtrace/dt_prov_sdt.c | 4 ++--
> libdtrace/dt_prov_syscall.c | 4 ++--
> 7 files changed, 22 insertions(+), 18 deletions(-)
>
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index f5ed3f2e..d43cea41 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -38,13 +38,16 @@ static void dt_cg_node(dt_node_t *, dt_irlist_t *, dt_regset_t *);
> *
> * The caller should NOT depend on any register values that exist at the end of
> * the trampoline prologue.
> + *
> + * This function returns a label id to be passed to dt_cg_tramp_epilogue().
> */
> -void
> -dt_cg_tramp_prologue_act(dt_pcb_t *pcb, uint_t lbl_exit, dt_activity_t act)
> +uint_t
> +dt_cg_tramp_prologue_act(dt_pcb_t *pcb, dt_activity_t act)
> {
> dt_irlist_t *dlp = &pcb->pcb_ir;
> dt_ident_t *mem = dt_dlib_get_map(pcb->pcb_hdl, "mem");
> dt_ident_t *state = dt_dlib_get_map(pcb->pcb_hdl, "state");
> + uint_t lbl_exit = dt_irlist_label(dlp);
> struct bpf_insn instr;
>
> assert(mem != NULL);
> @@ -143,12 +146,14 @@ dt_cg_tramp_prologue_act(dt_pcb_t *pcb, uint_t lbl_exit, dt_activity_t act)
> dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
> instr = BPF_STORE(BPF_DW, BPF_REG_FP, DCTX_FP(DCTX_BUF), BPF_REG_0);
> dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
> +
> + return lbl_exit;
> }
>
> -void
> -dt_cg_tramp_prologue(dt_pcb_t *pcb, uint_t lbl_exit)
> +uint_t
> +dt_cg_tramp_prologue(dt_pcb_t *pcb)
> {
> - dt_cg_tramp_prologue_act(pcb, lbl_exit, DT_ACTIVITY_ACTIVE);
> + return dt_cg_tramp_prologue_act(pcb, DT_ACTIVITY_ACTIVE);
> }
>
> static int
> diff --git a/libdtrace/dt_cg.h b/libdtrace/dt_cg.h
> index a4c6fb28..29678e2f 100644
> --- a/libdtrace/dt_cg.h
> +++ b/libdtrace/dt_cg.h
> @@ -19,9 +19,8 @@ extern "C" {
> extern void dt_cg(dt_pcb_t *, dt_node_t *);
> extern void dt_cg_xsetx(dt_irlist_t *, dt_ident_t *, uint_t, int, uint64_t);
> extern dt_irnode_t *dt_cg_node_alloc(uint_t, struct bpf_insn);
> -extern void dt_cg_tramp_prologue_act(dt_pcb_t *pcb, uint_t lbl_exit,
> - dt_activity_t act);
> -extern void dt_cg_tramp_prologue(dt_pcb_t *pcb, uint_t lbl_exit);
> +extern uint_t dt_cg_tramp_prologue_act(dt_pcb_t *pcb, dt_activity_t act);
> +extern uint_t dt_cg_tramp_prologue(dt_pcb_t *pcb);
> extern void dt_cg_tramp_epilogue(dt_pcb_t *pcb, uint_t lbl_exit);
> extern void dt_cg_tramp_epilogue_advance(dt_pcb_t *pcb, uint_t lbl_exit);
>
> diff --git a/libdtrace/dt_prov_dtrace.c b/libdtrace/dt_prov_dtrace.c
> index a0c8d007..1de99ab5 100644
> --- a/libdtrace/dt_prov_dtrace.c
> +++ b/libdtrace/dt_prov_dtrace.c
> @@ -75,7 +75,7 @@ static void trampoline(dt_pcb_t *pcb)
> int i;
> dt_irlist_t *dlp = &pcb->pcb_ir;
> struct bpf_insn instr;
> - uint_t lbl_exit = dt_irlist_label(dlp);
> + uint_t lbl_exit;
> dt_activity_t act;
> int adv_act;
> uint32_t key = 0;
> @@ -114,7 +114,7 @@ static void trampoline(dt_pcb_t *pcb)
> adv_act = 0;
> }
>
> - dt_cg_tramp_prologue_act(pcb, lbl_exit, act);
> + lbl_exit = dt_cg_tramp_prologue_act(pcb, act);
>
> if (key) {
> /*
> diff --git a/libdtrace/dt_prov_fbt.c b/libdtrace/dt_prov_fbt.c
> index 842ba53b..1ba144a5 100644
> --- a/libdtrace/dt_prov_fbt.c
> +++ b/libdtrace/dt_prov_fbt.c
> @@ -164,9 +164,9 @@ static void trampoline(dt_pcb_t *pcb)
> int i;
> dt_irlist_t *dlp = &pcb->pcb_ir;
> struct bpf_insn instr;
> - uint_t lbl_exit = dt_irlist_label(dlp);
> + uint_t lbl_exit;
>
> - dt_cg_tramp_prologue(pcb, lbl_exit);
> + lbl_exit = dt_cg_tramp_prologue(pcb);
>
> /*
> * We cannot assume anything about the state of any registers so set up
> diff --git a/libdtrace/dt_prov_profile.c b/libdtrace/dt_prov_profile.c
> index 0e90351f..8541bee6 100644
> --- a/libdtrace/dt_prov_profile.c
> +++ b/libdtrace/dt_prov_profile.c
> @@ -218,9 +218,9 @@ static void trampoline(dt_pcb_t *pcb)
> int i;
> dt_irlist_t *dlp = &pcb->pcb_ir;
> struct bpf_insn instr;
> - uint_t lbl_exit = dt_irlist_label(dlp);
> + uint_t lbl_exit;
>
> - dt_cg_tramp_prologue(pcb, lbl_exit);
> + lbl_exit = dt_cg_tramp_prologue(pcb);
>
> /*
> * We cannot assume anything about the state of any registers so set up
> diff --git a/libdtrace/dt_prov_sdt.c b/libdtrace/dt_prov_sdt.c
> index fbfdb7fe..4b2ac31b 100644
> --- a/libdtrace/dt_prov_sdt.c
> +++ b/libdtrace/dt_prov_sdt.c
> @@ -396,9 +396,9 @@ static void trampoline(dt_pcb_t *pcb)
> int i;
> dt_irlist_t *dlp = &pcb->pcb_ir;
> struct bpf_insn instr;
> - uint_t lbl_exit = dt_irlist_label(dlp);
> + uint_t lbl_exit;
>
> - dt_cg_tramp_prologue(pcb, lbl_exit);
> + lbl_exit = dt_cg_tramp_prologue(pcb);
>
> /*
> * We cannot assume anything about the state of any registers so set up
> diff --git a/libdtrace/dt_prov_syscall.c b/libdtrace/dt_prov_syscall.c
> index b817f528..341a18c8 100644
> --- a/libdtrace/dt_prov_syscall.c
> +++ b/libdtrace/dt_prov_syscall.c
> @@ -149,9 +149,9 @@ static void trampoline(dt_pcb_t *pcb)
> int i;
> dt_irlist_t *dlp = &pcb->pcb_ir;
> struct bpf_insn instr;
> - uint_t lbl_exit = dt_irlist_label(dlp);
> + uint_t lbl_exit;
>
> - dt_cg_tramp_prologue(pcb, lbl_exit);
> + lbl_exit = dt_cg_tramp_prologue(pcb);
>
> /*
> * We cannot assume anything about the state of any registers so set up
More information about the DTrace-devel
mailing list