Received: by 2002:a25:b794:0:0:0:0:0 with SMTP id n20csp2766653ybh; Mon, 5 Aug 2019 06:31:28 -0700 (PDT) X-Google-Smtp-Source: APXvYqyQYw/nWaEQzrQZ8aQBaVuknNqxv++4LovN894rEwhvPZ8yHzV8ZjVA4oByHBO19cQgXbkc X-Received: by 2002:a63:a35c:: with SMTP id v28mr43825838pgn.144.1565011887972; Mon, 05 Aug 2019 06:31:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1565011887; cv=none; d=google.com; s=arc-20160816; b=CkoEGkVMpkCVf/17oZ6iwu/R+opRxAljAJvzu0YRT2moqloLCdlXDSWe3h5o6Txw65 yK+857l1mvxmdd5JASiY7fQtXp61XyCKu4tWKsP4C35YCxVUWU15XghBiqqvP51l8YGk DQERiI//zc3Q6k0UUadAp+rGupxUo8yXFrrHymhWasumT8rP08kX8DJzKwSzgffikLPa 1a/j4cnNu25/JfWsV5i3gmw26kQ06B8LefNKzIhadSSUX3JeP+9VHEDbeIYVB+dKMHDw IxQT+j+0qQGQu8D8W6AAmqBPoaatYSLAqujFD3PsaU5H7k9WR7wBcRImSg5RfOiAMvVe PzKw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=uG/LcBK4M+PDwAgMduxWHNTTcHffPJLBc1mShLK1cdU=; b=q74E26kw+Qz5//w+nUAF9RZ+OJ0yrkNLWCVotRl91LWnQpinIfD0QVBhjHTfVk/Kxs +CXkpZeYCmFhcAOjR+hQ7grcFlOu0gR7tMVrkbr4UuTNx0AeoloEPomlwneUcW75mYjX V9owQ0ZfE5/sr2QVW474Bcmk803VbyG+WEzjc61Qm4ehSHClXkVDfoqNBcemqKOgD1Di 0fktv99ct1ZD5EHLe7gIVo29zN8of7E7mCa3bgGXplAUkbJLXOv3+UP49OJ8zEKeutG5 J6l36S5DG6Lp1lpICNlEwgRP2iX8oGNRzNb0KL3CnZAlOUSqspsoGkLyw5VHkzMn481a R0DA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ULaq6V8H; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g5si12753501pgj.385.2019.08.05.06.31.12; Mon, 05 Aug 2019 06:31:27 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ULaq6V8H; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729407AbfHENUg (ORCPT + 99 others); Mon, 5 Aug 2019 09:20:36 -0400 Received: from mail.kernel.org ([198.145.29.99]:56604 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728800AbfHENUb (ORCPT ); Mon, 5 Aug 2019 09:20:31 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id D84102067D; Mon, 5 Aug 2019 13:20:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1565011230; bh=6o0ZCo4Zmg0dF9N4Daf8VQszTRUhNoiXuKCDiGqX01M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ULaq6V8H0kwZ3ehqEhYofYipP3TJKySDHREbauXtDWy/oCuO/IAXJ7TPjAE7/cbaB FUda/KuAglairwc63UQkQAy2HXbfcxS0ZfbgretmLKhRyhL09Uq+y/dNJDESYYQUd8 0FRu/GP1vprusYNvrjXxgHigcbYZJrdhM2V/2/wE= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Cheng Jian , "Steven Rostedt (VMware)" , Sasha Levin Subject: [PATCH 5.2 006/131] ftrace: Enable trampoline when rec count returns back to one Date: Mon, 5 Aug 2019 15:01:33 +0200 Message-Id: <20190805124951.850680333@linuxfoundation.org> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190805124951.453337465@linuxfoundation.org> References: <20190805124951.453337465@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org [ Upstream commit a124692b698b00026a58d89831ceda2331b2e1d0 ] Custom trampolines can only be enabled if there is only a single ops attached to it. If there's only a single callback registered to a function, and the ops has a trampoline registered for it, then we can call the trampoline directly. This is very useful for improving the performance of ftrace and livepatch. If more than one callback is registered to a function, the general trampoline is used, and the custom trampoline is not restored back to the direct call even if all the other callbacks were unregistered and we are back to one callback for the function. To fix this, set FTRACE_FL_TRAMP flag if rec count is decremented to one, and the ops that left has a trampoline. Testing After this patch : insmod livepatch_unshare_files.ko cat /sys/kernel/debug/tracing/enabled_functions unshare_files (1) R I tramp: 0xffffffffc0000000(klp_ftrace_handler+0x0/0xa0) ->ftrace_ops_assist_func+0x0/0xf0 echo unshare_files > /sys/kernel/debug/tracing/set_ftrace_filter echo function > /sys/kernel/debug/tracing/current_tracer cat /sys/kernel/debug/tracing/enabled_functions unshare_files (2) R I ->ftrace_ops_list_func+0x0/0x150 echo nop > /sys/kernel/debug/tracing/current_tracer cat /sys/kernel/debug/tracing/enabled_functions unshare_files (1) R I tramp: 0xffffffffc0000000(klp_ftrace_handler+0x0/0xa0) ->ftrace_ops_assist_func+0x0/0xf0 Link: http://lkml.kernel.org/r/1556969979-111047-1-git-send-email-cj.chengjian@huawei.com Signed-off-by: Cheng Jian Signed-off-by: Steven Rostedt (VMware) Signed-off-by: Sasha Levin --- kernel/trace/ftrace.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 576c41644e77c..208220d526e83 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -1622,6 +1622,11 @@ static bool test_rec_ops_needs_regs(struct dyn_ftrace *rec) return keep_regs; } +static struct ftrace_ops * +ftrace_find_tramp_ops_any(struct dyn_ftrace *rec); +static struct ftrace_ops * +ftrace_find_tramp_ops_next(struct dyn_ftrace *rec, struct ftrace_ops *ops); + static bool __ftrace_hash_rec_update(struct ftrace_ops *ops, int filter_hash, bool inc) @@ -1750,15 +1755,17 @@ static bool __ftrace_hash_rec_update(struct ftrace_ops *ops, } /* - * If the rec had TRAMP enabled, then it needs to - * be cleared. As TRAMP can only be enabled iff - * there is only a single ops attached to it. - * In otherwords, always disable it on decrementing. - * In the future, we may set it if rec count is - * decremented to one, and the ops that is left - * has a trampoline. + * The TRAMP needs to be set only if rec count + * is decremented to one, and the ops that is + * left has a trampoline. As TRAMP can only be + * enabled if there is only a single ops attached + * to it. */ - rec->flags &= ~FTRACE_FL_TRAMP; + if (ftrace_rec_count(rec) == 1 && + ftrace_find_tramp_ops_any(rec)) + rec->flags |= FTRACE_FL_TRAMP; + else + rec->flags &= ~FTRACE_FL_TRAMP; /* * flags will be cleared in ftrace_check_record() @@ -1951,11 +1958,6 @@ static void print_ip_ins(const char *fmt, const unsigned char *p) printk(KERN_CONT "%s%02x", i ? ":" : "", p[i]); } -static struct ftrace_ops * -ftrace_find_tramp_ops_any(struct dyn_ftrace *rec); -static struct ftrace_ops * -ftrace_find_tramp_ops_next(struct dyn_ftrace *rec, struct ftrace_ops *ops); - enum ftrace_bug_type ftrace_bug_type; const void *ftrace_expected; -- 2.20.1