Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752825AbcD2UdQ (ORCPT ); Fri, 29 Apr 2016 16:33:16 -0400 Received: from mail-oi0-f46.google.com ([209.85.218.46]:35810 "EHLO mail-oi0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752412AbcD2UdO (ORCPT ); Fri, 29 Apr 2016 16:33:14 -0400 MIME-Version: 1.0 In-Reply-To: <20160429202701.yijrohqdsurdxv2a@treble> References: <20160429201139.pudoged2yathyo64@treble> <20160429202701.yijrohqdsurdxv2a@treble> From: Andy Lutomirski Date: Fri, 29 Apr 2016 13:32:53 -0700 Message-ID: Subject: Re: [RFC PATCH v2 05/18] sched: add task flag for preempt IRQ tracking To: Josh Poimboeuf Cc: Jessica Yu , Jiri Kosina , Miroslav Benes , Ingo Molnar , Peter Zijlstra , Michael Ellerman , Heiko Carstens , live-patching@vger.kernel.org, "linux-kernel@vger.kernel.org" , X86 ML , linuxppc-dev@lists.ozlabs.org, "linux-s390@vger.kernel.org" , Vojtech Pavlik , Jiri Slaby , Petr Mladek , Chris J Arges , Andy Lutomirski Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3119 Lines: 64 On Fri, Apr 29, 2016 at 1:27 PM, Josh Poimboeuf wrote: > On Fri, Apr 29, 2016 at 01:19:23PM -0700, Andy Lutomirski wrote: >> On Fri, Apr 29, 2016 at 1:11 PM, Josh Poimboeuf wrote: >> > On Fri, Apr 29, 2016 at 11:06:53AM -0700, Andy Lutomirski wrote: >> >> On Thu, Apr 28, 2016 at 1:44 PM, Josh Poimboeuf wrote: >> >> > A preempted function might not have had a chance to save the frame >> >> > pointer to the stack yet, which can result in its caller getting skipped >> >> > on a stack trace. >> >> > >> >> > Add a flag to indicate when the task has been preempted so that stack >> >> > dump code can determine whether the stack trace is reliable. >> >> >> >> I think I like this, but how do you handle the rather similar case in >> >> which a task goes to sleep because it's waiting on IO that happened in >> >> response to get_user, put_user, copy_from_user, etc? >> > >> > Hm, good question. I was thinking that page faults had a dedicated >> > stack, but now looking at the entry and traps code, that doesn't seem to >> > be the case. >> > >> > Anyway I think it shouldn't be a problem if we make sure that any kernel >> > function which might trigger a valid page fault (e.g., >> > copy_user_generic_string) do the proper frame pointer setup first. Then >> > the stack should still be reliable. >> > >> > In fact I might be able to teach objtool to enforce that: any function >> > which uses an exception table should create a stack frame. >> > >> > Or alternatively, maybe set some kind of flag for page faults, similar >> > to what I did with this patch. >> > >> >> How about doing it the other way around: teach the unwinder to detect >> when it hits a non-outermost entry (i.e. it lands in idtentry, etc) >> and use some reasonable heuristic as to whether it's okay to keep >> unwinding. You should be able to handle preemption like that, too -- >> the unwind process will end up in an IRQ frame. > > How exactly would the unwinder detect if a text address is in an > idtentry? Maybe put all the idt entries in a special ELF section? > Hmm. What actually happens when you unwind all the way into the entry code? Don't you end up in something that isn't in an ELF function? Can you detect that? Ideally, the unwinder could actually detect that it's hit a pt_regs struct and report that. If used for stack dumps, it could display some indication of this and then continue its unwinding by decoding the pt_regs. If used for patching, it could take some other appropriate action. I would have no objection to annotating all the pt_regs-style entry code, whether by putting it in a separate section or by making a table of addresses. There are a couple of nasty cases if NMI or MCE is involved but, as of 4.6, outside of NMI, MCE, and vmalloc faults (ugh!), there should always be a complete pt_regs on the stack before interrupts get enabled for each entry. Of course, finding the thing may be nontrivial in case other things were pushed. I suppose we could try to rejigger the code so that rbp points to pt_regs or similar. --Andy