@@ -4354,10 +4354,15 @@ enum filter_type {
FUNC_NOTRACE,
};
+static int filter_command(struct tracefs_instance *instance, const char *cmd)
+{
+ return tracefs_instance_file_append(instance, "set_ftrace_filter", cmd);
+}
+
static int write_func_filter(enum filter_type type, struct buffer_instance *instance,
struct func_list **list)
{
- struct func_list *item;
+ struct func_list *item, *cmds = NULL;
const char *file;
int ret = -1;
int (*filter_function)(struct tracefs_instance *instance, const char *filter,
@@ -4385,6 +4390,12 @@ static int write_func_filter(enum filter_type type, struct buffer_instance *inst
while (*list) {
item = *list;
*list = item->next;
+ /* Do commands separately at the end */
+ if (type == FUNC_FILTER && strstr(item->func, ":")) {
+ item->next = cmds;
+ cmds = item;
+ continue;
+ }
ret = filter_function(instance->tracefs, item->func, item->mod,
TRACEFS_FL_CONTINUE);
if (ret < 0)
@@ -4392,6 +4403,16 @@ static int write_func_filter(enum filter_type type, struct buffer_instance *inst
free(item);
}
ret = filter_function(instance->tracefs, NULL, NULL, 0);
+
+ /* Now add any commands */
+ while (cmds) {
+ item = cmds;
+ cmds = item->next;
+ ret = filter_command(instance->tracefs, item->func);
+ if (ret < 0)
+ goto failed;
+ free(item);
+ }
return ret;
failed:
die("Failed to write %s to %s.\n"