[DTrace-devel] [PATCH 07/20] Load the global string table data into the strtab BPF map

Kris Van Hees kris.van.hees at oracle.com
Tue Jun 1 22:47:53 PDT 2021


Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_bpf.c | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/libdtrace/dt_bpf.c b/libdtrace/dt_bpf.c
index 1f31f845..67c36e97 100644
--- a/libdtrace/dt_bpf.c
+++ b/libdtrace/dt_bpf.c
@@ -198,7 +198,7 @@ int
 dt_bpf_gmap_create(dtrace_hdl_t *dtp)
 {
 	int		gvarsz, lvarsz, tvarc, aggsz;
-	int		ci_mapfd;
+	int		ci_mapfd, st_mapfd;
 	uint32_t	key = 0;
 
 	/* If we already created the global maps, return success. */
@@ -251,8 +251,24 @@ dt_bpf_gmap_create(dtrace_hdl_t *dtp)
 				roundup(dtp->dt_maxreclen, 8), 1) == -1)
 		return -1;		/* dt_errno is set for us */
 
-	if (create_gmap(dtp, "strtab", BPF_MAP_TYPE_ARRAY,
-			sizeof(uint32_t), dtp->dt_strlen, 1) == -1)
+	/*
+	 * 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);
+	}
+
+	st_mapfd = create_gmap(dtp, "strtab", BPF_MAP_TYPE_ARRAY,
+			       sizeof(uint32_t), dtp->dt_strlen, 1);
+	if (st_mapfd == -1)
 		return -1;		/* dt_errno is set for us */
 
 	if (gvarsz > 0 &&
@@ -273,6 +289,9 @@ dt_bpf_gmap_create(dtrace_hdl_t *dtp)
 	/* Populate the 'cpuinfo' map. */
 	dt_bpf_map_update(ci_mapfd, &key, dtp->dt_conf.cpus);
 
+	/* Populate the 'strtab' map. */
+	dt_bpf_map_update(st_mapfd, &key, dtp->dt_strtab);
+
 	/* Set some task_struct offsets in state. */
 	if (set_task_offsets(dtp))
 		return dt_set_errno(dtp, EDT_CTF);
-- 
2.31.1




More information about the DTrace-devel mailing list