From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754533AbYHNXu1 (ORCPT ); Thu, 14 Aug 2008 19:50:27 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751818AbYHNXuR (ORCPT ); Thu, 14 Aug 2008 19:50:17 -0400 Received: from gw.goop.org ([64.81.55.164]:60967 "EHLO mail.goop.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751817AbYHNXuO (ORCPT ); Thu, 14 Aug 2008 19:50:14 -0400 Message-ID: <48A4C491.4050301@goop.org> Date: Thu, 14 Aug 2008 16:49:37 -0700 From: Jeremy Fitzhardinge User-Agent: Thunderbird 2.0.0.16 (X11/20080723) MIME-Version: 1.0 To: Steven Rostedt CC: LKML , Ingo Molnar , Thomas Gleixner , Peter Zijlstra , Andrew Morton , Linus Torvalds , David Miller , Mathieu Desnoyers , Roland McGrath , Ulrich Drepper , Rusty Russell , Gregory Haskins , Arnaldo Carvalho de Melo , "Luis Claudio R. Goncalves" , Clark Williams , srostedt@redhat.com Subject: Re: [PATCH] ftrace: use only 5 byte nops for x86 References: In-Reply-To: X-Enigmail-Version: 0.95.6 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Steven Rostedt wrote: > Mathieu Desnoyers revealed a bug in the original code. The nop that is > used to relpace the mcount caller can be a two part nop. This runs the > risk where a process can be preempted after executing the first nop, but > before the second part of the nop. > > The ftrace code calls kstop_machine to keep multiple CPUs from executing > code that is being modified, but it does not protect against a task preempting > in the middle of a two part nop. > > If the above preemption happens and the tracer is enabled, after the > kstop_machine runs, all those nops will be calls to the trace function. > If the preempted process that was preempted between the two nops is executed > again, it will execute half of the call to the trace function, and this > might crash the system. > > This patch instead uses what both the latest Intel and AMD spec suggests. > That is the P6_NOP5 sequence of "0x0f 0x1f 0x44 0x00 0x00". > Note, some older CPUs and QEMU might fault on this nop, so this nop > is executed with fault handling first. If it detects a fault, it will then > use the code "0x66 0x66 0x66 0x66 0x90". If that faults, Seems very unlikely, but go mad ;) > it will then > default to a simple "jmp 1f; .byte 0x00 0x00 0x00; 1:". The jmp is > not optimal but will do if the first two can not be executed. > > TODO: Examine the cpuid to determine the nop to use. > Don't think that will help in general. qemu claims its a Pentium II. J