Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp2679674rwd; Wed, 17 May 2023 12:55:00 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6wpzXc0fOF9AgCwFcMhRn9cp/kDk5Ad3t+/4A8VdEHISocxVeLP8xfUF4cMlRg0wti4LU4 X-Received: by 2002:a05:6a20:9144:b0:104:41a0:c51a with SMTP id x4-20020a056a20914400b0010441a0c51amr25632695pzc.38.1684353300419; Wed, 17 May 2023 12:55:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1684353300; cv=none; d=google.com; s=arc-20160816; b=aUyLwiQ0/LgOSDENdlGSpKFjjaQ2qol+88CPLEHLDlW6MwNjDj6oDSm9R4nkq58GEU vtCoRWEkeExDkZqcI3R68troQbgvpZQVfmYkapVoJbVv2wvMJbaOsW7VCMlJVDBqQPt7 1OHkyZ6WiYrlmleLgLMH+fc2+qtSDKri3dMrA25mUEuOVUdHzXwhjtAp8dAb6ZMPAOax twHcHGmmJbgEzyzxlHJIjy31U/yphT9upcj9/Xv1Xr8PMiH9tTwvLy+6Qz7H+9f9gVHU pzv0lGKFKSBQtTFaN4k+Ur1wODuxUdureG3XzN02QJgq30wERu/h9walQyjl2A4f6jaj Mlkw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-transfer-encoding :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature:dkim-filter; bh=kOczaw1TlAZYv+vsEch6YqBha9eh9KoqTxDoaMXzpow=; b=PHSFp+J0J0xn2S1BRCelY3/TGtu9IvubcqcMG32TK7G8xE/r9FGbqT0H2TEK2eoSO4 6LXyDftGXMU7SF/HPC1Bct+UevU8VbdgrwZDzVWY/USt3yWQluH4y3u86fj0j07Htz0G BlyjjVWmlJ4OwyLIqpEHxSXZ3/+eaFIHT6q/TCNqRwmncvuYL0+nTjaa6RdR8JKztAF5 MoWmv0NDY/EnIf8r1SQ6syGonP77A9DLaJ6WPZtqrJa8ZYfHacjMIqBuH0h/2/TZilmw +epbr1MCA0ORp39btxQcf+TSheUjpHCBcyhGJOIhWGJRKwuga5OmhOkTtrj+AKjqdgcq C3Rg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linux.microsoft.com header.s=default header.b=D8WrzbOo; 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=linux.microsoft.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id v71-20020a63894a000000b0051b718151a4si21133267pgd.201.2023.05.17.12.54.46; Wed, 17 May 2023 12:55:00 -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=@linux.microsoft.com header.s=default header.b=D8WrzbOo; 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=linux.microsoft.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229707AbjEQTgT (ORCPT + 99 others); Wed, 17 May 2023 15:36:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54430 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229437AbjEQTgO (ORCPT ); Wed, 17 May 2023 15:36:14 -0400 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id ABC99109; Wed, 17 May 2023 12:36:13 -0700 (PDT) Received: from W11-BEAU-MD.localdomain (unknown [76.135.27.212]) by linux.microsoft.com (Postfix) with ESMTPSA id EA0EE20F26AB; Wed, 17 May 2023 12:36:12 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com EA0EE20F26AB DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1684352173; bh=kOczaw1TlAZYv+vsEch6YqBha9eh9KoqTxDoaMXzpow=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=D8WrzbOo/RSmXAZ7HQMSpMgjIuPWUIYbH1jZWa4bcrvm7nP6GxHL5qyXaW1CidIUH 7jr6Nv19tpmoP6j3q/D6ZsDUCoM9CyI+fTIIMeKKz1BgMNdMT4Wd78WBrxTwr3DWID k1HRFJ9da2FNue7CRgxI/EJ+8isbaJ1/y6XPeWRU= Date: Wed, 17 May 2023 12:36:02 -0700 From: Beau Belgrave To: Linus Torvalds Cc: Steven Rostedt , Alexei Starovoitov , Masami Hiramatsu , LKML , linux-trace-kernel@vger.kernel.org, Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , bpf , David Vernet , dthaler@microsoft.com, brauner@kernel.org, hch@infradead.org Subject: Re: [PATCH] tracing/user_events: Run BPF program if attached Message-ID: <20230517193549.GA401@W11-BEAU-MD.localdomain> References: <20230515192407.GA85@W11-BEAU-MD.localdomain> <20230517003628.aqqlvmzffj7fzzoj@MacBook-Pro-8.local> <20230516222919.79bba667@rorschach.local.home> <20230517172243.GA152@W11-BEAU-MD.localdomain> <20230517190750.GA366@W11-BEAU-MD.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: X-Spam-Status: No, score=-19.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,ENV_AND_HDR_SPF_MATCH,RCVD_IN_DNSWL_MED, SPF_HELO_PASS,SPF_PASS,T_SCC_BODY_TEXT_LINE,USER_IN_DEF_DKIM_WL, USER_IN_DEF_SPF_WL 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 Wed, May 17, 2023 at 12:26:44PM -0700, Linus Torvalds wrote: > On Wed, May 17, 2023 at 12:08 PM Beau Belgrave > wrote: > > > > user_event_mm_dup() puts a new mm into the global list before the > > enablers list is fully populated. > > Then that simply needs to be fixed. > Agreed. > user_event_mm_dup() should not madd the mm into the global list until > it is *done*. > > Because if it makes that list visible to others in a half-way state, > then it needs to use the proper locking and use event_mutex. > > You can't say "this is so critical that we can't take a lock" and then > use that as an excuse to simply do buggy code. > Didn't mean that, I just have more work to do then just the RCU walks. I will fix these up. > Either take the lock in user_event_mm_dup(), or make sure that the > data structures are all completely local so that no lock is necessary. > > Here's a COMPLETELY UNTESTED patch that just separates out the notion > of "allocate" and "attach". > > NOTE NOTE NOTE! I am *not* claiming this patch works. It builds for > me. It looks right. It seems like it's the right thing to do. But it > might have some issues. > > With this, the newly dup'ed list is attached to the process once after > it is done, so nobody can see the list being built up. > > Also note that this does NOT fix the incorrect RCU walks. > > Linus Thanks for the patch and feedback! -Beau > kernel/trace/trace_events_user.c | 29 ++++++++++++++++++----------- > 1 file changed, 18 insertions(+), 11 deletions(-) > > diff --git a/kernel/trace/trace_events_user.c b/kernel/trace/trace_events_user.c > index b1ecd7677642..b2aecbfbbd24 100644 > --- a/kernel/trace/trace_events_user.c > +++ b/kernel/trace/trace_events_user.c > @@ -538,10 +538,9 @@ static struct user_event_mm *user_event_mm_get_all(struct user_event *user) > return found; > } > > -static struct user_event_mm *user_event_mm_create(struct task_struct *t) > +static struct user_event_mm *user_event_mm_alloc(struct task_struct *t) > { > struct user_event_mm *user_mm; > - unsigned long flags; > > user_mm = kzalloc(sizeof(*user_mm), GFP_KERNEL_ACCOUNT); > > @@ -553,12 +552,6 @@ static struct user_event_mm *user_event_mm_create(struct task_struct *t) > refcount_set(&user_mm->refcnt, 1); > refcount_set(&user_mm->tasks, 1); > > - spin_lock_irqsave(&user_event_mms_lock, flags); > - list_add_rcu(&user_mm->link, &user_event_mms); > - spin_unlock_irqrestore(&user_event_mms_lock, flags); > - > - t->user_event_mm = user_mm; > - > /* > * The lifetime of the memory descriptor can slightly outlast > * the task lifetime if a ref to the user_event_mm is taken > @@ -572,6 +565,17 @@ static struct user_event_mm *user_event_mm_create(struct task_struct *t) > return user_mm; > } > > +static void user_event_mm_attach(struct user_event_mm *user_mm, struct task_struct *t) > +{ > + unsigned long flags; > + > + spin_lock_irqsave(&user_event_mms_lock, flags); > + list_add_rcu(&user_mm->link, &user_event_mms); > + spin_unlock_irqrestore(&user_event_mms_lock, flags); > + > + t->user_event_mm = user_mm; > +} > + > static struct user_event_mm *current_user_event_mm(void) > { > struct user_event_mm *user_mm = current->user_event_mm; > @@ -579,10 +583,12 @@ static struct user_event_mm *current_user_event_mm(void) > if (user_mm) > goto inc; > > - user_mm = user_event_mm_create(current); > + user_mm = user_event_mm_alloc(current); > > if (!user_mm) > goto error; > + > + user_event_mm_attach(user_mm, current); > inc: > refcount_inc(&user_mm->refcnt); > error: > @@ -670,7 +676,7 @@ void user_event_mm_remove(struct task_struct *t) > > void user_event_mm_dup(struct task_struct *t, struct user_event_mm *old_mm) > { > - struct user_event_mm *mm = user_event_mm_create(t); > + struct user_event_mm *mm = user_event_mm_alloc(t); > struct user_event_enabler *enabler; > > if (!mm) > @@ -684,10 +690,11 @@ void user_event_mm_dup(struct task_struct *t, struct user_event_mm *old_mm) > > rcu_read_unlock(); > > + user_event_mm_attach(mm, t); > return; > error: > rcu_read_unlock(); > - user_event_mm_remove(t); > + user_event_mm_destroy(mm); > } > > static bool current_user_event_enabler_exists(unsigned long uaddr,