[DTrace-devel] [PATCH v2 3/5] Add -xcpu support to profile provider
eugene.loh at oracle.com
eugene.loh at oracle.com
Thu Jan 11 05:13:31 UTC 2024
From: Eugene Loh <eugene.loh at oracle.com>
Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>
---
libdtrace/dt_prov_profile.c | 13 ++++++++++---
test/unittest/options/tst.cpu-profile.sh | 22 ++++++++++++++++++++++
test/unittest/options/tst.cpu-tick.sh | 22 ++++++++++++++++++++++
3 files changed, 54 insertions(+), 3 deletions(-)
create mode 100755 test/unittest/options/tst.cpu-profile.sh
create mode 100755 test/unittest/options/tst.cpu-tick.sh
diff --git a/libdtrace/dt_prov_profile.c b/libdtrace/dt_prov_profile.c
index 16345d32..0ce541f0 100644
--- a/libdtrace/dt_prov_profile.c
+++ b/libdtrace/dt_prov_profile.c
@@ -33,7 +33,9 @@ static const dtrace_pattr_t pattr = {
{ DTRACE_STABILITY_EVOLVING, DTRACE_STABILITY_EVOLVING, DTRACE_CLASS_COMMON },
};
-#define FDS_CNT(kind) ((kind) == KIND_TICK ? 1 : dtp->dt_conf.num_online_cpus)
+#define FDS_CNT(kind) ((kind) == KIND_TICK || \
+ dtp->dt_options[DTRACEOPT_CPU] != DTRACEOPT_UNSET ? \
+ 1 : dtp->dt_conf.num_online_cpus)
typedef struct profile_probe {
int kind;
uint64_t period;
@@ -274,8 +276,13 @@ static int attach(dtrace_hdl_t *dtp, const dt_probe_t *prp, int bpf_fd)
for (i = 0; i < cnt; i++) {
int j = i, fd;
- /* if there is only one fd, place it at random */
- if (cnt == 1)
+ /*
+ * If -xcpu is set, use that CPU.
+ * If there is only one fd, place it at random.
+ */
+ if (dtp->dt_options[DTRACEOPT_CPU] != DTRACEOPT_UNSET)
+ j = dtp->dt_options[DTRACEOPT_CPU];
+ else if (cnt == 1)
j = rand() % dtp->dt_conf.num_online_cpus;
fd = dt_perf_event_open(&attr, -1, dtp->dt_conf.cpus[j].cpu_id,
diff --git a/test/unittest/options/tst.cpu-profile.sh b/test/unittest/options/tst.cpu-profile.sh
new file mode 100755
index 00000000..6c43a2f5
--- /dev/null
+++ b/test/unittest/options/tst.cpu-profile.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Oracle Linux DTrace.
+# Copyright (c) 2024, 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.
+#
+
+dtrace=$1
+
+nerr=0
+for cpu0 in `awk '/^processor[ ]*: [0-9]*$/ {print $3}' /proc/cpuinfo`; do
+ cpu=`$dtrace $dt_flags -xcpu=$cpu0 -qn 'profile-100ms { trace(cpu); exit(0); }'`
+ echo expected cpu $cpu0 got cpu $cpu
+ if [ `echo $cpu | wc -w` -ne 1 ]; then
+ nerr=$(($nerr + 1))
+ elif [ $(($cpu + 0)) != $cpu0 ]; then
+ nerr=$(($nerr + 1))
+ fi
+done
+
+exit $nerr
diff --git a/test/unittest/options/tst.cpu-tick.sh b/test/unittest/options/tst.cpu-tick.sh
new file mode 100755
index 00000000..9463f3ef
--- /dev/null
+++ b/test/unittest/options/tst.cpu-tick.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+#
+# Oracle Linux DTrace.
+# Copyright (c) 2024, 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.
+#
+
+dtrace=$1
+
+nerr=0
+for cpu0 in `awk '/^processor[ ]*: [0-9]*$/ {print $3}' /proc/cpuinfo`; do
+ cpu=`$dtrace $dt_flags -xcpu=$cpu0 -qn 'tick-100ms { trace(cpu); exit(0); }'`
+ echo expected cpu $cpu0 got cpu $cpu
+ if [ `echo $cpu | wc -w` -ne 1 ]; then
+ nerr=$(($nerr + 1))
+ elif [ $(($cpu + 0)) != $cpu0 ]; then
+ nerr=$(($nerr + 1))
+ fi
+done
+
+exit $nerr
--
2.18.4
More information about the DTrace-devel
mailing list