Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754921Ab0AEPqe (ORCPT ); Tue, 5 Jan 2010 10:46:34 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754883Ab0AEPqe (ORCPT ); Tue, 5 Jan 2010 10:46:34 -0500 Received: from mtagate4.de.ibm.com ([195.212.17.164]:45664 "EHLO mtagate4.de.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754572Ab0AEPqb (ORCPT ); Tue, 5 Jan 2010 10:46:31 -0500 Date: Tue, 5 Jan 2010 16:46:10 +0100 From: Martin Schwidefsky To: Oleg Nesterov Cc: Roland McGrath , caiqian@redhat.com, Heiko Carstens , Jan Kratochvil , linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org, utrace-devel@redhat.com Subject: Re: s390 && user_enable_single_step() (Was: odd utrace testing results on s390x) Message-ID: <20100105164610.388effd3@mschwide.boeblingen.de.ibm.com> In-Reply-To: <20100105153633.GA9376@redhat.com> References: <1503844142.2061111261478093776.JavaMail.root@zmail06.collab.prod.int.phx2.redhat.com> <1257887498.2061171261478252049.JavaMail.root@zmail06.collab.prod.int.phx2.redhat.com> <20100104155225.GA16650@redhat.com> <20100104171626.22ea2d9c@mschwide.boeblingen.de.ibm.com> <20100104181412.GA21146@redhat.com> <20100104211147.4CC94D532@magilla.sf.frob.com> <20100105105030.66bb8a0a@mschwide.boeblingen.de.ibm.com> <20100105153633.GA9376@redhat.com> Organization: IBM Corporation X-Mailer: Claws Mail 3.7.3 (GTK+ 2.18.5; i486-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3775 Lines: 129 On Tue, 5 Jan 2010 16:36:33 +0100 Oleg Nesterov wrote: > On 01/05, Martin Schwidefsky wrote: > > > > On Mon, 4 Jan 2010 13:11:47 -0800 (PST) > > Roland McGrath wrote: > > > > > > This probably means that copy_process()->user_disable_single_step() > > > > is not enough to clear the "this task wants single-stepping" copied > > > > from parent. > > > > > > I would suspect s390's TIF_SINGLE_STEP flag here. That flag means "a > > > single-step trap occurred". This is what causes do_single_step to be > > > called before returning to user mode, rather than the machine trap doing it > > > directly as is done in the other arch implementations. > > > > Just my thinking as well. > > Oh, I am not sure. But I don't understand TIF_SINGLE_STEP on s390, > absolutely. > > For example, why do_signal() sets TIF_SINGLE_STEP? Why can't we do > > --- a/arch/s390/kernel/signal.c > +++ b/arch/s390/kernel/signal.c > @@ -500,18 +500,10 @@ void do_signal(struct pt_regs *regs) > clear_thread_flag(TIF_RESTORE_SIGMASK); > > /* > - * If we would have taken a single-step trap > - * for a normal instruction, act like we took > - * one for the handler setup. > - */ > - if (current->thread.per_info.single_step) > - set_thread_flag(TIF_SINGLE_STEP); > - > - /* > * Let tracing know that we've done the handler setup. > */ > tracehook_signal_handler(signr, &info, &ka, regs, > - test_thread_flag(TIF_SINGLE_STEP)); > + current->thread.per_info.single_step); > } > return; > } > > ? The reason why we set the TIF_SINGLE_STEP bit in do_signal is that we want to be able to stop the debugged program before the first instruction of the signal handler has been executed. The PER single step causes a trap after an instruction has been executed. That first instruction can do bad things to the arguments of the signal handler.. > Apart from arch/s390/signal.c, TIF_SINGLE_STEP is used by entry.S > but I don't understand this asm at all. > > Anyway. I modified the debugging patch a bit: > > --- K/arch/s390/kernel/traps.c~ 2009-12-22 10:41:52.909174198 -0500 > +++ K/arch/s390/kernel/traps.c 2010-01-05 09:49:19.541792379 -0500 > @@ -384,6 +384,8 @@ void __kprobes do_single_step(struct pt_ > } > if (tracehook_consider_fatal_signal(current, SIGTRAP)) > force_sig(SIGTRAP, current); > + else > + printk("XXX: %d %d\n", current->pid, test_thread_flag(TIF_SINGLE_STEP)); > } > > static void default_trap_handler(struct pt_regs * regs, long interruption_code) > ------------------------------------------------------------------------------- > > Now, when I run this test-case > > #include > #include > #include > #include > #include > #include > > int main(void) > { > int pid, status; > > if (!(pid = fork())) { > assert(ptrace(PTRACE_TRACEME) == 0); > kill(getpid(), SIGSTOP); > > if (!fork()) > return 43; > > wait(&status); > return WEXITSTATUS(status); > } > > > for (;;) { > assert(pid == wait(&status)); > if (WIFEXITED(status)) > break; > assert(ptrace(PTRACE_SINGLESTEP, pid, 0,0) == 0); > } > > assert(WEXITSTATUS(status) == 43); > return 0; > } > > dmesg shows 799 lines of > > XXX: 2389 0 > > > The kernel is 2.6.32.2 + utrace, but CONFIG_UTRACE is not set. With or without my bug fix ? -- blue skies, Martin. "Reality continues to ruin my life." - Calvin. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/