Received: by 2002:a25:b794:0:0:0:0:0 with SMTP id n20csp2754270ybh; Mon, 5 Aug 2019 06:19:35 -0700 (PDT) X-Google-Smtp-Source: APXvYqxpT9QN/WFw9YlYD+YQA3msoi+POak5RDZePVOJvchAmZurUTFsCTiozqUKPGoPYTafIdt7 X-Received: by 2002:a17:902:5c3:: with SMTP id f61mr133884726plf.98.1565011175114; Mon, 05 Aug 2019 06:19:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1565011175; cv=none; d=google.com; s=arc-20160816; b=PPhFSqto5beyo9kavE46LACtDftIhTbq9Ul0xHobfD2L7JhpcbMajFXaoUduJmNnE0 HculWr0JRHfnKfM/9UVs3rE3MH+na064g71i4c614+Qprq52ChRmPr+Q0vvlkxlweP2p NSsUsdKdCZqLTXo7MJrAhFnpK4ZLp1kzFEVJtwhYsbDhcIPPl7bLFRF2qi628xB+MbIu nfLh4cq2Y5O1sWRAcM7PB1R+cY/DnpSbKxf+4/aABBoqJJLsytQlVrFIi78YIQtgYp6u M+AOKD8hXCn0KVRuWTsCrAaUqxofCLocI59ujFDU07Azj9IIiC8QFiCoH6c/6vvGB10a TTpQ== 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=a9CHkwI4/GmKAQ97eDU0dZoECqIcHHBpPQAsF6i7q9A=; b=bbBM6hrbc1CfwPmPG/8qISm/EWN3VZJomYrJHvB+cjnu5pQgwGb3FGs9zIKoeF6sxy cyqcmlVd5xx87790WK4FDwVu3boi8kojize7a5fxxYcmtXETekPRxH/Z89nGgoEMhtkT HUcMgMFch2SCnHCeK1V13UTL11XkF6HnoXPb9f09nlLfM0IfNbmcjp7ZjA09c+uOIaER mq8FKGTJyTPJK0IaKiGkIovZGfYI99rcmgVgYUboywVCMOmSFL70GfcRTA/5awwGeZJX yqZuUGl+56+dhzWY23uOnybMyPkIv5jPMkz717PB50i3LrLdullKuUHgx7fDaV8NzoVy sudw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=yijPOfWL; 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 j18si43077894pgh.186.2019.08.05.06.19.19; Mon, 05 Aug 2019 06:19:35 -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=yijPOfWL; 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 S1728995AbfHENRh (ORCPT + 99 others); Mon, 5 Aug 2019 09:17:37 -0400 Received: from mail.kernel.org ([198.145.29.99]:41056 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728665AbfHENFI (ORCPT ); Mon, 5 Aug 2019 09:05:08 -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 E751B2087B; Mon, 5 Aug 2019 13:05:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1565010307; bh=HyhJNyLicfjSVkgqD+X8Uvkq/6ZNGQXGo3GkiCTdH7k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=yijPOfWLnNLX8Q2vQjsDSoGo2Kd35U9cWRSHHChP/8uOACQkpRdQJIJzRKQew7bt1 ViTwzjKZjxyLtzNyToQwbGyo8sp0spl8jkl1fuPKk0IWFWH6olofxY/9nl4MF8dT2k dbrH9b9z7zpwv+EyvtyuD6INtdcjJJgGapKLzSyY= 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 4.9 05/42] ftrace: Enable trampoline when rec count returns back to one Date: Mon, 5 Aug 2019 15:02:31 +0200 Message-Id: <20190805124925.489989989@linuxfoundation.org> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190805124924.788666484@linuxfoundation.org> References: <20190805124924.788666484@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 0043aef0ed8dc..77109b9cf7332 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -1631,6 +1631,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) @@ -1759,15 +1764,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() @@ -1960,11 +1967,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