new file mode 100755
@@ -0,0 +1,5 @@
+#!/usr/bin/env python3
+
+import tracecruncher.ftracepy as ft
+
+ft.reset_affinity();
new file mode 100755
@@ -0,0 +1,5 @@
+#!/usr/bin/env python3
+
+import tracecruncher.ftracepy as ft
+
+ft.set_affinity(cpus=["0-1","3"]);
@@ -2394,6 +2394,99 @@ PyObject *PyFtrace_hist(PyObject *self, PyObject *args,
return NULL;
}
+PyObject *PyFtrace_reset_affinity(PyObject *self, PyObject *args,
+ PyObject *kwargs)
+{
+ struct tracefs_instance *instance;
+ static char *kwlist[] = {"instance", NULL};
+ PyObject *py_inst = NULL;
+ int ret;
+
+ if (!PyArg_ParseTupleAndKeywords(args,
+ kwargs,
+ "|O",
+ kwlist,
+ &py_inst)) {
+ return NULL;
+ }
+
+ if (!get_optional_instance(py_inst, &instance))
+ goto err;
+
+ /* NULL for CPUs will set all available CPUS */
+ ret = tracefs_instance_set_affinity(instance, NULL);
+ if (ret < 0) {
+ PyErr_SetString(TRACECRUNCHER_ERROR,
+ "Failed to reset tracing affinity.");
+ goto err;
+ }
+
+ Py_RETURN_NONE;
+err:
+ return NULL;
+}
+
+PyObject *PyFtrace_set_affinity(PyObject *self, PyObject *args,
+ PyObject *kwargs)
+{
+ struct tracefs_instance *instance;
+ static char *kwlist[] = {"cpus", "instance", NULL};
+ PyObject *py_cpus;
+ PyObject *py_inst = NULL;
+ const char *cpu_str;
+ int ret;
+
+ if (!init_print_seq())
+ return false;
+
+ if (!PyArg_ParseTupleAndKeywords(args,
+ kwargs,
+ "O|O",
+ kwlist,
+ &py_cpus,
+ &py_inst)) {
+ return NULL;
+ }
+
+ if (PyUnicode_Check(py_cpus)) {
+ cpu_str = (const char *)PyUnicode_DATA(py_cpus);
+ if (trace_seq_puts(&seq, cpu_str) < 0)
+ goto err_seq;
+ } else if (PyList_CheckExact(py_cpus)) {
+ int i, n = PyList_Size(py_cpus);
+
+ for (i = 0; i < n; ++i) {
+ cpu_str = str_from_list(py_cpus, i);
+ if (i)
+ trace_seq_putc(&seq, ',');
+ if (trace_seq_puts(&seq, cpu_str) < 0)
+ goto err_seq;
+ }
+ } else {
+ PyErr_SetString(TRACECRUNCHER_ERROR,
+ "Invalid \"cpus\" type.");
+ goto err;
+ }
+
+ if (!get_optional_instance(py_inst, &instance))
+ goto err;
+
+ trace_seq_terminate(&seq);
+ ret = tracefs_instance_set_affinity(instance, seq.buffer);
+ if (ret < 0) {
+ PyErr_SetString(TRACECRUNCHER_ERROR,
+ "Invalid \"cpus\" argument.");
+ goto err;
+ }
+
+ Py_RETURN_NONE;
+err_seq:
+ PyErr_SetString(TRACECRUNCHER_ERROR,
+ "Internal processing string error.");
+err:
+ return NULL;
+}
+
PyObject *PyFtrace_set_ftrace_loglevel(PyObject *self, PyObject *args,
PyObject *kwargs)
{
@@ -208,6 +208,12 @@ PyObject *PyFtrace_register_kretprobe(PyObject *self, PyObject *args,
PyObject *PyFtrace_hist(PyObject *self, PyObject *args,
PyObject *kwargs);
+PyObject *PyFtrace_set_affinity(PyObject *self, PyObject *args,
+ PyObject *kwargs);
+
+PyObject *PyFtrace_reset_affinity(PyObject *self, PyObject *args,
+ PyObject *kwargs);
+
PyObject *PyFtrace_set_ftrace_loglevel(PyObject *self, PyObject *args,
PyObject *kwargs);
@@ -372,11 +372,21 @@ static PyMethodDef ftracepy_methods[] = {
METH_VARARGS | METH_KEYWORDS,
"Define a kretprobe."
},
+ {"reset_affinity",
+ (PyCFunction) PyFtrace_reset_affinity,
+ METH_VARARGS | METH_KEYWORDS,
+ "Set an instance tracing affinity to all CPUs"
+ },
{"hist",
(PyCFunction) PyFtrace_hist,
METH_VARARGS | METH_KEYWORDS,
"Define a histogram."
},
+ {"set_affinity",
+ (PyCFunction) PyFtrace_set_affinity,
+ METH_VARARGS | METH_KEYWORDS,
+ "Return tracing affinity of an instance."
+ },
{"set_ftrace_loglevel",
(PyCFunction) PyFtrace_set_ftrace_loglevel,
METH_VARARGS | METH_KEYWORDS,