Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp1286207yba; Thu, 18 Apr 2019 19:22:18 -0700 (PDT) X-Google-Smtp-Source: APXvYqz+CXbaLKimpszVvHAvGCKTRfKfLbQt50q00BD6793vnyLEqtcSTveYlk3mNiYJ8wxdVoCA X-Received: by 2002:a17:902:8a81:: with SMTP id p1mr1124960plo.106.1555640538549; Thu, 18 Apr 2019 19:22:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1555640538; cv=none; d=google.com; s=arc-20160816; b=ha37kkuGAJ1gFQUV1V8OOsA9gjnB0tWnyELV88Xv0KPKaVDYTcM+yct6iQICCPPU4w BW0htq09aPcSH/wV9NaDRKGpP6vAes4XvZz6k+mPJOJ1uwnOguymYAkqyMcE1FIp1hni Dj/Vj3yAZ0+o7oN/IHuzXOQMtFNBZO/7Zbc6N4hwUAame9tnINGHhGIs4+hDzOZOojGv DnniETGdHdBY3CPN27USLCQBKsoBu0Ow5wLkcnQju0QD76Ie7AdWJFJ8uD4TYO6MdEjz hjjm4fmCtt42mZvq85YyXFpsjJmB7RaAXslnSdGywAqXzys7eiybhwvnGfRQqalxkkta aIrQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version; bh=bwBZzd//g9QMXA36h/ZVXcmw48M67202LeN6NFSg5P4=; b=d8kO8RwUWRgAM1GE9Id5f2IpChQgDpMqvCoeAODvaZTnslMVl3IRDH2K45gcvDXaCQ YG9bY3/1zBWl7FC+yha69+egJu/8l4I0Lgy4HeSmhVdnvFkkcxcAHGM1vcA4G87MtHjQ oeKZEKVJ/Mowe9DRXxQEz1NTBLfPRqMYWfiAQEhUnK5F8GBw9EPF1tpwMIKp5a5n4nL9 By4mzpB+9fMNMdYKVTOLEdu6CZKuZFvCvjJbEw3Xard3GpSkg5j63xnziuCS32dSkRk6 oapAl2f8o9eu2acPPXX07N/NWjgVlK/nQDVUOuxprMitvWMMgLhCEq1yip0uQhOGZ0N3 cZew== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h11si4117590plk.270.2019.04.18.19.21.48; Thu, 18 Apr 2019 19:22:18 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727159AbfDSCSC (ORCPT + 99 others); Thu, 18 Apr 2019 22:18:02 -0400 Received: from mail-io1-f65.google.com ([209.85.166.65]:39244 "EHLO mail-io1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726822AbfDSCSB (ORCPT ); Thu, 18 Apr 2019 22:18:01 -0400 Received: by mail-io1-f65.google.com with SMTP id e13so3455325ioq.6 for ; Thu, 18 Apr 2019 19:18:00 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=bwBZzd//g9QMXA36h/ZVXcmw48M67202LeN6NFSg5P4=; b=M/LgXH2sV87grFCD0WzLVAwckYlaP+WRe9Ok4elU8APTyDuK5gz+8aRNJOSMEdMy4v CL/0xcuQoUoVaJCKHlcvKONvdDp+NR9C261Z4F4mNEdnWDPMqAnf6W8MR1W7RLbxUtst v7SaxgC+qW2p4tzSWimt9HIZT3Q5j2rryYPd2PsS9ZZFIXsRB77ffIb7YPH299IsrjpI KQodFEZqM20fixYyUYDs72BXSUOzCFA2d8lFYnFYDWo5cNrZgXK9bmQSPw1tYOaG2Lu7 noGeBSfL2Dj+86YGTx+vG44ynQhjjMfA6FSKt3wSi1nSGy+QcNw0gZnAcvhWfmEM4mVY Wf2A== X-Gm-Message-State: APjAAAWkM2mMm0Pvm4SFXZCYvYyM7rrr6I+Ms5mnsmt0lxI13gLkF2JF vOfSps5Kyc6ON2jRCiKQN5jtWUrU7yFEbWqanrseoQ== X-Received: by 2002:a5d:8757:: with SMTP id k23mr1257858iol.68.1555640280294; Thu, 18 Apr 2019 19:18:00 -0700 (PDT) MIME-Version: 1.0 References: <20190418160730.11901-1-kasong@redhat.com> <20190419005821.ttlpav7gviaed7am@treble> In-Reply-To: <20190419005821.ttlpav7gviaed7am@treble> From: Kairui Song Date: Fri, 19 Apr 2019 10:17:49 +0800 Message-ID: Subject: Re: [RFC PATCH v3] perf/x86: make perf callchain work without CONFIG_FRAME_POINTER To: Josh Poimboeuf Cc: Linux Kernel Mailing List , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Alexander Shishkin , Jiri Olsa , Alexei Starovoitov , Namhyung Kim , Thomas Gleixner , Borislav Petkov Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Apr 19, 2019 at 8:58 AM Josh Poimboeuf wrote: > > I still don't like using regs->bp because it results in different code > paths for FP and ORC. In the FP case, the regs are treated like real > regs even though they're fake. > > Something like the below would be much simpler. Would this work? I don't > know if any other code relies on the fake regs->bp or regs->sp. Works perfectly. My only concern is that FP path used to work very well, not sure it's a good idea to change it, and this may bring some extra overhead for FP path. > > (BTW, tomorrow is a US holiday so I may not be very responsive until > Monday.) > > diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c > index de1a924a4914..f315425d8468 100644 > --- a/arch/x86/events/core.c > +++ b/arch/x86/events/core.c > @@ -2382,6 +2382,15 @@ void arch_perf_update_userpage(struct perf_event *event, > cyc2ns_read_end(); > } > > +/* > + * Determine whether the regs were taken from an irq/exception handler rather > + * than from perf_arch_fetch_caller_regs(). > + */ > +static bool perf_hw_regs(struct pt_regs *regs) > +{ > + return regs->flags & X86_EFLAGS_FIXED; > +} > + > void > perf_callchain_kernel(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs) > { > @@ -2393,11 +2402,15 @@ perf_callchain_kernel(struct perf_callchain_entry_ctx *entry, struct pt_regs *re > return; > } > > - if (perf_callchain_store(entry, regs->ip)) > - return; > + if (perf_hw_regs(regs)) { > + if (perf_callchain_store(entry, regs->ip)) > + return; > + unwind_start(&state, current, regs, NULL); > + } else { > + unwind_start(&state, current, NULL, (void *)regs->sp); > + } > > - for (unwind_start(&state, current, regs, NULL); !unwind_done(&state); > - unwind_next_frame(&state)) { > + for (; !unwind_done(&state); unwind_next_frame(&state)) { > addr = unwind_get_return_address(&state); > if (!addr || perf_callchain_store(entry, addr)) > return; > diff --git a/arch/x86/include/asm/perf_event.h b/arch/x86/include/asm/perf_event.h > index 04768a3a5454..1392d5e6e8d6 100644 > --- a/arch/x86/include/asm/perf_event.h > +++ b/arch/x86/include/asm/perf_event.h > @@ -308,14 +308,9 @@ extern unsigned long perf_misc_flags(struct pt_regs *regs); > */ > #define perf_arch_fetch_caller_regs(regs, __ip) { \ > (regs)->ip = (__ip); \ > - (regs)->bp = caller_frame_pointer(); \ > + (regs)->sp = (unsigned long)__builtin_frame_address(0); \ > (regs)->cs = __KERNEL_CS; \ > regs->flags = 0; \ > - asm volatile( \ > - _ASM_MOV "%%"_ASM_SP ", %0\n" \ > - : "=m" ((regs)->sp) \ > - :: "memory" \ > - ); \ > } > > struct perf_guest_switch_msr { > diff --git a/arch/x86/include/asm/stacktrace.h b/arch/x86/include/asm/stacktrace.h > index d6d758a187b6..a8d0cdf48616 100644 > --- a/arch/x86/include/asm/stacktrace.h > +++ b/arch/x86/include/asm/stacktrace.h > @@ -100,19 +100,6 @@ struct stack_frame_ia32 { > u32 return_address; > }; > > -static inline unsigned long caller_frame_pointer(void) > -{ > - struct stack_frame *frame; > - > - frame = __builtin_frame_address(0); > - > -#ifdef CONFIG_FRAME_POINTER > - frame = frame->next_frame; > -#endif > - > - return (unsigned long)frame; > -} > - > void show_opcodes(struct pt_regs *regs, const char *loglvl); > void show_ip(struct pt_regs *regs, const char *loglvl); > #endif /* _ASM_X86_STACKTRACE_H */ > diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h > index f3864e1c5569..0f560069aeec 100644 > --- a/include/linux/perf_event.h > +++ b/include/linux/perf_event.h > @@ -1062,7 +1062,7 @@ static inline void perf_arch_fetch_caller_regs(struct pt_regs *regs, unsigned lo > * the nth caller. We only need a few of the regs: > * - ip for PERF_SAMPLE_IP > * - cs for user_mode() tests > - * - bp for callchains > + * - sp for callchains > * - eflags, for future purposes, just in case > */ > static inline void perf_fetch_caller_regs(struct pt_regs *regs) -- Best Regards, Kairui Song