From patchwork Mon Mar 2 14:25:08 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Nan X-Patchwork-Id: 5914071 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 2F615BF440 for ; Mon, 2 Mar 2015 14:48:27 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 51399201FB for ; Mon, 2 Mar 2015 14:48:26 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 05801201BC for ; Mon, 2 Mar 2015 14:48:25 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1YSRaJ-0003jP-Pj; Mon, 02 Mar 2015 14:44:39 +0000 Received: from merlin.infradead.org ([2001:4978:20e::2]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1YSRJL-00047D-JZ for linux-arm-kernel@bombadil.infradead.org; Mon, 02 Mar 2015 14:27:07 +0000 Received: from szxga03-in.huawei.com ([119.145.14.66]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1YSRJI-0003SV-6E for linux-arm-kernel@lists.infradead.org; Mon, 02 Mar 2015 14:27:06 +0000 Received: from 172.24.2.119 (EHLO lggeml422-hub.china.huawei.com) ([172.24.2.119]) by szxrg03-dlp.huawei.com (MOS 4.4.3-GA FastPath queued) with ESMTP id BCM87896; Mon, 02 Mar 2015 22:26:05 +0800 (CST) Received: from kernel-host.huawei (10.107.197.247) by lggeml422-hub.china.huawei.com (10.72.61.32) with Microsoft SMTP Server id 14.3.158.1; Mon, 2 Mar 2015 22:25:54 +0800 From: Wang Nan To: , , , , Subject: [RFC PATCH v4 30/34] early kprobes: convert early kprobes on ftrace to ftrace. Date: Mon, 2 Mar 2015 22:25:08 +0800 Message-ID: <1425306312-3437-31-git-send-email-wangnan0@huawei.com> X-Mailer: git-send-email 1.8.4 In-Reply-To: <1425306312-3437-1-git-send-email-wangnan0@huawei.com> References: <1425306312-3437-1-git-send-email-wangnan0@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.107.197.247] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020205.54F472FE.000E, ss=1, re=0.001, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0, so=2013-05-26 15:14:31, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 9bd58bdb3949d679c68f8a9057d04736 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20150302_092705_012804_9C078FD6 X-CRM114-Status: GOOD ( 11.99 ) X-Spam-Score: -4.2 (----) Cc: x86@kernel.org, lizefan@huawei.com, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch converts early kprobes on ftrace to ftrace after ftrace_init() is done. It calls arm_kprobe_ftrace() for such kprobes. This ftrace call will trigger mechanism introduced by previous patches, replaces them with ftrace. After that, for each early kprobe, 3 cases are dealed differently: for independent kprobe, simply release its resources by arch_remove_kprobe(). For aggr kprobe with single kprobed, free the aggr kprobe and replace the original kprobe in hash table. Note that some flags must be inherited. For aggr kprobes linked with more than one kprobe, free resources of each kprobe. Signed-off-by: Wang Nan --- kernel/kprobes.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/kernel/kprobes.c b/kernel/kprobes.c index c504c1c..95754f6 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c @@ -2657,8 +2657,70 @@ kprobe_on_ftrace_get_old_insn(struct dyn_ftrace *rec, return ret; } +static void convert_early_kprobes_on_ftrace(void) +{ + struct hlist_head *head; + struct kprobe *p; + int i; + + /* + * arm_kprobe_ftrace --> kprobe_on_ftrace_get_old_insn require + * kprobe_mutex, and we also need it to protect kprobe table. + */ + mutex_lock(&kprobe_mutex); + for (i = 0; i < KPROBE_TABLE_SIZE; i++) { + head = &kprobe_table[i]; + hlist_for_each_entry_rcu(p, head, hlist) { + if (!(p->flags & KPROBE_FLAG_FTRACE_EARLY)) + continue; + + p->flags |= KPROBE_FLAG_FTRACE; + arm_kprobe_ftrace(p); + p->flags &= ~KPROBE_FLAG_FTRACE_EARLY; + p->flags &= ~KPROBE_FLAG_OPTIMIZED; + + /* Now we are able to free resources. */ + if (!kprobe_aggrprobe(p)) { + /* + * This is an independent kprobe. arch_remove_kprobe() + * only free resources. + */ + arch_remove_kprobe(p); + arch_prepare_kprobe_ftrace(p); + } else if (list_is_singular(&p->list)) { + struct kprobe *kp; + + /* + * Different from __unregister_kprobe_bottom, + * this time p is aggr kprobe. Replace the original + * 'struct kprobe' with aggr kprobe and free aggr_kprobe. + */ + kp = list_entry(p->list.next, struct kprobe, list); + + /* Inherit flags. */ + kp->flags |= (p->flags & + (KPROBE_FLAG_DISABLED | KPROBE_FLAG_FTRACE)); + hlist_replace_rcu(&p->hlist, &kp->hlist); + + list_del(&p->list); + free_aggr_kprobe(p); + arch_prepare_kprobe_ftrace(kp); + } else { + struct kprobe *list_p; + + list_for_each_entry_rcu(list_p, &p->list, list) { + arch_remove_kprobe(p); + arch_prepare_kprobe_ftrace(list_p); + } + } + } + } + mutex_unlock(&kprobe_mutex); +} + void init_kprobes_on_ftrace(void) { kprobes_on_ftrace_initialized = true; + convert_early_kprobes_on_ftrace(); } #endif