[DTrace-devel] [PATCH 16/20] Build the global strtab once
Eugene Loh
eugene.loh at oracle.com
Fri Jun 4 12:51:05 PDT 2021
Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
Looks good, but now the comment block preceding the changed code in
libdtrace/dt_bpf.c needs to be updated.
And in libdtrace/dt_as.c, in the associated comment block, might as well
fix s/ny/by/.
And as I mentioned in my review of "Load the global string table data
into the strtab BPF map", should these two patches be squashed?
On 6/2/21 1:48 AM, Kris Van Hees wrote:
> The global table of string constants was being re-created after every
> compilation even though we only ever use it once, when we create the
> BPF maps (right before loading BPF programs).
>
> Instead, we now generate the global strtab during the BPF maps
> creation.
>
> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
> libdtrace/dt_as.c | 15 +++------------
> libdtrace/dt_bpf.c | 17 +++++++----------
> 2 files changed, 10 insertions(+), 22 deletions(-)
>
> diff --git a/libdtrace/dt_as.c b/libdtrace/dt_as.c
> index 760f281c..d88fe65c 100644
> --- a/libdtrace/dt_as.c
> +++ b/libdtrace/dt_as.c
> @@ -567,15 +567,9 @@ fail:
> * We keep the string table around (dtp->dt_csstab) because further
> * compilations may add more strings. We will load a consolidated
> * compiled string table into a strtab BPF map so it can be used ny
> - * all BPF programs we will be loading. Since each DIFO will have a
> - * string table that comprises the strings of all DIFOs before it along
> - * with any new ones, we simply assign the latest (and most complete)
> - * string table to dtp->dt_strtab (and the size as dtp->dt_strlen), so
> - * that when we are ready to load and execute programs, we know we have
> - * the latest and greatest string table to work with.
> - *
> - * Note that this means that we should *not* free dtp->dt_strtab later
> - * because it will be free'd when the DIFO is destroyed.
> + * all BPF programs we will be loading. Therefore, each DIFO will have
> + * a string table that comprises the strings of all DIFOs before it
> + * along with any new ones.
> */
> dp->dtdo_strlen = dt_strtab_size(dtp->dt_ccstab);
> if (dp->dtdo_strlen > 0) {
> @@ -586,9 +580,6 @@ fail:
> dt_strtab_write(dtp->dt_ccstab,
> (dt_strtab_write_f *)dt_strtab_copystr,
> dp->dtdo_strtab);
> -
> - dtp->dt_strtab = dp->dtdo_strtab;
> - dtp->dt_strlen = dp->dtdo_strlen;
> } else
> dp->dtdo_strtab = NULL;
>
> diff --git a/libdtrace/dt_bpf.c b/libdtrace/dt_bpf.c
> index 41bd8ecd..067bf0d5 100644
> --- a/libdtrace/dt_bpf.c
> +++ b/libdtrace/dt_bpf.c
> @@ -256,16 +256,13 @@ dt_bpf_gmap_create(dtrace_hdl_t *dtp)
> * We may need to create a final copy of the string table because it is
> * possible entries were added after the last clause was compiled.
> */
> - if (dtp->dt_strlen < dt_strtab_size(dtp->dt_ccstab)) {
> - dtp->dt_strlen = dt_strtab_size(dtp->dt_ccstab);
> - dtp->dt_strtab = dt_zalloc(dtp, dtp->dt_strlen);
> - if (dtp->dt_strtab == NULL)
> - return dt_set_errno(dtp, EDT_NOMEM);
> -
> - dt_strtab_write(dtp->dt_ccstab,
> - (dt_strtab_write_f *)dt_strtab_copystr,
> - dtp->dt_strtab);
> - }
> + dtp->dt_strlen = dt_strtab_size(dtp->dt_ccstab);
> + dtp->dt_strtab = dt_zalloc(dtp, dtp->dt_strlen);
> + if (dtp->dt_strtab == NULL)
> + return dt_set_errno(dtp, EDT_NOMEM);
> +
> + dt_strtab_write(dtp->dt_ccstab, (dt_strtab_write_f *)dt_strtab_copystr,
> + dtp->dt_strtab);
>
> st_mapfd = create_gmap(dtp, "strtab", BPF_MAP_TYPE_ARRAY,
> sizeof(uint32_t), dtp->dt_strlen, 1);
More information about the DTrace-devel
mailing list