Commit ce4c8f88 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull tracing fixes from Steven Rostedt:
 "Minor fixes to the processing of the bootconfig tree"

* tag 'trace-v5.15-3' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace:
  bootconfig: Rename xbc_node_find_child() to xbc_node_find_subkey()
  tracing/boot: Fix to check the histogram control param is a leaf node
  tracing/boot: Fix trace_boot_hist_add_array() to check array is value
parents a1406e42 5dfe50b0
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -110,7 +110,7 @@ static inline __init bool xbc_node_is_leaf(struct xbc_node *node)
}

/* Tree-based key-value access APIs */
struct xbc_node * __init xbc_node_find_child(struct xbc_node *parent,
struct xbc_node * __init xbc_node_find_subkey(struct xbc_node *parent,
					     const char *key);

const char * __init xbc_node_find_value(struct xbc_node *parent,
@@ -148,7 +148,7 @@ xbc_find_value(const char *key, struct xbc_node **vnode)
 */
static inline struct xbc_node * __init xbc_find_node(const char *key)
{
	return xbc_node_find_child(NULL, key);
	return xbc_node_find_subkey(NULL, key);
}

/**
+18 −19
Original line number Diff line number Diff line
@@ -219,13 +219,12 @@ static int __init
trace_boot_hist_add_array(struct xbc_node *hnode, char **bufp,
			  char *end, const char *key)
{
	struct xbc_node *knode, *anode;
	struct xbc_node *anode;
	const char *p;
	char sep;

	knode = xbc_node_find_child(hnode, key);
	if (knode) {
		anode = xbc_node_get_child(knode);
	p = xbc_node_find_value(hnode, key, &anode);
	if (p) {
		if (!anode) {
			pr_err("hist.%s requires value(s).\n", key);
			return -EINVAL;
@@ -263,9 +262,9 @@ trace_boot_hist_add_one_handler(struct xbc_node *hnode, char **bufp,
	append_printf(bufp, end, ":%s(%s)", handler, p);

	/* Compose 'action' parameter */
	knode = xbc_node_find_child(hnode, "trace");
	knode = xbc_node_find_subkey(hnode, "trace");
	if (!knode)
		knode = xbc_node_find_child(hnode, "save");
		knode = xbc_node_find_subkey(hnode, "save");

	if (knode) {
		anode = xbc_node_get_child(knode);
@@ -284,7 +283,7 @@ trace_boot_hist_add_one_handler(struct xbc_node *hnode, char **bufp,
				sep = ',';
		}
		append_printf(bufp, end, ")");
	} else if (xbc_node_find_child(hnode, "snapshot")) {
	} else if (xbc_node_find_subkey(hnode, "snapshot")) {
		append_printf(bufp, end, ".snapshot()");
	} else {
		pr_err("hist.%s requires an action.\n",
@@ -315,7 +314,7 @@ trace_boot_hist_add_handlers(struct xbc_node *hnode, char **bufp,
			break;
	}

	if (xbc_node_find_child(hnode, param))
	if (xbc_node_find_subkey(hnode, param))
		ret = trace_boot_hist_add_one_handler(hnode, bufp, end, handler, param);

	return ret;
@@ -375,7 +374,7 @@ trace_boot_compose_hist_cmd(struct xbc_node *hnode, char *buf, size_t size)
	if (p)
		append_printf(&buf, end, ":name=%s", p);

	node = xbc_node_find_child(hnode, "var");
	node = xbc_node_find_subkey(hnode, "var");
	if (node) {
		xbc_node_for_each_key_value(node, knode, p) {
			/* Expression must not include spaces. */
@@ -386,21 +385,21 @@ trace_boot_compose_hist_cmd(struct xbc_node *hnode, char *buf, size_t size)
	}

	/* Histogram control attributes (mutual exclusive) */
	if (xbc_node_find_child(hnode, "pause"))
	if (xbc_node_find_value(hnode, "pause", NULL))
		append_printf(&buf, end, ":pause");
	else if (xbc_node_find_child(hnode, "continue"))
	else if (xbc_node_find_value(hnode, "continue", NULL))
		append_printf(&buf, end, ":continue");
	else if (xbc_node_find_child(hnode, "clear"))
	else if (xbc_node_find_value(hnode, "clear", NULL))
		append_printf(&buf, end, ":clear");

	/* Histogram handler and actions */
	node = xbc_node_find_child(hnode, "onmax");
	node = xbc_node_find_subkey(hnode, "onmax");
	if (node && trace_boot_hist_add_handlers(node, &buf, end, "var") < 0)
		return -EINVAL;
	node = xbc_node_find_child(hnode, "onchange");
	node = xbc_node_find_subkey(hnode, "onchange");
	if (node && trace_boot_hist_add_handlers(node, &buf, end, "var") < 0)
		return -EINVAL;
	node = xbc_node_find_child(hnode, "onmatch");
	node = xbc_node_find_subkey(hnode, "onmatch");
	if (node && trace_boot_hist_add_handlers(node, &buf, end, "event") < 0)
		return -EINVAL;

@@ -437,7 +436,7 @@ trace_boot_init_histograms(struct trace_event_file *file,
		}
	}

	if (xbc_node_find_child(hnode, "keys")) {
	if (xbc_node_find_subkey(hnode, "keys")) {
		if (trace_boot_compose_hist_cmd(hnode, buf, size) == 0) {
			tmp = kstrdup(buf, GFP_KERNEL);
			if (trigger_process_regex(file, buf) < 0)
@@ -496,7 +495,7 @@ trace_boot_init_one_event(struct trace_array *tr, struct xbc_node *gnode,
			else if (trigger_process_regex(file, buf) < 0)
				pr_err("Failed to apply an action: %s\n", p);
		}
		anode = xbc_node_find_child(enode, "hist");
		anode = xbc_node_find_subkey(enode, "hist");
		if (anode)
			trace_boot_init_histograms(file, anode, buf, ARRAY_SIZE(buf));
	} else if (xbc_node_find_value(enode, "actions", NULL))
@@ -518,7 +517,7 @@ trace_boot_init_events(struct trace_array *tr, struct xbc_node *node)
	bool enable, enable_all = false;
	const char *data;

	node = xbc_node_find_child(node, "event");
	node = xbc_node_find_subkey(node, "event");
	if (!node)
		return;
	/* per-event key starts with "event.GROUP.EVENT" */
@@ -621,7 +620,7 @@ trace_boot_init_instances(struct xbc_node *node)
	struct trace_array *tr;
	const char *p;

	node = xbc_node_find_child(node, "instance");
	node = xbc_node_find_subkey(node, "instance");
	if (!node)
		return;

+4 −4
Original line number Diff line number Diff line
@@ -142,16 +142,16 @@ xbc_node_match_prefix(struct xbc_node *node, const char **prefix)
}

/**
 * xbc_node_find_child() - Find a child node which matches given key
 * xbc_node_find_subkey() - Find a subkey node which matches given key
 * @parent: An XBC node.
 * @key: A key string.
 *
 * Search a node under @parent which matches @key. The @key can contain
 * Search a key node under @parent which matches @key. The @key can contain
 * several words jointed with '.'. If @parent is NULL, this searches the
 * node from whole tree. Return NULL if no node is matched.
 */
struct xbc_node * __init
xbc_node_find_child(struct xbc_node *parent, const char *key)
xbc_node_find_subkey(struct xbc_node *parent, const char *key)
{
	struct xbc_node *node;

@@ -191,7 +191,7 @@ const char * __init
xbc_node_find_value(struct xbc_node *parent, const char *key,
		    struct xbc_node **vnode)
{
	struct xbc_node *node = xbc_node_find_child(parent, key);
	struct xbc_node *node = xbc_node_find_subkey(parent, key);

	if (!node || !xbc_node_is_key(node))
		return NULL;