Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752795AbdGLOm6 (ORCPT ); Wed, 12 Jul 2017 10:42:58 -0400 Received: from mx1.redhat.com ([209.132.183.28]:58052 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752503AbdGLOm4 (ORCPT ); Wed, 12 Jul 2017 10:42:56 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com D7AF6811AC Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=jpoimboe@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com D7AF6811AC Date: Wed, 12 Jul 2017 09:42:54 -0500 From: Josh Poimboeuf To: Ingo Molnar Cc: x86@kernel.org, linux-kernel@vger.kernel.org, live-patching@vger.kernel.org, Linus Torvalds , Andy Lutomirski , Jiri Slaby , "H. Peter Anvin" , Peter Zijlstra , Mike Galbraith Subject: Re: [PATCH v3 00/10] x86: ORC unwinder (previously undwarf) Message-ID: <20170712144254.tihj43mvdj2so74d@treble> References: <20170712082710.g2syanmhtwqeus4o@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20170712082710.g2syanmhtwqeus4o@gmail.com> User-Agent: Mutt/1.6.0.1 (2016-04-01) X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Wed, 12 Jul 2017 14:42:56 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2722 Lines: 64 On Wed, Jul 12, 2017 at 10:27:10AM +0200, Ingo Molnar wrote: > > Create a new "ORC" unwinder, enabled by CONFIG_ORC_UNWINDER, and plug it > > into the x86 unwinder framework. Objtool is used to generate the ORC > > debuginfo. The ORC debuginfo format is basically a simplified version > > of DWARF CFI. More details below. > > BTW., we should perhaps consolidate our unwinder related Kconfig space, > hierarchically: > > CONFIG_UNWINDER > CONFIG_UNWINDER_ORC > CONFIG_UNWINDER_FRAME_POINTERS > > Note that as a side effect it would be a valid small systems build option to have > no unwinder at all, if CONFIG_EXPERT=y is set and such: !CONFIG_UNWINDER=n would > be a sibling to !CONFIG_BUG. So is the idea that CONFIG_UNWINDER=n means "use the 'guess' unwinder"? Or should it mean that the unwind API isn't available? Without frame pointers and orc, it defaults to the 'guess' unwinder, for which the only overhead is a tiny amount of code. It's still technically considered an unwinder because it plugs into the unwind interfaces (unwind_start(), unwind_next_frame(), etc) and is used for things like /proc//stack. So I'm not really sure CONFIG_UNWINDER=n would make sense. Maybe there should just be a multiple-choice where you have to choose one of CONFIG_UNWINDER_{ORC,FRAME_POINTER,GUESS}. > CONFIG_FRAME_POINTERS et al would be left for architectures where it has a meaning > beyond backtrace generation. (Not sure whether there's any such architectures.) Well, on x86, hardened usercopy relies on frame pointers, but not the unwinder. It does the frame pointer walk manually to avoid the full unwinder overhead. See arch_within_stack_frames(). > > The unwinder works well in my testing. It unwinds through interrupts, > > exceptions, and preemption, with and without frame pointers, across > > aligned stacks and dynamically allocated stacks. If something goes > > wrong during an oops, it successfully falls back to printing the '?' > > entries just like the frame pointer unwinder. > > Ok, I'll start applying your patches after -rc1, unless anyone objects. Thank you Ingo! > > The ORC data format does have a few downsides compared to DWARF. The > > ORC unwind tables take up ~1MB more memory than DWARF eh_frame tables. > > Could we also write this in percentage, not absolute RAM size - i.e. ORC unwind > tables take 30% more RAM (+0.7 MB on an x86 defconfig kernel) than DWARF eh_frame > tables. Ok, how about: "Orc unwind tables take up ~50% more RAM (+1.3MB on an x86 defconfig kernel) than DWARF eh_frame tables." (My previous 1MB number was from my distro-based config, and it also forgot to take into account the fast lookup table (".orc_lookup")). -- Josh