From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleg Nesterov Subject: Re: [PATCH] uprobes/x86: emulate push insns for uprobe on x86 Date: Thu, 9 Nov 2017 14:44:23 +0100 Message-ID: <20171109134423.GA8746@redhat.com> References: <20171109080155.359718-1-yhs@fb.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: mingo@kernel.org, tglx@linutronix.de, peterz@infradead.org, linux-kernel@vger.kernel.org, x86@kernel.org, netdev@vger.kernel.org, ast@fb.com, kernel-team@fb.com To: Yonghong Song Return-path: Content-Disposition: inline In-Reply-To: <20171109080155.359718-1-yhs@fb.com> Sender: linux-kernel-owner@vger.kernel.org List-Id: netdev.vger.kernel.org On 11/09, Yonghong Song wrote: > > This patch extends the emulation to "push " > insns. These insns are typical in the beginning > of the function. For example, bcc > in https://github.com/iovisor/bcc repo provides > tools to measure funclantency, detect memleak, etc. > The tools will place uprobes in the beginning of > function and possibly uretprobes at the end of function. > This patch is able to reduce the trap overhead for > uprobe from 2 to 1. OK. but to be honest I do not like the implementation, please see below. > +enum uprobe_insn_t { > + UPROBE_BRANCH_INSN = 0, > + UPROBE_PUSH_INSN = 1, > +}; > + > struct uprobe_xol_ops; > > struct arch_uprobe { > @@ -42,6 +47,7 @@ struct arch_uprobe { > }; > > const struct uprobe_xol_ops *ops; > + enum uprobe_insn_t insn_class; Why? I'd suggest to leave branch_xol_ops alone and add the new push_xol_ops{}, the code will look much simpler. The only thing they can share is branch_post_xol_op() which is just regs->sp += sizeof_long(); return -ERESTART; I think a bit of code duplication would be fine in this case. And. Do you really need ->post_xol() method to emulate "push"? Why we can't simply execute it out-of-line if copy_to_user() fails? branch_post_xol_op() is needed because we can't execute "call" out-of-line, we need to restart and try again if copy_to_user() fails, but I don not understand why it is needed to emulate "push". Oleg.