From patchwork Wed Aug 7 16:02:17 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Frederic Weisbecker X-Patchwork-Id: 13756468 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 E8AFD14375A; Wed, 7 Aug 2024 16:03:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723046587; cv=none; b=Vuko3T7EBZk+rLiLYJRKRd2RcZzM09gZt8RnEsYeHZVmdHWs731DZNspsJ7dx/qMvJfaKIVoBFz766Ot9XjNNyVLRwhwDIM1JqjkSTTnd0L5sj1o8pcPLSNxlVvuJTuDRirzq0KGRQUUxcp/sCdgXIjNfBrocL1ThfiXOK9Yyoo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723046587; c=relaxed/simple; bh=ZmzCkFGiO4uVOjClN5Ffq3kFJzGfD03UONhdrDRJsTk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pEwoqNdiSMww/phz3cyPpVrOagYl8uuEPOi50gRwPqva0YnqpY2DuhGdR9FXvAvrA7fM9xhdUi+XDRuWWjkG00x8vinZkXJ30J32OSLNPaq5EGZMO0GDnjK5XA2yHoYwBMbB4CdW9yzK9ZFV0V2qa7K3DQIMLgMJODOeI5ed1+4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=u9esigVt; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="u9esigVt" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7B64BC4AF0E; Wed, 7 Aug 2024 16:03:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1723046586; bh=ZmzCkFGiO4uVOjClN5Ffq3kFJzGfD03UONhdrDRJsTk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=u9esigVtaNkWaPmmPvQ6OxFME/PuYU8prUzvVEQ/DiH4Ak6Pojoi+lLOfQtPX3vPM t3/arDejOOyBdaKNAxEJ0Z0hjwhMCDGLKdUbPQGNRyAH8nQRnXCSE9MbhRo3Lm5PXX w9v0xh44sRaqnxgqyTf3WU5wFaTfBbLIUgLIg7hB6wDRbBQGZEJjOzyQs3RGEbV2xv 5gTZM9Iu7uXB/xQrTrQXhUmLN2bvwensqNmNXFEoQmOy84l0NOC9GS7gvu9mbMg4zn hphW3nif5vh4tAu4LUPva9fU/XGSfy6f8Oe2BKcudPpxCRWO6wvhlD2JfCoT75Yi9T heeFkQmGbt8hw== From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , Andrew Morton , Kees Cook , Peter Zijlstra , Thomas Gleixner , Michal Hocko , Vlastimil Babka , linux-mm@kvack.org, "Paul E. McKenney" , Neeraj Upadhyay , Joel Fernandes , Boqun Feng , Zqiang , rcu@vger.kernel.org Subject: [PATCH 11/19] kthread: Make sure kthread hasn't started while binding it Date: Wed, 7 Aug 2024 18:02:17 +0200 Message-ID: <20240807160228.26206-12-frederic@kernel.org> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240807160228.26206-1-frederic@kernel.org> References: <20240807160228.26206-1-frederic@kernel.org> Precedence: bulk X-Mailing-List: rcu@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Make sure the kthread is sleeping in the schedule_preempt_disabled() call before calling its handler when kthread_bind[_mask]() is called on it. This provides a sanity check verifying that the task is not randomly blocked later at some point within its function handler, in which case it could be just concurrently awaken, leaving the call to do_set_cpus_allowed() without any effect until the next voluntary sleep. Rely on the wake-up ordering to ensure that the newly introduced "started" field returns the expected value: TASK A TASK B ------ ------ READ kthread->started wake_up_process(B) rq_lock() ... rq_unlock() // RELEASE schedule() rq_lock() // ACQUIRE // schedule task B rq_unlock() WRITE kthread->started Similarly, writing kthread->started before subsequent voluntary sleeps will be visible after calling wait_task_inactive() in __kthread_bind_mask(), reporting potential misuse of the API. Upcoming patches will make further use of this facility. Acked-by: Vlastimil Babka Signed-off-by: Frederic Weisbecker --- kernel/kthread.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/kernel/kthread.c b/kernel/kthread.c index f7be976ff88a..ecb719f54f7a 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -53,6 +53,7 @@ struct kthread_create_info struct kthread { unsigned long flags; unsigned int cpu; + int started; int result; int (*threadfn)(void *); void *data; @@ -382,6 +383,8 @@ static int kthread(void *_create) schedule_preempt_disabled(); preempt_enable(); + self->started = 1; + ret = -EINTR; if (!test_bit(KTHREAD_SHOULD_STOP, &self->flags)) { cgroup_kthread_ready(); @@ -540,7 +543,9 @@ static void __kthread_bind(struct task_struct *p, unsigned int cpu, unsigned int void kthread_bind_mask(struct task_struct *p, const struct cpumask *mask) { + struct kthread *kthread = to_kthread(p); __kthread_bind_mask(p, mask, TASK_UNINTERRUPTIBLE); + WARN_ON_ONCE(kthread->started); } /** @@ -554,7 +559,9 @@ void kthread_bind_mask(struct task_struct *p, const struct cpumask *mask) */ void kthread_bind(struct task_struct *p, unsigned int cpu) { + struct kthread *kthread = to_kthread(p); __kthread_bind(p, cpu, TASK_UNINTERRUPTIBLE); + WARN_ON_ONCE(kthread->started); } EXPORT_SYMBOL(kthread_bind);