FAILED: patch "[PATCH] tracing/fprobe: Unregister fprobe even if memory allocation" failed to apply to 6.18-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.18-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.18.y
git checkout FETCH_HEAD
git cherry-pick -x 1aec9e5c3e31ce1e28f914427fb7f90b91d310df
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026051214-retool-routing-618c@gregkh' --subject-prefix 'PATCH 6.18.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 1aec9e5c3e31ce1e28f914427fb7f90b91d310df Mon Sep 17 00:00:00 2001
From: "Masami Hiramatsu (Google)" <[email protected]>
Date: Mon, 20 Apr 2026 23:00:56 +0900
Subject: [PATCH] tracing/fprobe: Unregister fprobe even if memory allocation
fails
unregister_fprobe() can fail under memory pressure because of memory allocation failure, but this maybe called from module unloading, and usually there is no way to retry it. Moreover. trace_fprobe does not check the return value.
To fix this problem, unregister fprobe and fprobe_hash_node even if working memory allocation fails.
Anyway, if the last fprobe is removed, the filter will be freed.
kernel/trace/fprobe.c +15 -10
@@ -324,9 +324,10 @@ static void fprobe_ftrace_remove_ips(unsigned long *addrs, int num)lockdep_assert_held (&fprobe_mutex); fprobe_ftrace_active--; -if (!fprobe_ftrace_active) +if (!fprobe_ftrace_active) {unregister_ftrace_function (&fprobe_ftrace_ops); -if (num) +ftrace_free_filter (&fprobe_ftrace_ops); + }else if (num)ftrace_set_filter_ips (&fprobe_ftrace_ops, addrs, num,1 ,0 ); }
@@ -525,10 +526,10 @@ static void fprobe_graph_remove_ips(unsigned long *addrs, int num) fprobe_graph_active--;/* Q: should we unregister it ? */ -if (!fprobe_graph_active) +if (!fprobe_graph_active) {unregister_ftrace_graph (&fprobe_graph_ops); - -if (num) +ftrace_free_filter (&fprobe_graph_ops.ops); + }else if (num)ftrace_set_filter_ips (&fprobe_graph_ops.ops, addrs, num,1 ,0 ); }
@@ -932,15 +933,19 @@ int unregister_fprobe(struct fprobe *fp) hlist_array = fp->hlist_array; addrs =kcalloc (hlist_array->size,sizeof (unsigned long ),GFP_KERNEL ); -if (!addrs) { - ret = -ENOMEM ;/* TODO: Fallback to one-by-one loop */ - goto out; - } +/* +* This will remove fprobe_hash_node from the hash table even if +* memory allocation fails. However, ftrace_ops will not be updated. +* Anyway, when the last fprobe is unregistered, ftrace_ops is also +* unregistered. +*/ +if (!addrs) +pr_warn ("Failed to allocate working array. ftrace_ops may not sync.\n" );/* Remove non-synonim ips from table and hash */ count =0 ;for (i =0 ; i < hlist_array->size; i++) { -if (!delete_fprobe_node (&hlist_array->array[i])) +if (!delete_fprobe_node (&hlist_array->array[i]) && addrs) addrs[count++] = hlist_array->array[i].addr; }del_fprobe_hash (fp);