@@ -213,4 +213,5 @@ void tracefs_trace_pipe_stop(struct tracefs_instance *instance);
int tracefs_kprobe_raw(const char *system, const char *event,
const char *addr, const char *format);
int tracefs_kprobe_clear(bool force);
+int tracefs_kprobe_clear_probe(const char *system, const char *event, bool force);
#endif /* _TRACE_FS_H */
@@ -204,3 +204,39 @@ int tracefs_kprobe_clear(bool force)
free_instance_list(list);
return ret;
}
+
+int tracefs_kprobe_clear_probe(const char *system, const char *event, bool force)
+{
+ struct instance_list *list = NULL;
+ struct instance_list **plist = &list;
+ char *content;
+ int ret;
+
+ if (!system)
+ system = "kprobes";
+
+ ret = asprintf(&content, "-:%s/%s", system, event);
+ if (ret < 0)
+ return -1;
+
+ /*
+ * Since we know we are disabling a specific event, try
+ * to disable it first before clearing it.
+ */
+ if (force) {
+ ret = tracefs_instances_walk(build_instances, &plist);
+ if (ret < 0)
+ goto out;
+
+ ret = disable_events(system, event, list);
+ if (ret < 0)
+ goto out;
+ }
+
+ ret = tracefs_instance_file_append(NULL, KPROBE_EVENTS, content);
+ out:
+ free(content);
+ free_instance_list(list);
+
+ return ret < 0 ? -1 : 0;
+}