[DTrace-devel] [PATCH 4/5] dynvar: ensure there is always space for at least one dynvar if needed

Kris Van Hees kris.van.hees at oracle.com
Mon May 1 19:52:15 UTC 2023


When dynamic variables (or associative arrays) are used, raise the
dynvarsize option value if needed to ensure there is room for at least
one dynamic variable (or associative array element).

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_bpf.c                            | 10 ++++--
 .../assocs/tst.dynvarsize-too-small.d         | 31 +++++++++++++++++++
 .../assocs/tst.dynvarsize-too-small.r         |  6 ++++
 3 files changed, 44 insertions(+), 3 deletions(-)
 create mode 100644 test/unittest/assocs/tst.dynvarsize-too-small.d
 create mode 100644 test/unittest/assocs/tst.dynvarsize-too-small.r

diff --git a/libdtrace/dt_bpf.c b/libdtrace/dt_bpf.c
index 0f33f245..e19833bd 100644
--- a/libdtrace/dt_bpf.c
+++ b/libdtrace/dt_bpf.c
@@ -846,9 +846,13 @@ gmap_create_dvars(dtrace_hdl_t *dtp)
 	if (dtp->dt_maxdvarsize == 0)
 		return 0;
 
-	nelems = dtp->dt_options[DTRACEOPT_DYNVARSIZE] / dtp->dt_maxdvarsize;
-	if (nelems == 0)
-		return 0;
+	nelems = dtp->dt_options[DTRACEOPT_DYNVARSIZE] /
+		 (dtp->dt_maxtuplesize + dtp->dt_maxdvarsize);
+	if (nelems == 0) {
+		dtp->dt_options[DTRACEOPT_DYNVARSIZE] =
+				dtp->dt_maxtuplesize + dtp->dt_maxdvarsize;
+		nelems = 1;
+	}
 
 	if (create_gmap(dtp, "dvars", BPF_MAP_TYPE_HASH, sizeof(uint64_t),
 			dtp->dt_maxdvarsize, nelems) == -1)
diff --git a/test/unittest/assocs/tst.dynvarsize-too-small.d b/test/unittest/assocs/tst.dynvarsize-too-small.d
new file mode 100644
index 00000000..27539194
--- /dev/null
+++ b/test/unittest/assocs/tst.dynvarsize-too-small.d
@@ -0,0 +1,31 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+/*
+ * ASSERTION: If dynvarsize is too small to hold a single dynamic variable, the
+ *	      size is increased automatically.
+ *
+ * SECTION: Aggregations/Aggregations
+ */
+
+/*
+ * Storing an int (4 byte integer) in an associative array indexed by an int
+ * requires at least 20 bytes of dynamic variable storage.
+ */
+#pragma D option quietresize=no
+#pragma D option dynvarsize=15
+
+BEGIN
+{
+	a[1] = 1;
+	exit(0);
+}
+
+ERROR
+{
+	exit(1);
+}
diff --git a/test/unittest/assocs/tst.dynvarsize-too-small.r b/test/unittest/assocs/tst.dynvarsize-too-small.r
new file mode 100644
index 00000000..b236110f
--- /dev/null
+++ b/test/unittest/assocs/tst.dynvarsize-too-small.r
@@ -0,0 +1,6 @@
+                   FUNCTION:NAME
+                          :BEGIN 
+
+-- @@stderr --
+dtrace: script 'test/unittest/assocs/tst.dynvarsize-too-small.d' matched 2 probes
+dtrace: dynamic variable size raised to 20 
-- 
2.39.1




More information about the DTrace-devel mailing list