FAILED: patch "[PATCH] fprobe: add recursion detection in fprobe_exit_handler" failed to apply to 6.1-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.1-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.1.y
git checkout FETCH_HEAD
git cherry-pick -x 2752741080f84f9b2fc93fa92735315d10a415bf
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023052253-squabble-matchbook-63eb@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
2752741080f8 ("fprobe: add recursion detection in fprobe_exit_handler") 76d0de5729c0 ("fprobe: Pass entry_data to handlers")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 2752741080f84f9b2fc93fa92735315d10a415bf Mon Sep 17 00:00:00 2001
From: Ze Gao <[email protected]>
Date: Wed, 17 May 2023 11:45:08 +0800
Subject: [PATCH] fprobe: add recursion detection in fprobe_exit_handler
fprobe_hander and fprobe_kprobe_handler has guarded ftrace recursion detection but fprobe_exit_handler has not, which possibly introduce recursive calls if the fprobe exit callback calls any traceable functions. Checking in fprobe_hander or fprobe_kprobe_handler is not enough and misses this case.
So add recursion free guard the same way as fprobe_hander. Since ftrace recursion check does not employ ip(s), so here use entry_ip and entry_parent_ip the same as fprobe_handler.
kernel/trace/fprobe.c +14 -0
@@ -17,6 +17,7 @@struct fprobe_rethook_node {struct rethook_node node;unsigned long entry_ip; +unsigned long entry_parent_ip;char data[]; };
@@ -39,6 +40,7 @@ static inline void __fprobe_handler(unsigned long ip, unsigned long parent_ip, } fpr = container_of(rh, struct fprobe_rethook_node, node); fpr->entry_ip = ip; + fpr->entry_parent_ip = parent_ip;if (fp->entry_data_size) entry_data = fpr->data; }
@@ -114,14 +116,26 @@ static void fprobe_exit_handler(struct rethook_node *rh, void *data, {struct fprobe *fp = (struct fprobe *)data;struct fprobe_rethook_node *fpr; +int bit;if (!fp ||fprobe_disabled (fp))return ; fpr = container_of(rh, struct fprobe_rethook_node, node); +/* +* we need to assure no calls to traceable functions in-between the +* end of fprobe_handler and the beginning of fprobe_exit_handler. +*/ + bit =ftrace_test_recursion_trylock (fpr->entry_ip, fpr->entry_parent_ip); +if (bit <0 ) { + fp->nmissed++; +return ; + } + fp->exit_handler (fp, fpr->entry_ip, regs, fp->entry_data_size ? (void *)fpr->data :NULL ); +ftrace_test_recursion_unlock (bit); }NOKPROBE_SYMBOL (fprobe_exit_handler);