Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp3261792pxb; Fri, 12 Feb 2021 13:37:05 -0800 (PST) X-Google-Smtp-Source: ABdhPJxAxht6IGG46bxf3KlYYxhyPGYs6lsAsxIlEfuCadbtX1oK6Pzl/Q9s3TAMeSl5ZBxlUXDK X-Received: by 2002:a17:906:e088:: with SMTP id gh8mr4905970ejb.294.1613165825147; Fri, 12 Feb 2021 13:37:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1613165825; cv=none; d=google.com; s=arc-20160816; b=hbqAfhPLi7i4h4sJuEX08XZGRkWmR/52K44Y1l2exkRs31VUamQ2cz3r/qd5y6g/8w TZJ1ro30jM1tTa7bWXIDQDn+OI3Df/wBBHPs1Q5zAjsXtV8oA7fO9Wefl1tUCgojwwjo wrxYsuz4n/WrIOff0OQcP67o+Rt8lfcgZdHqHXOkIDTgZN+kmqS0utruQ+bk3srErSAD oYz9Ts4qy/TL20iK7aP9PwPlvOuF8TYb+XTHs7GOT4VpAMSURVF8/HD2OiaKD7YJAidj DhNy+SQktSEyq/91dXj2aGe+DT/3VHLgvdHxtuDfh4TRlfg9FSBjsl+KUxSaCbMXUOdS grgw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=q5J4QuBpN0D7eLrcr7Vvy5FpV1NYwKhG34o4oGnxwMs=; b=YFkZIHeNDw/udBP2ZLg4waNbmIiC4iCeScmJMU7ofJxrv554HjSHLFb0x/4R1lkOia iqyU0OCw2N7D3u6+yylZ7chS91boQN9nEEgCN7kw0L5Z29eTU7rc99iRVgzPnSIiFkU9 fBES2f/ulEZZIYU8NhrB18iO2rDLJuRV8K9Pqkuk16CWF2Eky7hj57W3AvwsZ3f9aLgd GjtkHa3lPsB6aJqlu0bZlEBVxpL8vgf8zDOtgtZgTYCyXhAxVl2rcXXW3rf3G/Xm0Xjy BW5QFk/yl4uvsiuG1YFDNQUvPlNZzympE0nOdSM/QCSPHvZ1MAuSLKieRJ/vKZW5CVTA xksA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=I+ZnPspG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bi1si3071094edb.247.2021.02.12.13.36.39; Fri, 12 Feb 2021 13:37:05 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=I+ZnPspG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231686AbhBLVe6 (ORCPT + 99 others); Fri, 12 Feb 2021 16:34:58 -0500 Received: from mail.kernel.org ([198.145.29.99]:34246 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231835AbhBLVeu (ORCPT ); Fri, 12 Feb 2021 16:34:50 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id E663964E31; Fri, 12 Feb 2021 21:34:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1613165648; bh=FEVcRO5NZmWaT1XTRH5PSHctRgsXbratGbqlgqjfjA0=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=I+ZnPspGPI07rRLgxxeZobD0kz8ABoVU/E1DOGvG3huLvIvjNGDBPLsMLi+ONO7aJ ALsDiJ127tL+aKBLEetkxY85AJ/9cfEARWRG0EgZgofZV0fLlT/vsETvvfAhhuBc7V SUSPZGbP4TyxLFmHAopxczYNX0I3Pffjor+d8TQbc7t5Cf67+A4tJBU3d3ZawrVYYF NQEK81bHXwL5UrS6zYlyilNhyK6ksH47q6iEo+P8nWZfKVtD4VAPY8xfNECGH6YNa0 mw8dARwGVCHFTuqn9l+TQK7ttYUQazasVN10pFKgH5EeeAk2JMgko0Ucx75hemPcev 98FFPmwOOvqRQ== Received: by quaco.ghostprotocols.net (Postfix, from userid 1000) id 6A0A940513; Fri, 12 Feb 2021 18:34:05 -0300 (-03) Date: Fri, 12 Feb 2021 18:34:05 -0300 From: Arnaldo Carvalho de Melo To: Jianlin Lv Cc: peterz@infradead.org, mingo@redhat.com, mark.rutland@arm.com, alexander.shishkin@linux.intel.com, jolsa@redhat.com, namhyung@kernel.org, nathan@kernel.org, ndesaulniers@google.com, mhiramat@kernel.org, fche@redhat.com, irogers@google.com, sumanthk@linux.ibm.com, linux-kernel@vger.kernel.org, clang-built-linux@googlegroups.com Subject: Re: [PATCH v2] perf probe: fix kretprobe issue caused by GCC bug Message-ID: <20210212213405.GM1398414@kernel.org> References: <20210210062646.2377995-1-Jianlin.Lv@arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20210210062646.2377995-1-Jianlin.Lv@arm.com> X-Url: http://acmel.wordpress.com Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Em Wed, Feb 10, 2021 at 02:26:46PM +0800, Jianlin Lv escreveu: > Perf failed to add kretprobe event with debuginfo of vmlinux which is > compiled by gcc with -fpatchable-function-entry option enabled. > The same issue with kernel module. > > Issue: > > # perf probe -v 'kernel_clone%return $retval' > ...... > Writing event: r:probe/kernel_clone__return _text+599624 $retval > Failed to write event: Invalid argument > Error: Failed to add events. Reason: Invalid argument (Code: -22) > > # cat /sys/kernel/debug/tracing/error_log > [156.75] trace_kprobe: error: Retprobe address must be an function entry > Command: r:probe/kernel_clone__return _text+599624 $retval > ^ > > # llvm-dwarfdump vmlinux |grep -A 10 -w 0x00df2c2b > 0x00df2c2b: DW_TAG_subprogram > DW_AT_external (true) > DW_AT_name ("kernel_clone") > DW_AT_decl_file ("/home/code/linux-next/kernel/fork.c") > DW_AT_decl_line (2423) > DW_AT_decl_column (0x07) > DW_AT_prototyped (true) > DW_AT_type (0x00dcd492 "pid_t") > DW_AT_low_pc (0xffff800010092648) > DW_AT_high_pc (0xffff800010092b9c) > DW_AT_frame_base (DW_OP_call_frame_cfa) > > # cat /proc/kallsyms |grep kernel_clone > ffff800010092640 T kernel_clone > # readelf -s vmlinux |grep -i kernel_clone > 183173: ffff800010092640 1372 FUNC GLOBAL DEFAULT 2 kernel_clone > > # objdump -d vmlinux |grep -A 10 -w \: > ffff800010092640 : > ffff800010092640: d503201f nop > ffff800010092644: d503201f nop > ffff800010092648: d503233f paciasp > ffff80001009264c: a9b87bfd stp x29, x30, [sp, #-128]! > ffff800010092650: 910003fd mov x29, sp > ffff800010092654: a90153f3 stp x19, x20, [sp, #16] > > The entry address of kernel_clone converted by debuginfo is _text+599624 > (0x92648), which is consistent with the value of DW_AT_low_pc attribute. > But the symbolic address of kernel_clone from /proc/kallsyms is > ffff800010092640. > > This issue is found on arm64, -fpatchable-function-entry=2 is enabled when > CONFIG_DYNAMIC_FTRACE_WITH_REGS=y; > Just as objdump displayed the assembler contents of kernel_clone, > GCC generate 2 NOPs at the beginning of each function. > > kprobe_on_func_entry detects that (_text+599624) is not the entry address > of the function, which leads to the failure of adding kretprobe event. > > --- > kprobe_on_func_entry > ->_kprobe_addr > ->kallsyms_lookup_size_offset > ->arch_kprobe_on_func_entry // FALSE > --- Please don't use --- at the start of a line, it is used to separate from the patch itself, later down your message. It causes this: [acme@five perf]$ am /wb/1.patch Traceback (most recent call last): File "/home/acme/bin/ksoff.py", line 180, in sign_msg(sys.stdin, sys.stdout) File "/home/acme/bin/ksoff.py", line 142, in sign_msg sob.remove(last_sob[0]) TypeError: 'NoneType' object is not subscriptable [acme@five perf]$ I'm fixing this by removing that --- markers > The cause of the issue is that the first instruction in the compile unit > indicated by DW_AT_low_pc does not include NOPs. > This issue exists in all gcc versions that support > -fpatchable-function-entry option. > > I have reported it to the GCC community: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98776 > > Currently arm64 and PA-RISC may enable fpatchable-function-entry option. > The kernel compiled with clang does not have this issue. > > FIX: > > This GCC issue only cause the registration failure of the kretprobe event > which doesn't need debuginfo. So, stop using debuginfo for retprobe. > map will be used to query the probe function address. > > Signed-off-by: Jianlin Lv > --- > v2: stop using debuginfo for retprobe, and update changelog. > --- > tools/perf/util/probe-event.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c > index 8eae2afff71a..a59d3268adb0 100644 > --- a/tools/perf/util/probe-event.c > +++ b/tools/perf/util/probe-event.c > @@ -894,6 +894,16 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev, > struct debuginfo *dinfo; > int ntevs, ret = 0; > > + /* Workaround for gcc #98776 issue. > + * Perf failed to add kretprobe event with debuginfo of vmlinux which is > + * compiled by gcc with -fpatchable-function-entry option enabled. The > + * same issue with kernel module. The retprobe doesn`t need debuginfo. > + * This workaround solution use map to query the probe function address > + * for retprobe event. > + */ > + if (pev->point.retprobe) > + return 0; > + > dinfo = open_debuginfo(pev->target, pev->nsi, !need_dwarf); > if (!dinfo) { > if (need_dwarf) > -- > 2.25.1 > -- - Arnaldo