Received: by 2002:a05:6a10:6006:0:0:0:0 with SMTP id w6csp156890pxa; Wed, 26 Aug 2020 07:19:53 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzd3tgBx0p/eLm7HVNYqnoktcn4aEDwlk1+6hZym/fiERkzfA1dgb86rqUrG8w8rfyi0fFi X-Received: by 2002:a17:906:c108:: with SMTP id do8mr16561322ejc.88.1598451593502; Wed, 26 Aug 2020 07:19:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598451593; cv=none; d=google.com; s=arc-20160816; b=SlK/lzPyDqpd7cYiaz+Q2aLdl3SgwRRiFP2tbtJJzPye+yGplWunHw56r2zcsWhVt5 igoB6lbDKy2BtgH9bHXDus9V6xImA8pZPrauaX8Lk6YHRoKlr0rT9PcPxgFOM15wBo1A K6f34zZGSM6rgNBjMeR4bwcM7S1sXEVzQC/Sbfi512NKDp66Xz+2jpL5D4y6rGMDTn3G fRhDpC1hdJKF/kjToZNVNJz1ScALV4dCJ5HIDCK5zfLv241KYCAZv80QZIrt+9uqv9w0 ArLNzQ0s1x8wOESE4z8iePYbs/vblexoSUI3bza5J7kp0S46/Ec6olcHBDGIyBU7IIRe RzvA== 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 :references:in-reply-to:message-id:subject:cc:to:from:date :dkim-signature; bh=/CfpGC4D7UZVXzHJ60DVdldzD0i6As8N2MT3Btq5M30=; b=ZmNK/U2PzbxNXecjr/xHgYCcBHe63bKnU3jpD1+GabNe1DWdrKc/BmoyIrtqwzbnfi hsifnJLXdNpCPXM7vTrZDMvaHrEaJXOF+lWRlUt9ojPVV5ZVtOHz9G+pUouu29w/9T/C rfKA2KPVcq9A8jhI65ZShOKyEb5eSZMA+o/EotSF9+szka/8aPkYgcDAuR2f2meAbf/e vKJ6dAZ10aUMA/9+a1C8bBADTik67GKcjlcuAcLIOodRvr2uVWcru3U87Mq2x8/jyHPI fipaqAiyU46MIbcqrVOVwuHNQRhkwNNGmhXlfq8wK8cZ7WSJfg4wa04lxbJHDn7KHKGO 3CaA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=D42ocn71; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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 vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id n25si1582019eji.174.2020.08.26.07.19.30; Wed, 26 Aug 2020 07:19:53 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=D42ocn71; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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 S1728463AbgHZKAp (ORCPT + 99 others); Wed, 26 Aug 2020 06:00:45 -0400 Received: from mail.kernel.org ([198.145.29.99]:55096 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728086AbgHZKAp (ORCPT ); Wed, 26 Aug 2020 06:00:45 -0400 Received: from devnote2 (NE2965lan1.rev.em-net.ne.jp [210.141.244.193]) (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 B0F0D20786; Wed, 26 Aug 2020 10:00:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1598436045; bh=4R1A9/PN9wVaIdSe/0IN1S+Pj6t3/4kfuPgweaMW0sA=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=D42ocn71NjTNqMYdwTl34QJmoFLOQjaz+HOhfo1ZizZtNWyG6DHLofD9PJDYGNMPj OZBkYB1UgUbfj3Xcs9jik27c1CObXewe84FfvoG9x1EYE/IOssasEfZvXWCS1CJwyz 35FtUfcaYo3aDqLXL7ssRmJCUa4d9fL3k+3VDUbo= Date: Wed, 26 Aug 2020 19:00:41 +0900 From: Masami Hiramatsu To: Masami Hiramatsu Cc: "Eddy_Wu@trendmicro.com" , "peterz@infradead.org" , "linux-kernel@vger.kernel.org" , "x86@kernel.org" Subject: Re: x86/kprobes: kretprobe fails to triggered if kprobe at function entry is not optimized (trigger by int3 breakpoint) Message-Id: <20200826190041.2d0ff0fbe154ba62163b0c00@kernel.org> In-Reply-To: <20200826180645.9b609fc05df2a149564df1b8@kernel.org> References: <8816bdbbc55c4d2397e0b02aad2825d3@trendmicro.com> <20200825005426.f592075d13be740cb3c9aa77@kernel.org> <7396e7b2079644a6aafd9670a111232b@trendmicro.com> <20200825151538.f856d701a34f4e0561a64932@kernel.org> <20200825120911.GX1362448@hirez.programming.kicks-ass.net> <20200826172239.ff175be78ee5f3a4380579c3@kernel.org> <20200826180645.9b609fc05df2a149564df1b8@kernel.org> 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 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 26 Aug 2020 18:06:45 +0900 Masami Hiramatsu wrote: > On Wed, 26 Aug 2020 17:22:39 +0900 > Masami Hiramatsu wrote: > > > On Wed, 26 Aug 2020 07:07:09 +0000 > > "Eddy_Wu@trendmicro.com" wrote: > > > > > > > > > -----Original Message----- > > > > From: peterz@infradead.org > > > > Sent: Tuesday, August 25, 2020 8:09 PM > > > > To: Masami Hiramatsu > > > > Cc: Eddy Wu (RD-TW) ; linux-kernel@vger.kernel.org; x86@kernel.org; David S. Miller > > > > > > > > Subject: Re: x86/kprobes: kretprobe fails to triggered if kprobe at function entry is not optimized (trigger by int3 breakpoint) > > > > > > > > Surely we can do a lockless list for this. We have llist_add() and > > > > llist_del_first() to make a lockless LIFO/stack. > > > > > > > > > > llist operations require atomic cmpxchg, for some arch doesn't have CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG, in_nmi() check might still needed. > > > (HAVE_KRETPROBES && !CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG): arc, arm, csky, mips > > > > Good catch. In those cases, we can add in_nmi() check at arch dependent code. > > Oops, in_nmi() check is needed in pre_kretprobe_handler() which has no > arch dependent code. Hmm, so we still need an weak function to check it... Oops, again. Sorry I found a big misunderstand. I found the in_nmi() check is completely unnecessary with Jiri's commit 9b38cc704e84 ("kretprobe: Prevent triggering kretprobe from within kprobe_flush_task"). This commit introduced the kprobe_busy_begin/end() to the kretproeb trampoline handler, which set a dummy kprobe to the per-cpu current kprobe pointer. This current-kprobe is checked at the kprobe pre handler to prevent kprobes (including kretprobe) recursion. This means, if an NMI interrupts a kretprobe operation (both pre-handler and trampoline-handler) and it hits the same kretprobe, this nested kretprobe handlers never be called, because there is a current kprobe is already set. Thus, we are totally safe from double-lock issue in the kretprobe handlers. So we can just remove the in_nmi() check from pre_kretprobe_handler() if we introduced a generic trampoline handler, since kprobe_busy_begin/end() must called from the trampoline handlers. Currently it is used on x86 only. Of course, this doesn't solve the llist_del_first() contention in the pre_kretprobe_handler(). So anyway we need a lock for per-probe llist (if I understand llist.h comment correctly.) Thank you, -- Masami Hiramatsu