Thread (29 messages) 29 messages, 7 authors, 2025-12-29

Re: [PATCHv5 bpf-next 4/9] ftrace: Add update_ftrace_direct_add function

From: Jiri Olsa <hidden>
Date: 2025-12-19 09:27:42
Also in: bpf, linux-trace-kernel, lkml

On Wed, Dec 17, 2025 at 08:39:09PM -0500, Steven Rostedt wrote:
On Mon, 15 Dec 2025 22:13:57 +0100
Jiri Olsa [off-list ref] wrote:

quoted
+/**
+ * hash_add - adds two struct ftrace_hash and returns the result
+ * @a: struct ftrace_hash object
+ * @b: struct ftrace_hash object
+ *
+ * Returns struct ftrace_hash object on success, NULL on error.
+ */
+static struct ftrace_hash *hash_add(struct ftrace_hash *a, struct ftrace_hash *b)
+{
+	struct ftrace_func_entry *entry;
+	struct ftrace_hash *add;
+	int size, i;
+
+	size = hash_count(a) + hash_count(b);
+	if (size > 32)
+		size = 32;
+
+	add = alloc_and_copy_ftrace_hash(fls(size), a);
+	if (!add)
+		goto error;
You can just return NULL here, as add is NULL.
ok
quoted
+
+	size = 1 << b->size_bits;
+	for (i = 0; i < size; i++) {
+		hlist_for_each_entry(entry, &b->buckets[i], hlist) {
+			if (add_hash_entry_direct(add, entry->ip, entry->direct) == NULL)
+				goto error;
Could remove the error and have:

			if (add_hash_entry_direct(add, entry->ip, entry->direct) == NULL) {
				free_ftrace_hash(add);
				return NULL;
			}
ok
quoted
+		}
+	}
+	return add;
+
+ error:
+	free_ftrace_hash(add);
+	return NULL;
+}
+
Non static functions require a kerneldoc header.
ah right, will add
quoted
+int update_ftrace_direct_add(struct ftrace_ops *ops, struct ftrace_hash *hash)
+{
+	struct ftrace_hash *old_direct_functions = NULL, *new_direct_functions;
+	struct ftrace_hash *old_filter_hash, *new_filter_hash = NULL;
BTW, I prefer to not double up on variables. That is to have each on
their own lines. Makes it easier to read for me.
quoted
+	struct ftrace_func_entry *entry;
+	int i, size, err = -EINVAL;
Even here.
ok, will split
quoted
+	bool reg;
+
+	if (!hash_count(hash))
+		return -EINVAL;
+
+	mutex_lock(&direct_mutex);
+
+	/* Make sure requested entries are not already registered. */
+	size = 1 << hash->size_bits;
+	for (i = 0; i < size; i++) {
If you want, you can remove the i declaration and use for(int i = 0; ... here.
ok

SNIP
quoted
+	}
+
+	if (err) {
+		/* reset direct_functions and free the new one */
+		rcu_assign_pointer(direct_functions, old_direct_functions);
+		old_direct_functions = new_direct_functions;
+	}
+
+ out_unlock:
+	mutex_unlock(&direct_mutex);
+
+	if (old_direct_functions && old_direct_functions != EMPTY_HASH)
+		call_rcu_tasks(&old_direct_functions->rcu, register_ftrace_direct_cb);
+	if (new_filter_hash)
free_ftrace_hash() checks for NULL, so you don't need the above if statement.
ok

thanks,
jirka
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help