From nobody Sat Nov 23 18:00:23 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A566E13BC18 for ; Tue, 19 Nov 2024 02:40:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731984016; cv=none; b=BEcNwN/mLVel7nmfVk8JgJHwqcfIZ3dsTuhDDAu/H85R/zd1N9vFGoooW8JMrf3SbBmxkEsIeSRL1Np1vLj9mT2PbADUeqQ93AB2euag+21NNF8yA+wQ2tnfUHTdRt8cS3RV3piIfTYjC/dd1V8BDVbQF8XSfsfRLQ8rINeAtGc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1731984016; c=relaxed/simple; bh=wToMScqW5paNkArGTLIBKNwqkWGwse6GzQYFQXlJFKU=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=ZJcWfGwBqQOnsF9ltfwHhcHFjYnGnFlsUvDiC8eR236RXG/J8/TGaSRUMttrhzkI/iVth5fV1xqSi4eJlAzmH7ZU4d7vpqkoIojFSd8mKZq7DwsLGuIr6j5ekoHvgH+E1Lm6GiSKrX0Rm3KotfV2E1guTrawMxYF+nPSajyzV9g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 478A1C4CED7; Tue, 19 Nov 2024 02:40:16 +0000 (UTC) Received: from rostedt by gandalf with local (Exim 4.98) (envelope-from ) id 1tDEAa-0000000ED3T-45jl; Mon, 18 Nov 2024 21:40:48 -0500 Message-ID: <20241119024048.825281010@goodmis.org> User-Agent: quilt/0.68 Date: Mon, 18 Nov 2024 21:40:18 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton , Jeff Xie Subject: [for-next][PATCH 2/3] ftrace: Get the true parent ip for function tracer References: <20241119024016.371665360@goodmis.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jeff Xie When using both function tracer and function graph simultaneously, it is found that function tracer sometimes captures a fake parent ip (return_to_handler) instead of the true parent ip. This issue is easy to reproduce. Below are my reproduction steps: jeff-labs:~/bin # ./trace-net.sh jeff-labs:~/bin # cat /sys/kernel/debug/tracing/instances/foo/trace | grep = return_to_handler trace-net.sh-405 [001] ...2. 31.859501: avc_has_perm+0x4/0x190 <= -return_to_handler+0x0/0x40 trace-net.sh-405 [001] ...2. 31.859503: simple_setattr+0x4/0x70 = <-return_to_handler+0x0/0x40 trace-net.sh-405 [001] ...2. 31.859503: truncate_pagecache+0x4/0= x60 <-return_to_handler+0x0/0x40 trace-net.sh-405 [001] ...2. 31.859505: unmap_mapping_range+0x4/= 0x140 <-return_to_handler+0x0/0x40 trace-net.sh-405 [001] ...3. 31.859508: _raw_spin_unlock+0x4/0x3= 0 <-return_to_handler+0x0/0x40 [...] The following is my simple trace script: jeff-labs:~/bin # cat ./trace-net.sh TRACE_PATH=3D"/sys/kernel/tracing" set_events() { echo 1 > $1/events/net/enable echo 1 > $1/events/tcp/enable echo 1 > $1/events/sock/enable echo 1 > $1/events/napi/enable echo 1 > $1/events/fib/enable echo 1 > $1/events/neigh/enable } set_events ${TRACE_PATH} echo 1 > ${TRACE_PATH}/options/sym-offset echo 1 > ${TRACE_PATH}/options/funcgraph-tail echo 1 > ${TRACE_PATH}/options/funcgraph-proc echo 1 > ${TRACE_PATH}/options/funcgraph-abstime echo 'tcp_orphan*' > ${TRACE_PATH}/set_ftrace_notrace echo function_graph > ${TRACE_PATH}/current_tracer INSTANCE_FOO=3D${TRACE_PATH}/instances/foo if [ ! -e $INSTANCE_FOO ]; then mkdir ${INSTANCE_FOO} fi set_events ${INSTANCE_FOO} echo 1 > ${INSTANCE_FOO}/options/sym-offset echo 'tcp_orphan*' > ${INSTANCE_FOO}/set_ftrace_notrace echo function > ${INSTANCE_FOO}/current_tracer echo 1 > ${TRACE_PATH}/tracing_on echo 1 > ${INSTANCE_FOO}/tracing_on echo > ${TRACE_PATH}/trace echo > ${INSTANCE_FOO}/trace Link: https://lore.kernel.org/20241008033159.22459-1-jeff.xie@linux.dev Acked-by: Masami Hiramatsu (Google) Signed-off-by: Jeff Xie Signed-off-by: Steven Rostedt (Google) --- kernel/trace/trace_functions.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/kernel/trace/trace_functions.c b/kernel/trace/trace_functions.c index 65fed0bbc5c2..74c353164ca1 100644 --- a/kernel/trace/trace_functions.c +++ b/kernel/trace/trace_functions.c @@ -176,6 +176,27 @@ static void function_trace_start(struct trace_array *t= r) tracing_reset_online_cpus(&tr->array_buffer); } =20 +#ifdef CONFIG_FUNCTION_GRAPH_TRACER +static __always_inline unsigned long +function_get_true_parent_ip(unsigned long parent_ip, struct ftrace_regs *f= regs) +{ + unsigned long true_parent_ip; + int idx =3D 0; + + true_parent_ip =3D parent_ip; + if (unlikely(parent_ip =3D=3D (unsigned long)&return_to_handler) && fregs) + true_parent_ip =3D ftrace_graph_ret_addr(current, &idx, parent_ip, + (unsigned long *)ftrace_regs_get_stack_pointer(fregs)); + return true_parent_ip; +} +#else +static __always_inline unsigned long +function_get_true_parent_ip(unsigned long parent_ip, struct ftrace_regs *f= regs) +{ + return parent_ip; +} +#endif + static void function_trace_call(unsigned long ip, unsigned long parent_ip, struct ftrace_ops *op, struct ftrace_regs *fregs) @@ -192,6 +213,8 @@ function_trace_call(unsigned long ip, unsigned long par= ent_ip, if (bit < 0) return; =20 + parent_ip =3D function_get_true_parent_ip(parent_ip, fregs); + trace_ctx =3D tracing_gen_ctx(); =20 data =3D this_cpu_ptr(tr->array_buffer.data); @@ -239,6 +262,7 @@ function_stack_trace_call(unsigned long ip, unsigned lo= ng parent_ip, * recursive protection is performed. */ local_irq_save(flags); + parent_ip =3D function_get_true_parent_ip(parent_ip, fregs); cpu =3D raw_smp_processor_id(); data =3D per_cpu_ptr(tr->array_buffer.data, cpu); disabled =3D atomic_inc_return(&data->disabled); @@ -306,6 +330,7 @@ function_no_repeats_trace_call(unsigned long ip, unsign= ed long parent_ip, if (bit < 0) return; =20 + parent_ip =3D function_get_true_parent_ip(parent_ip, fregs); data =3D this_cpu_ptr(tr->array_buffer.data); if (atomic_read(&data->disabled)) goto out; @@ -352,6 +377,7 @@ function_stack_no_repeats_trace_call(unsigned long ip, = unsigned long parent_ip, * recursive protection is performed. */ local_irq_save(flags); + parent_ip =3D function_get_true_parent_ip(parent_ip, fregs); cpu =3D raw_smp_processor_id(); data =3D per_cpu_ptr(tr->array_buffer.data, cpu); disabled =3D atomic_inc_return(&data->disabled); --=20 2.45.2