Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966364AbeAJQgr (ORCPT + 1 other); Wed, 10 Jan 2018 11:36:47 -0500 Received: from mail.kernel.org ([198.145.29.99]:43258 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965903AbeAJQgq (ORCPT ); Wed, 10 Jan 2018 11:36:46 -0500 DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 86D0C21740 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=goodmis.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=rostedt@goodmis.org Date: Wed, 10 Jan 2018 11:36:43 -0500 From: Steven Rostedt To: Alan Kao Cc: Palmer Dabbelt , Albert Ou , Ingo Molnar , Masahiro Yamada , Kamil Rytarowski , Andrew Morton , patches@groups.riscv.org, linux-kernel@vger.kernel.org, Alan Kao , Greentime Hu Subject: Re: [PATCH 2/6] riscv/ftrace: Add dynamic function tracer support Message-ID: <20180110113643.7622a7d3@vmware.local.home> In-Reply-To: <20180110073814.32338-3-alankao@andestech.com> References: <20180110073814.32338-1-alankao@andestech.com> <20180110073814.32338-3-alankao@andestech.com> X-Mailer: Claws Mail 3.15.1 (GTK+ 2.24.31; x86_64-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 Return-Path: On Wed, 10 Jan 2018 15:38:10 +0800 Alan Kao wrote: > +static int __ftrace_modify_call(unsigned long hook_pos, unsigned long target, > + bool enable) > +{ > + unsigned int offset = (unsigned int)(target - hook_pos); > + unsigned int auipc_call = to_auipc_insn(offset); > + unsigned int jalr_call = to_jalr_insn(offset); > + unsigned int calls[2] = {auipc_call, jalr_call}; > + unsigned int nops[2] = {NOP4, NOP4}; > + int ret = 0; > + > + /* when ftrace_make_nop is called */ > + if (!enable) > + ret = ftrace_check_current_call(hook_pos, calls); > + > + if (ret) > + goto out; > + > + /* replace the auipc-jalr pair at once */ > + ret = probe_kernel_write((void *)hook_pos, enable ? calls : nops, > + MCOUNT_INSN_SIZE); > + if (ret) You don't want to return the return of probe_kernel_write() here. For ftrace bug to work properly, if a fail to write occurs, you need to return -EPERM. -- Steve > + goto out; > + > + smp_mb(); > + flush_icache_range((void *)hook_pos, (void *)hook_pos + MCOUNT_INSN_SIZE); > + > +out: > + return ret; > +} > + > +int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) > +{ > + int ret = ftrace_check_current_call(rec->ip, NULL); > + > + if (ret) > + return ret; > + > + return __ftrace_modify_call(rec->ip, addr, true); > +} > + > +int ftrace_make_nop(struct module *mod, struct dyn_ftrace *rec, > + unsigned long addr) > +{ > + return __ftrace_modify_call(rec->ip, addr, false); > +} > + > +int ftrace_update_ftrace_func(ftrace_func_t func) > +{ > + int ret = __ftrace_modify_call((unsigned long)&ftrace_call, > + (unsigned long)func, true); > + if (!ret) { > + ret = __ftrace_modify_call((unsigned long)&ftrace_regs_call, > + (unsigned long)func, true); > + } > + > + return ret; > +} > + > +int __init ftrace_dyn_arch_init(void) > +{ > + return 0; > +} > +#endif