From nobody Sat Feb 7 08:43:29 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1D535548F7 for ; Mon, 29 Jul 2024 13:45:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722260728; cv=none; b=po65gybRXvaCMyhqAxhHrFN4zaQdlyzm38k4WEzmu0dtWHFoyKs186QMF1O85XDuwTPQZSpRMJ+CW9Dntj0wWgYIdoN2541N8Usc4F3CLv2hYQldD8u2s9c6+u8a51mVkAD0QL8JS3fLGs7KSU62tMzTBVBWHSr23vYFRkdwfOo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722260728; c=relaxed/simple; bh=zb+iSTZql4KUsZK64L6rRY8KfVbZ0mEgSRJm30yZ8RM=; h=Date:From:To:Cc:Subject:Message-ID:MIME-Version:Content-Type: Content-Disposition:In-Reply-To; b=JyXF6JBo48PaR9yweaeJqoQj//avAHCDKGE1gju+HuEioc5qHteCbVlsy7SXE7kdm0v0G12GRde70GGl+9KFdkTmBpugWqic4uPUifef6RHEPQapM6KLzhf4u6z9LWrhH3th49njjaTKAadoBt5Ro4zQ68thzmk+KseqrCl0h6s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=ItrkG75h; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="ItrkG75h" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1722260726; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to; bh=C1WJNTBKD5J69MOoXoXQgf3CGd2QKsmfAAAZ+V0MGsE=; b=ItrkG75hfNXS9ioYmpJ8dT6VFOGND98DyAFEUE+c2IAPJXYpd6Gu9MZgVrdT+UCiuxswF6 ZQ6ExXXS5QG+1anspFAbYMzyo/9F938WvpaCmdGLBlKZBavCz8ygP3ez1SaVr7h2D3lhLA Ipc2dQzTAZ63sLi4Z0BEqFlkPdogtNM= Received: from mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-453-TbW1ZuUnMP6dDLjn_tNGyw-1; Mon, 29 Jul 2024 09:45:20 -0400 X-MC-Unique: TbW1ZuUnMP6dDLjn_tNGyw-1 Received: from mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.15]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 489B41955D59; Mon, 29 Jul 2024 13:45:18 +0000 (UTC) Received: from dhcp-27-174.brq.redhat.com (unknown [10.45.225.232]) by mx-prod-int-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with SMTP id 583151955D47; Mon, 29 Jul 2024 13:45:15 +0000 (UTC) Received: by dhcp-27-174.brq.redhat.com (nbSMTP-1.00) for uid 1000 oleg@redhat.com; Mon, 29 Jul 2024 15:45:18 +0200 (CEST) Date: Mon, 29 Jul 2024 15:45:14 +0200 From: Oleg Nesterov To: andrii@kernel.org, mhiramat@kernel.org, peterz@infradead.org Cc: jolsa@kernel.org, rostedt@goodmis.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Subject: [PATCH v2 1/5] uprobes: document the usage of mm->mmap_lock Message-ID: <20240729134514.GA12309@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20240729134444.GA12293@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 3.0 on 10.30.177.15 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The comment above uprobe_write_opcode() is wrong, unapply_uprobe() calls it under mmap_read_lock() and this is correct. And it is completely unclear why register_for_each_vma() takes mmap_lock for writing, add a comment to explain that mmap_write_lock() is needed to avoid the following race: - A task T hits the bp installed by uprobe and calls find_active_uprobe() - uprobe_unregister() removes this uprobe/bp - T calls find_uprobe() which returns NULL - another uprobe_register() installs the bp at the same address - T calls is_trap_at_addr() which returns true - T returns to handle_swbp() and gets SIGTRAP. Reported-by: Andrii Nakryiko Signed-off-by: Oleg Nesterov Reviewed-by: Jiri Olsa --- kernel/events/uprobes.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index 73cc47708679..73dd12b09a7b 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c @@ -453,7 +453,7 @@ static int update_ref_ctr(struct uprobe *uprobe, struct= mm_struct *mm, * @vaddr: the virtual address to store the opcode. * @opcode: opcode to be written at @vaddr. * - * Called with mm->mmap_lock held for write. + * Called with mm->mmap_lock held for read or write. * Return 0 (success) or a negative errno. */ int uprobe_write_opcode(struct arch_uprobe *auprobe, struct mm_struct *mm, @@ -1046,7 +1046,13 @@ register_for_each_vma(struct uprobe *uprobe, struct = uprobe_consumer *new) =20 if (err && is_register) goto free; - + /* + * We take mmap_lock for writing to avoid the race with + * find_active_uprobe() which takes mmap_lock for reading. + * Thus this install_breakpoint() can not make + * is_trap_at_addr() true right after find_uprobe() + * returns NULL in find_active_uprobe(). + */ mmap_write_lock(mm); vma =3D find_vma(mm, info->vaddr); if (!vma || !valid_vma(vma, is_register) || --=20 2.25.1.362.g51ebf55 From nobody Sat Feb 7 08:43:29 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2CCB914EC4B for ; Mon, 29 Jul 2024 13:45:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722260731; cv=none; b=l6LjQCd+qjVO65nfdkjXW52BklG3Ryauk2m+ZY/DDWNJRdHhMZ0VBGpoSb0Vv2dIo22IyCSQ3hd+f8rhsHWuHv0zP6Tpna2ak2JKtQTDXB1quY0qUJtPKeclEWi6EA2dZr6EcF31WyRPrd1aozjZW81ElVje7gGxLjtlUdZ/L+k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722260731; c=relaxed/simple; bh=X9sVerEKt1nc4tLYSxrNubeU7Sl3l5tWPX0PaqpOl08=; h=Date:From:To:Cc:Subject:Message-ID:MIME-Version:Content-Type: Content-Disposition:In-Reply-To; b=uq+a4QdNLgzM942Xj+/yALf4BzsMqiWTxXyD3P1lCytEG31Jtr/X6+1DcRNRV1I+TWqEIhiNCZZdDHM1M9ap+Hg1hm1CKqAr99lMNvaKTHd0HOr5qPnqmtQo5XkGrkmIwLDf9u9kELZ0YdTxB4EAOMENguHq98QLC9etPBiAiJs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=Q+UlCTgG; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="Q+UlCTgG" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1722260729; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to; bh=UC5k8OWRnrWIz59qmM+Ye9mbOt6cZoUGhOumaByMXUM=; b=Q+UlCTgGntwfmZ/OOfpUHl9FKDst+W8axW6c55QHo7K8xbpgUsiDD2GX8JVU6D6aKs7RM7 WTEJSoEFSpTnZLn8GF7yXulfmC7W7NcOytdGeaVVivwD6NvUK2Au7KWcHFytupU15u6ciy nj9xgtlrk/CB3Z+v8BqHQ6wHxzJX+qU= Received: from mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-512-A3_kniPaNqWixaxdn89sIw-1; Mon, 29 Jul 2024 09:45:25 -0400 X-MC-Unique: A3_kniPaNqWixaxdn89sIw-1 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 6A1ED1944A84; Mon, 29 Jul 2024 13:45:24 +0000 (UTC) Received: from dhcp-27-174.brq.redhat.com (unknown [10.45.225.232]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with SMTP id 5B4D61955E89; Mon, 29 Jul 2024 13:45:20 +0000 (UTC) Received: by dhcp-27-174.brq.redhat.com (nbSMTP-1.00) for uid 1000 oleg@redhat.com; Mon, 29 Jul 2024 15:45:24 +0200 (CEST) Date: Mon, 29 Jul 2024 15:45:19 +0200 From: Oleg Nesterov To: andrii@kernel.org, mhiramat@kernel.org, peterz@infradead.org Cc: jolsa@kernel.org, rostedt@goodmis.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Subject: [PATCH v2 2/5] uprobes: is_trap_at_addr: don't use get_user_pages_remote() Message-ID: <20240729134519.GA12312@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20240729134444.GA12293@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" get_user_pages_remote() and the comment above it make no sense. There is no task_struct passed into get_user_pages_remote() anymore, and nowadays mm_account_fault() increments the current->min/maj_flt counters regardless of FAULT_FLAG_REMOTE. Reported-by: Andrii Nakryiko Acked-by: Andrii Nakryiko Signed-off-by: Oleg Nesterov Reviewed-by: Jiri Olsa --- kernel/events/uprobes.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index 73dd12b09a7b..eb71428691bb 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c @@ -2035,13 +2035,7 @@ static int is_trap_at_addr(struct mm_struct *mm, uns= igned long vaddr) if (likely(result =3D=3D 0)) goto out; =20 - /* - * The NULL 'tsk' here ensures that any faults that occur here - * will not be accounted to the task. 'mm' *is* current->mm, - * but we treat this as a 'remote' access since it is - * essentially a kernel access to the memory. - */ - result =3D get_user_pages_remote(mm, vaddr, 1, FOLL_FORCE, &page, NULL); + result =3D get_user_pages(vaddr, 1, FOLL_FORCE, &page); if (result < 0) return result; =20 --=20 2.25.1.362.g51ebf55 From nobody Sat Feb 7 08:43:29 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EED56154C17 for ; Mon, 29 Jul 2024 13:45:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722260736; cv=none; b=qeffY0MjUHCnrQdIUGMlEC1UBKSrhppZrXoHIbH53diRQw9iGBiCWCLmAb2MNhqHk6ZcpQLUvgp8e2TGOq8oJM+wP5UeIFpGmR/IS8jOrimd0R2mfUbRWTK/jQBoEDwQdigcIxCuTwrPiNjJC3059hXDsV0Ig6ybszKPn5BLQKY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722260736; c=relaxed/simple; bh=+Jaj0ySZV4PKJxGEIPBc49bIf6R+usgarMz7NQSXuqs=; h=Date:From:To:Cc:Subject:Message-ID:MIME-Version:Content-Type: Content-Disposition:In-Reply-To; b=FhqTXCOf/4jAR4hXJTF7uHPaEl1P8n3mUZxgGC+kKeTFEVxKJh/Rf4L4O3GdSKs6ji1qjHz/O3qHXR4xNODhnIGw1+dwbIJl3w0wX90BEv/kM7WXDzZNBxyvdQ7KQRFNPGfO7Wx73Xhpykzvv8zP4/OHb5iZmeLs2QL52O/+r6I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=bu+CMTHz; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="bu+CMTHz" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1722260734; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to; bh=IazVFhmSe+iUEdHuPTWWDxtFDsvZkZ5pxCUbkLWs1O8=; b=bu+CMTHzT28KqSqvQyIEJHLQCVcNYkfwQW1dXdsUgKe3yhwYc7Z9Mx06sma4yLevOuay1b njWFQcIHZFiUwHBuRIK24lha/ov4AItRKeck1ojY9jKOKFL4hpmkHRoIsZ9bRllfO4WBus 573R41ejjIgIqYmWSAmHzCpqXLVPcVI= Received: from mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-650-5tb54cW8OQWUDjV3TGiRqg-1; Mon, 29 Jul 2024 09:45:30 -0400 X-MC-Unique: 5tb54cW8OQWUDjV3TGiRqg-1 Received: from mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.40]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 243461955D59; Mon, 29 Jul 2024 13:45:29 +0000 (UTC) Received: from dhcp-27-174.brq.redhat.com (unknown [10.45.225.232]) by mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with SMTP id 4C7BB1955D42; Mon, 29 Jul 2024 13:45:26 +0000 (UTC) Received: by dhcp-27-174.brq.redhat.com (nbSMTP-1.00) for uid 1000 oleg@redhat.com; Mon, 29 Jul 2024 15:45:29 +0200 (CEST) Date: Mon, 29 Jul 2024 15:45:25 +0200 From: Oleg Nesterov To: andrii@kernel.org, mhiramat@kernel.org, peterz@infradead.org Cc: jolsa@kernel.org, rostedt@goodmis.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Subject: [PATCH v2 3/5] uprobes: simplify error handling for alloc_uprobe() Message-ID: <20240729134525.GA12315@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20240729134444.GA12293@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 3.0 on 10.30.177.40 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Andrii Nakryiko Return -ENOMEM instead of NULL, which makes caller's error handling just a touch simpler. Signed-off-by: Andrii Nakryiko Signed-off-by: Oleg Nesterov Reviewed-by: Jiri Olsa --- kernel/events/uprobes.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index eb71428691bb..dfe6306a63b1 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c @@ -725,7 +725,7 @@ static struct uprobe *alloc_uprobe(struct inode *inode,= loff_t offset, =20 uprobe =3D kzalloc(sizeof(struct uprobe), GFP_KERNEL); if (!uprobe) - return NULL; + return ERR_PTR(-ENOMEM); =20 uprobe->inode =3D inode; uprobe->offset =3D offset; @@ -1167,8 +1167,6 @@ static int __uprobe_register(struct inode *inode, lof= f_t offset, =20 retry: uprobe =3D alloc_uprobe(inode, offset, ref_ctr_offset); - if (!uprobe) - return -ENOMEM; if (IS_ERR(uprobe)) return PTR_ERR(uprobe); =20 --=20 2.25.1.362.g51ebf55 From nobody Sat Feb 7 08:43:29 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D492B14E2E2 for ; Mon, 29 Jul 2024 13:45:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722260742; cv=none; b=gRJSIy4f09zvnI8F7OoGyGtBbmg2nEWCiJTfGyB3yEanL3lTLWg/bCfsrMnCnejk+l3ZKWIlTJoM9wDrT8gcsIMp45c1QTDr/ifM79i7AXyWjh/gPRMqZr2TvwGEr8oVXz8vxX3h7WBz4u7ukrdm7vhnxuTznZKy/Ga3NPL07sM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722260742; c=relaxed/simple; bh=5Zex47x9Yo3uhlo4IPZClngehgjxBTuek1XwGUHYWzo=; h=Date:From:To:Cc:Subject:Message-ID:MIME-Version:Content-Type: Content-Disposition:In-Reply-To; b=W4ILBelu1MosO3/yDstXvGP73KnS6BbBtqvmpSkJrCKHomhKNEAyzjGAd1wI8d7/4cqhfJq+AyInZkOSHGaqGBp2lkpaiEJWD29WlubwmQEsd2459gyUEQutTV+34PudhshHBhYGe1i9bUOiY5/dENGcssehMlKkwQe8RdVc12Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=aGkLGi6C; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="aGkLGi6C" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1722260740; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to; bh=GljItekCZbgj9EI2Gjp6phtbEQZhx+nhGuyR2X5v23M=; b=aGkLGi6Cr27iADf5JT9yuV6/vho95M5IAhiWmDNKcFy+WTikeZ7CpG9+YXPKn/KMDPDl6k Simmgk+sNNiZJJlO20TgRgAsSiy6PxUNcchc7sJxK9F+oLqLTKZ5OV2YHnPNZi2LZIT5JI Rj1tR11VvMxI1X/sSUl1lF7SttmB/Fk= Received: from mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-686-TFltjkw1N3-4hsJX13xbjA-1; Mon, 29 Jul 2024 09:45:35 -0400 X-MC-Unique: TFltjkw1N3-4hsJX13xbjA-1 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 201EA1955D50; Mon, 29 Jul 2024 13:45:34 +0000 (UTC) Received: from dhcp-27-174.brq.redhat.com (unknown [10.45.225.232]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with SMTP id 1EB7B300018D; Mon, 29 Jul 2024 13:45:30 +0000 (UTC) Received: by dhcp-27-174.brq.redhat.com (nbSMTP-1.00) for uid 1000 oleg@redhat.com; Mon, 29 Jul 2024 15:45:34 +0200 (CEST) Date: Mon, 29 Jul 2024 15:45:30 +0200 From: Oleg Nesterov To: andrii@kernel.org, mhiramat@kernel.org, peterz@infradead.org Cc: jolsa@kernel.org, rostedt@goodmis.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Subject: [PATCH v2 4/5] uprobes: kill uprobe_register_refctr() Message-ID: <20240729134530.GA12318@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20240729134444.GA12293@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" It doesn't make any sense to have 2 versions of _register(). Note that trace_uprobe_enable(), the only user of uprobe_register(), doesn't need to check tu->ref_ctr_offset to decide which one should be used, it could safely pass ref_ctr_offset =3D=3D 0 to uprobe_register_refctr(). Add this argument to uprobe_register(), update the callers, and kill uprobe_register_refctr(). Signed-off-by: Oleg Nesterov Acked-by: Andrii Nakryiko Reviewed-by: Jiri Olsa --- include/linux/uprobes.h | 9 ++------- kernel/events/uprobes.c | 24 ++++++------------------ kernel/trace/bpf_trace.c | 8 ++++---- kernel/trace/trace_uprobe.c | 7 +------ 4 files changed, 13 insertions(+), 35 deletions(-) diff --git a/include/linux/uprobes.h b/include/linux/uprobes.h index b503fafb7fb3..440316fbf3c6 100644 --- a/include/linux/uprobes.h +++ b/include/linux/uprobes.h @@ -110,8 +110,7 @@ extern bool is_trap_insn(uprobe_opcode_t *insn); extern unsigned long uprobe_get_swbp_addr(struct pt_regs *regs); extern unsigned long uprobe_get_trap_addr(struct pt_regs *regs); extern int uprobe_write_opcode(struct arch_uprobe *auprobe, struct mm_stru= ct *mm, unsigned long vaddr, uprobe_opcode_t); -extern int uprobe_register(struct inode *inode, loff_t offset, struct upro= be_consumer *uc); -extern int uprobe_register_refctr(struct inode *inode, loff_t offset, loff= _t ref_ctr_offset, struct uprobe_consumer *uc); +extern int uprobe_register(struct inode *inode, loff_t offset, loff_t ref_= ctr_offset, struct uprobe_consumer *uc); extern int uprobe_apply(struct inode *inode, loff_t offset, struct uprobe_= consumer *uc, bool); extern void uprobe_unregister(struct inode *inode, loff_t offset, struct u= probe_consumer *uc); extern int uprobe_mmap(struct vm_area_struct *vma); @@ -152,11 +151,7 @@ static inline void uprobes_init(void) #define uprobe_get_trap_addr(regs) instruction_pointer(regs) =20 static inline int -uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer= *uc) -{ - return -ENOSYS; -} -static inline int uprobe_register_refctr(struct inode *inode, loff_t offse= t, loff_t ref_ctr_offset, struct uprobe_consumer *uc) +uprobe_register(struct inode *inode, loff_t offset, loff_t ref_ctr_offset,= struct uprobe_consumer *uc) { return -ENOSYS; } diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index dfe6306a63b1..b7f40bad8abc 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c @@ -1121,25 +1121,26 @@ void uprobe_unregister(struct inode *inode, loff_t = offset, struct uprobe_consume EXPORT_SYMBOL_GPL(uprobe_unregister); =20 /* - * __uprobe_register - register a probe + * uprobe_register - register a probe * @inode: the file in which the probe has to be placed. * @offset: offset from the start of the file. + * @ref_ctr_offset: offset of SDT marker / reference counter * @uc: information on howto handle the probe.. * - * Apart from the access refcount, __uprobe_register() takes a creation + * Apart from the access refcount, uprobe_register() takes a creation * refcount (thro alloc_uprobe) if and only if this @uprobe is getting * inserted into the rbtree (i.e first consumer for a @inode:@offset * tuple). Creation refcount stops uprobe_unregister from freeing the * @uprobe even before the register operation is complete. Creation * refcount is released when the last @uc for the @uprobe - * unregisters. Caller of __uprobe_register() is required to keep @inode + * unregisters. Caller of uprobe_register() is required to keep @inode * (and the containing mount) referenced. * * Return errno if it cannot successully install probes * else return 0 (success) */ -static int __uprobe_register(struct inode *inode, loff_t offset, - loff_t ref_ctr_offset, struct uprobe_consumer *uc) +int uprobe_register(struct inode *inode, loff_t offset, loff_t ref_ctr_off= set, + struct uprobe_consumer *uc) { struct uprobe *uprobe; int ret; @@ -1189,21 +1190,8 @@ static int __uprobe_register(struct inode *inode, lo= ff_t offset, goto retry; return ret; } - -int uprobe_register(struct inode *inode, loff_t offset, - struct uprobe_consumer *uc) -{ - return __uprobe_register(inode, offset, 0, uc); -} EXPORT_SYMBOL_GPL(uprobe_register); =20 -int uprobe_register_refctr(struct inode *inode, loff_t offset, - loff_t ref_ctr_offset, struct uprobe_consumer *uc) -{ - return __uprobe_register(inode, offset, ref_ctr_offset, uc); -} -EXPORT_SYMBOL_GPL(uprobe_register_refctr); - /* * uprobe_apply - unregister an already registered probe. * @inode: the file in which the probe has to be removed. diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index cd098846e251..afa909e17824 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -3480,10 +3480,10 @@ int bpf_uprobe_multi_link_attach(const union bpf_at= tr *attr, struct bpf_prog *pr &bpf_uprobe_multi_link_lops, prog); =20 for (i =3D 0; i < cnt; i++) { - err =3D uprobe_register_refctr(d_real_inode(link->path.dentry), - uprobes[i].offset, - uprobes[i].ref_ctr_offset, - &uprobes[i].consumer); + err =3D uprobe_register(d_real_inode(link->path.dentry), + uprobes[i].offset, + uprobes[i].ref_ctr_offset, + &uprobes[i].consumer); if (err) { bpf_uprobe_unregister(&path, uprobes, i); goto error_free; diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c index c98e3b3386ba..1f590f989c1e 100644 --- a/kernel/trace/trace_uprobe.c +++ b/kernel/trace/trace_uprobe.c @@ -1089,12 +1089,7 @@ static int trace_uprobe_enable(struct trace_uprobe *= tu, filter_func_t filter) tu->consumer.filter =3D filter; tu->inode =3D d_real_inode(tu->path.dentry); =20 - if (tu->ref_ctr_offset) - ret =3D uprobe_register_refctr(tu->inode, tu->offset, - tu->ref_ctr_offset, &tu->consumer); - else - ret =3D uprobe_register(tu->inode, tu->offset, &tu->consumer); - + ret =3D uprobe_register(tu->inode, tu->offset, tu->ref_ctr_offset, &tu->c= onsumer); if (ret) tu->inode =3D NULL; =20 --=20 2.25.1.362.g51ebf55 From nobody Sat Feb 7 08:43:29 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 075A3155336 for ; Mon, 29 Jul 2024 13:45:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722260746; cv=none; b=WBgkulu9UqsKtDT35NQJ9Db3I2xcqsqGoKP0F62XMd4RBEM+uwTjwBXngVOPnWmQQCH4oaxJSdqWb2iJA6EHo160I9qNp+d2MJcKuZUeJTGXhM4NROGUod8nsAe2ud0WelrKjHZkIWxq+17kU4RWW+h+BJbZY11UXP1swjGJW10= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722260746; c=relaxed/simple; bh=g+s5zWQ+1bjLhV5trF8N1eSvfylYTcdt0aXRUvyr3B0=; h=Date:From:To:Cc:Subject:Message-ID:MIME-Version:Content-Type: Content-Disposition:In-Reply-To; b=GM8gM6hzUyAZJb50oc9DziKytUviE30xgM327di5acfiNTX8rPRCdVaImj2hiKiMat6D7BaipAYk/VtSNpFd2+ap4qrm7/uRvz+yDpJYye8j/gv2JBcFMFqBc/Ne5yapLINH8sPnQMeACpduHmYgRcSbawTfss7c06zS1cqvUhY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=M1u88upd; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="M1u88upd" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1722260744; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to; bh=doSH2GJ4WKzw7yVJQbebYQerdG+8934K9oPj26npbuU=; b=M1u88updFriU2VK++qzNLCUwFpPdi851MmcJsPRK2i58wf45ISGzcfmyhKoMUAz+rG4+H0 goq36NFGBWvumeAEofgSBoueyDxkaIuNQLecGrPNjOujyVZqZM0PPFn3llzWudLIxI2Fqy qEMrZlrDtLaLOaGfw3TyPvtiZIBAnR4= Received: from mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-176-S4zvsVJjOqKQOqNNjQG5bA-1; Mon, 29 Jul 2024 09:45:40 -0400 X-MC-Unique: S4zvsVJjOqKQOqNNjQG5bA-1 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id A296B1955D4A; Mon, 29 Jul 2024 13:45:38 +0000 (UTC) Received: from dhcp-27-174.brq.redhat.com (unknown [10.45.225.232]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with SMTP id E5D3019560AE; Mon, 29 Jul 2024 13:45:35 +0000 (UTC) Received: by dhcp-27-174.brq.redhat.com (nbSMTP-1.00) for uid 1000 oleg@redhat.com; Mon, 29 Jul 2024 15:45:39 +0200 (CEST) Date: Mon, 29 Jul 2024 15:45:35 +0200 From: Oleg Nesterov To: andrii@kernel.org, mhiramat@kernel.org, peterz@infradead.org Cc: jolsa@kernel.org, rostedt@goodmis.org, linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Subject: [PATCH v2 5/5] uprobes: make uprobe_register() return struct uprobe * Message-ID: <20240729134535.GA12332@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20240729134444.GA12293@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This way uprobe_unregister() and uprobe_apply() can use "struct uprobe *" rather than inode + offset. This simplifies the code and allows to avoid the unnecessary find_uprobe() + put_uprobe() in these functions. TODO: uprobe_unregister() still needs get_uprobe/put_uprobe to ensure that this uprobe can't be freed before up_write(&uprobe->register_rwsem). Signed-off-by: Oleg Nesterov Acked-by: Andrii Nakryiko Reviewed-by: Jiri Olsa --- include/linux/uprobes.h | 15 +++++----- kernel/events/uprobes.c | 56 +++++++++++++++---------------------- kernel/trace/bpf_trace.c | 25 ++++++++--------- kernel/trace/trace_uprobe.c | 26 ++++++++--------- 4 files changed, 55 insertions(+), 67 deletions(-) diff --git a/include/linux/uprobes.h b/include/linux/uprobes.h index 440316fbf3c6..137ddfc0b2f8 100644 --- a/include/linux/uprobes.h +++ b/include/linux/uprobes.h @@ -16,6 +16,7 @@ #include #include =20 +struct uprobe; struct vm_area_struct; struct mm_struct; struct inode; @@ -110,9 +111,9 @@ extern bool is_trap_insn(uprobe_opcode_t *insn); extern unsigned long uprobe_get_swbp_addr(struct pt_regs *regs); extern unsigned long uprobe_get_trap_addr(struct pt_regs *regs); extern int uprobe_write_opcode(struct arch_uprobe *auprobe, struct mm_stru= ct *mm, unsigned long vaddr, uprobe_opcode_t); -extern int uprobe_register(struct inode *inode, loff_t offset, loff_t ref_= ctr_offset, struct uprobe_consumer *uc); -extern int uprobe_apply(struct inode *inode, loff_t offset, struct uprobe_= consumer *uc, bool); -extern void uprobe_unregister(struct inode *inode, loff_t offset, struct u= probe_consumer *uc); +extern struct uprobe *uprobe_register(struct inode *inode, loff_t offset, = loff_t ref_ctr_offset, struct uprobe_consumer *uc); +extern int uprobe_apply(struct uprobe *uprobe, struct uprobe_consumer *uc,= bool); +extern void uprobe_unregister(struct uprobe *uprobe, struct uprobe_consume= r *uc); extern int uprobe_mmap(struct vm_area_struct *vma); extern void uprobe_munmap(struct vm_area_struct *vma, unsigned long start,= unsigned long end); extern void uprobe_start_dup_mmap(void); @@ -150,18 +151,18 @@ static inline void uprobes_init(void) =20 #define uprobe_get_trap_addr(regs) instruction_pointer(regs) =20 -static inline int +static inline struct uprobe * uprobe_register(struct inode *inode, loff_t offset, loff_t ref_ctr_offset,= struct uprobe_consumer *uc) { - return -ENOSYS; + return ERR_PTR(-ENOSYS); } static inline int -uprobe_apply(struct inode *inode, loff_t offset, struct uprobe_consumer *u= c, bool add) +uprobe_apply(struct uprobe* uprobe, struct uprobe_consumer *uc, bool add) { return -ENOSYS; } static inline void -uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consum= er *uc) +uprobe_unregister(struct uprobe *uprobe, struct uprobe_consumer *uc) { } static inline int uprobe_mmap(struct vm_area_struct *vma) diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index b7f40bad8abc..974474680820 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c @@ -1099,20 +1099,14 @@ __uprobe_unregister(struct uprobe *uprobe, struct u= probe_consumer *uc) delete_uprobe(uprobe); } =20 -/* +/** * uprobe_unregister - unregister an already registered probe. - * @inode: the file in which the probe has to be removed. - * @offset: offset from the start of the file. + * @uprobe: uprobe to remove * @uc: identify which probe if multiple probes are colocated. */ -void uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_c= onsumer *uc) +void uprobe_unregister(struct uprobe *uprobe, struct uprobe_consumer *uc) { - struct uprobe *uprobe; - - uprobe =3D find_uprobe(inode, offset); - if (WARN_ON(!uprobe)) - return; - + get_uprobe(uprobe); down_write(&uprobe->register_rwsem); __uprobe_unregister(uprobe, uc); up_write(&uprobe->register_rwsem); @@ -1120,7 +1114,7 @@ void uprobe_unregister(struct inode *inode, loff_t of= fset, struct uprobe_consume } EXPORT_SYMBOL_GPL(uprobe_unregister); =20 -/* +/** * uprobe_register - register a probe * @inode: the file in which the probe has to be placed. * @offset: offset from the start of the file. @@ -1136,40 +1130,40 @@ EXPORT_SYMBOL_GPL(uprobe_unregister); * unregisters. Caller of uprobe_register() is required to keep @inode * (and the containing mount) referenced. * - * Return errno if it cannot successully install probes - * else return 0 (success) + * Return: pointer to the new uprobe on success or an ERR_PTR on failure. */ -int uprobe_register(struct inode *inode, loff_t offset, loff_t ref_ctr_off= set, - struct uprobe_consumer *uc) +struct uprobe *uprobe_register(struct inode *inode, + loff_t offset, loff_t ref_ctr_offset, + struct uprobe_consumer *uc) { struct uprobe *uprobe; int ret; =20 /* Uprobe must have at least one set consumer */ if (!uc->handler && !uc->ret_handler) - return -EINVAL; + return ERR_PTR(-EINVAL); =20 /* copy_insn() uses read_mapping_page() or shmem_read_mapping_page() */ if (!inode->i_mapping->a_ops->read_folio && !shmem_mapping(inode->i_mapping)) - return -EIO; + return ERR_PTR(-EIO); /* Racy, just to catch the obvious mistakes */ if (offset > i_size_read(inode)) - return -EINVAL; + return ERR_PTR(-EINVAL); =20 /* * This ensures that copy_from_page(), copy_to_page() and * __update_ref_ctr() can't cross page boundary. */ if (!IS_ALIGNED(offset, UPROBE_SWBP_INSN_SIZE)) - return -EINVAL; + return ERR_PTR(-EINVAL); if (!IS_ALIGNED(ref_ctr_offset, sizeof(short))) - return -EINVAL; + return ERR_PTR(-EINVAL); =20 retry: uprobe =3D alloc_uprobe(inode, offset, ref_ctr_offset); if (IS_ERR(uprobe)) - return PTR_ERR(uprobe); + return uprobe; =20 /* * We can race with uprobe_unregister()->delete_uprobe(). @@ -1188,35 +1182,29 @@ int uprobe_register(struct inode *inode, loff_t off= set, loff_t ref_ctr_offset, =20 if (unlikely(ret =3D=3D -EAGAIN)) goto retry; - return ret; + + return ret ? ERR_PTR(ret) : uprobe; } EXPORT_SYMBOL_GPL(uprobe_register); =20 -/* - * uprobe_apply - unregister an already registered probe. - * @inode: the file in which the probe has to be removed. - * @offset: offset from the start of the file. +/** + * uprobe_apply - add or remove the breakpoints according to @uc->filter + * @uprobe: uprobe which "owns" the breakpoint * @uc: consumer which wants to add more or remove some breakpoints * @add: add or remove the breakpoints + * Return: 0 on success or negative error code. */ -int uprobe_apply(struct inode *inode, loff_t offset, - struct uprobe_consumer *uc, bool add) +int uprobe_apply(struct uprobe *uprobe, struct uprobe_consumer *uc, bool a= dd) { - struct uprobe *uprobe; struct uprobe_consumer *con; int ret =3D -ENOENT; =20 - uprobe =3D find_uprobe(inode, offset); - if (WARN_ON(!uprobe)) - return ret; - down_write(&uprobe->register_rwsem); for (con =3D uprobe->consumers; con && con !=3D uc ; con =3D con->next) ; if (con) ret =3D register_for_each_vma(uprobe, add ? uc : NULL); up_write(&uprobe->register_rwsem); - put_uprobe(uprobe); =20 return ret; } diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index afa909e17824..4e391daafa64 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c @@ -3160,6 +3160,7 @@ struct bpf_uprobe { loff_t offset; unsigned long ref_ctr_offset; u64 cookie; + struct uprobe *uprobe; struct uprobe_consumer consumer; }; =20 @@ -3178,15 +3179,12 @@ struct bpf_uprobe_multi_run_ctx { struct bpf_uprobe *uprobe; }; =20 -static void bpf_uprobe_unregister(struct path *path, struct bpf_uprobe *up= robes, - u32 cnt) +static void bpf_uprobe_unregister(struct bpf_uprobe *uprobes, u32 cnt) { u32 i; =20 - for (i =3D 0; i < cnt; i++) { - uprobe_unregister(d_real_inode(path->dentry), uprobes[i].offset, - &uprobes[i].consumer); - } + for (i =3D 0; i < cnt; i++) + uprobe_unregister(uprobes[i].uprobe, &uprobes[i].consumer); } =20 static void bpf_uprobe_multi_link_release(struct bpf_link *link) @@ -3194,7 +3192,7 @@ static void bpf_uprobe_multi_link_release(struct bpf_= link *link) struct bpf_uprobe_multi_link *umulti_link; =20 umulti_link =3D container_of(link, struct bpf_uprobe_multi_link, link); - bpf_uprobe_unregister(&umulti_link->path, umulti_link->uprobes, umulti_li= nk->cnt); + bpf_uprobe_unregister(umulti_link->uprobes, umulti_link->cnt); if (umulti_link->task) put_task_struct(umulti_link->task); path_put(&umulti_link->path); @@ -3480,12 +3478,13 @@ int bpf_uprobe_multi_link_attach(const union bpf_at= tr *attr, struct bpf_prog *pr &bpf_uprobe_multi_link_lops, prog); =20 for (i =3D 0; i < cnt; i++) { - err =3D uprobe_register(d_real_inode(link->path.dentry), - uprobes[i].offset, - uprobes[i].ref_ctr_offset, - &uprobes[i].consumer); - if (err) { - bpf_uprobe_unregister(&path, uprobes, i); + uprobes[i].uprobe =3D uprobe_register(d_real_inode(link->path.dentry), + uprobes[i].offset, + uprobes[i].ref_ctr_offset, + &uprobes[i].consumer); + if (IS_ERR(uprobes[i].uprobe)) { + err =3D PTR_ERR(uprobes[i].uprobe); + bpf_uprobe_unregister(uprobes, i); goto error_free; } } diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c index 1f590f989c1e..52e76a73fa7c 100644 --- a/kernel/trace/trace_uprobe.c +++ b/kernel/trace/trace_uprobe.c @@ -58,8 +58,8 @@ struct trace_uprobe { struct dyn_event devent; struct uprobe_consumer consumer; struct path path; - struct inode *inode; char *filename; + struct uprobe *uprobe; unsigned long offset; unsigned long ref_ctr_offset; unsigned long nhit; @@ -1084,16 +1084,16 @@ typedef bool (*filter_func_t)(struct uprobe_consume= r *self, =20 static int trace_uprobe_enable(struct trace_uprobe *tu, filter_func_t filt= er) { - int ret; + struct inode *inode =3D d_real_inode(tu->path.dentry); + struct uprobe *uprobe; =20 tu->consumer.filter =3D filter; - tu->inode =3D d_real_inode(tu->path.dentry); - - ret =3D uprobe_register(tu->inode, tu->offset, tu->ref_ctr_offset, &tu->c= onsumer); - if (ret) - tu->inode =3D NULL; + uprobe =3D uprobe_register(inode, tu->offset, tu->ref_ctr_offset, &tu->co= nsumer); + if (IS_ERR(uprobe)) + return PTR_ERR(uprobe); =20 - return ret; + tu->uprobe =3D uprobe; + return 0; } =20 static void __probe_event_disable(struct trace_probe *tp) @@ -1104,11 +1104,11 @@ static void __probe_event_disable(struct trace_prob= e *tp) WARN_ON(!uprobe_filter_is_empty(tu->tp.event->filter)); =20 list_for_each_entry(tu, trace_probe_probe_list(tp), tp.list) { - if (!tu->inode) + if (!tu->uprobe) continue; =20 - uprobe_unregister(tu->inode, tu->offset, &tu->consumer); - tu->inode =3D NULL; + uprobe_unregister(tu->uprobe, &tu->consumer); + tu->uprobe =3D NULL; } } =20 @@ -1305,7 +1305,7 @@ static int uprobe_perf_close(struct trace_event_call = *call, return 0; =20 list_for_each_entry(tu, trace_probe_probe_list(tp), tp.list) { - ret =3D uprobe_apply(tu->inode, tu->offset, &tu->consumer, false); + ret =3D uprobe_apply(tu->uprobe, &tu->consumer, false); if (ret) break; } @@ -1329,7 +1329,7 @@ static int uprobe_perf_open(struct trace_event_call *= call, return 0; =20 list_for_each_entry(tu, trace_probe_probe_list(tp), tp.list) { - err =3D uprobe_apply(tu->inode, tu->offset, &tu->consumer, true); + err =3D uprobe_apply(tu->uprobe, &tu->consumer, true); if (err) { uprobe_perf_close(call, event); break; --=20 2.25.1.362.g51ebf55