Received: by 2002:a6b:500f:0:0:0:0:0 with SMTP id e15csp741332iob; Wed, 4 May 2022 07:07:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwqChItqP1G/N2k1dWZqMceDaeuccxJ7kL6HptzSyiHpNdcnmdQuAxwD9jqM2RGY6eTI2AD X-Received: by 2002:a65:410a:0:b0:399:38b9:8ba with SMTP id w10-20020a65410a000000b0039938b908bamr17676470pgp.526.1651673269737; Wed, 04 May 2022 07:07:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651673269; cv=none; d=google.com; s=arc-20160816; b=UX/3ArDjytoH2A49I3N0a3mMCNQCvxO50F5vvnRGgYzIvmVr9ludD+a5suP43a6Jsg QeFwNmJdRBoMz19VSYbmNwqwMoPnuVGY6pKIYlWydxlHRDNdKvGLAbGqTeXsqqGvuPp0 GVT+RMtvQcoawcVP0iZXm1eyfH/1tlUicYgLsdq70n9Hd5Oz+NpNmN9PwseWb/U2uDtz ZJ7Tpvg/3Xz1T8W8/WBr1yijajUe2iiMW+ONSTvtUoRxcHHpORuw7N/J2BNrdEm6Sa9+ rAEsfkO6PNHgw2RpWMzaVS30cWjFE5/p724dCqSnIA7ZiqhF9TLhy+rx5VuIKGa3fn3a XyYQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:subject:cc:to:from:date :dkim-signature; bh=zQEISWyrROo3/rf2Y6T5U2QNO6IMUO4uQnl1E4QPvMM=; b=JHntgd1+CI8erLGYGIZzYd9KDOfle593ywNtTaMXxW7FFiAGNr8m4B1kQ689WfMbOE GOnrpUN2HkTUbMfr1D+Z8Fv9ZJCDFqpMjac6nxl2LuhIT+V2bz6PWmDOaLxe7RyJ1rGJ wL8zBPnzBpdq96vz2XkCA6VAXMNQkJd7rmoRLOBkNos/ZH5CmIHqyVgdfH6mkjy5u7Al XQRS8JrWN1QbfSlZ7Q10SD1u/g1Mmhkj59TZa1UeSObaWCe2g1BDoPXpNvAJ3cFqxx+j YkMKAS9ZAMG7IonCieBkaKUlOz0SYQr8vnGzXJvVdPF7WSieW8lvsEl0WJsjk4opX+JV ZVwA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=QbEWqbMD; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id h67-20020a636c46000000b003aa3b446c56si19432394pgc.446.2022.05.04.07.07.34; Wed, 04 May 2022 07:07:49 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=QbEWqbMD; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234944AbiEDDMp (ORCPT + 99 others); Tue, 3 May 2022 23:12:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49612 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234553AbiEDDMo (ORCPT ); Tue, 3 May 2022 23:12:44 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 00A7D21822 for ; Tue, 3 May 2022 20:09:09 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 868A561A09 for ; Wed, 4 May 2022 03:09:09 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2C778C385A9; Wed, 4 May 2022 03:09:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1651633748; bh=F8QW+wIsoFr2lyq4hl8rS+K765rspuzoJi3AePuUQiU=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=QbEWqbMDeBnrtlbOwJi3nmf9RCz6cxuliAo21guAoJRwQUKqFbN+cpKqvmnokdU61 wbgM39UugxOW1HV5LspeCP/OzSA+MLt0h4Lpp0mzur1REH84SMMsHcsB9Ed9HbXBp6 QQr0/LJ/oDMbommUtugfKB6W+mludnh65xSYQQxIQ50Xl6E+oxwVAO3UA/bZVf60ap pu67EHpZiUWSQ7EzAM0SwDwIyrO7FQBwd2mOh9SccwaHXj7rM2tTuV8XWACe4BgzBt h0XXEap7e4OCa5u/ZD3Mu7PxaPnJka25PFs+Zo7/UcSgLwA9F+taxCxSw9M+2lDieT W53R6U0MCwfbQ== Date: Wed, 4 May 2022 12:09:03 +0900 From: Masami Hiramatsu To: Levi Yun Cc: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, naveen.n.rao@linux.ibm.com, davem@davemloft.net, rostedt@goodmis.org, yun.wang@linux.alibaba.com, x86@kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] kprobe: sync issue's on ftraced-kprobe. Message-Id: <20220504120903.057867b1b2e2fb2b2a542470@kernel.org> In-Reply-To: <20220502045102.40005-1-ppbuk5246@gmail.com> References: <20220502045102.40005-1-ppbuk5246@gmail.com> X-Mailer: Sylpheed 3.7.0 (GTK+ 2.24.32; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,NICE_REPLY_A, RCVD_IN_DNSWL_HI,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 2 May 2022 13:51:02 +0900 Levi Yun wrote: > In kprobe_ftrace_handler, it accesses get kporbe without kprobe_mutex > held. > > This makes some of synchronizing issue when we use kprobe API in > kernel-module. NAK this, because get_kprobes() doesn't require the kprobe_mutex in the preempt-disabled context. Please read the comment of get_kprobe(). /* * This routine is called either: * - under the 'kprobe_mutex' - during kprobe_[un]register(). * OR * - with preemption disabled - from architecture specific code. */ struct kprobe *get_kprobe(void *addr) Moreover, we can not use mutex inside kprobe handler because it runs in the interrupt context. Thank you, > > Below is what i experienced: > > CPU 0 CPU 1 > <...> > kprobe_ftrace_handler > get_kprobe > __this_cpu_write > unregister_kprobe > unload_module > < kprobe memory gone> > p->pre_handler > page_fault > kprobe_fault_handler > (In here, kprobe memory gone, > double page fault is happening inifinie). > > Signed-off-by: Levi Yun > --- > arch/x86/kernel/kprobes/ftrace.c | 3 +++ > include/linux/kprobes.h | 2 ++ > kernel/kprobes.c | 2 +- > 3 files changed, 6 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/kernel/kprobes/ftrace.c b/arch/x86/kernel/kprobes/ftrace.c > index dd2ec14adb77..76147ff6ed88 100644 > --- a/arch/x86/kernel/kprobes/ftrace.c > +++ b/arch/x86/kernel/kprobes/ftrace.c > @@ -25,6 +25,7 @@ void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip, > if (bit < 0) > return; > > + mutex_lock(&kprobe_mutex); > p = get_kprobe((kprobe_opcode_t *)ip); > if (unlikely(!p) || kprobe_disabled(p)) > goto out; > @@ -57,7 +58,9 @@ void kprobe_ftrace_handler(unsigned long ip, unsigned long parent_ip, > */ > __this_cpu_write(current_kprobe, NULL); > } > + > out: > + mutex_unlock(&kprobe_mutex); > ftrace_test_recursion_unlock(bit); > } > NOKPROBE_SYMBOL(kprobe_ftrace_handler); > diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h > index 157168769fc2..4a18147ff6d6 100644 > --- a/include/linux/kprobes.h > +++ b/include/linux/kprobes.h > @@ -191,6 +191,8 @@ struct kprobe_blacklist_entry { > DECLARE_PER_CPU(struct kprobe *, current_kprobe); > DECLARE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk); > > +extern struct mutex kprobe_mutex; > + > extern void kprobe_busy_begin(void); > extern void kprobe_busy_end(void); > > diff --git a/kernel/kprobes.c b/kernel/kprobes.c > index dd58c0be9ce2..b65f055b6fa2 100644 > --- a/kernel/kprobes.c > +++ b/kernel/kprobes.c > @@ -64,7 +64,7 @@ static struct hlist_head kprobe_table[KPROBE_TABLE_SIZE]; > static bool kprobes_all_disarmed; > > /* This protects 'kprobe_table' and 'optimizing_list' */ > -static DEFINE_MUTEX(kprobe_mutex); > +DEFINE_MUTEX(kprobe_mutex); > static DEFINE_PER_CPU(struct kprobe *, kprobe_instance); > > kprobe_opcode_t * __weak kprobe_lookup_name(const char *name, > -- > 2.35.1 > -- Masami Hiramatsu