Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp5154475pxj; Tue, 22 Jun 2021 16:42:54 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx3f0niViFZAADuGcBRezuDFLKPSG4wAdR2V9SoU2+SxNXny3RapnKuvPxdhkFOPBP3RMh/ X-Received: by 2002:a02:cebc:: with SMTP id z28mr6248451jaq.127.1624405373881; Tue, 22 Jun 2021 16:42:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1624405373; cv=none; d=google.com; s=arc-20160816; b=GQd2rVtgOVtZOyPoiUsGZ8ytU+TQOj7Ti3ZLfRp8b+USAaM9iwujQIi1GDL13+9B+q xf0HtEd50FEgUlNlQliGLEkjeixxXXXXVRSImWubf8ZPnca8yuDEBVb/9Hx1axCzszgy MEneWJrPnMubS3l89uBlrydyDuYH6XLnVEBz6fCwe6nRiYRWLgmdSOFFDdKXiqlPDVPf Qfg7eBTD/4rKGPmjSVv2ytR5inmyhUWY42Oh2rcsskezHoKLjLsbcvtmNmCawUMEtM4n s+qaFegxpZ2bzUkgDnIk2sc6SAzjvwpfcG39ZzdBbgXd1SacKvkDfmi/UQm2q1OxjPCL LnjQ== 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:date:subject:cc:to:from :dkim-signature; bh=6o2BeR5L8W1gJDQPWz+i6r73RLfIDGX+Xn0CDqEvfcI=; b=pqxGVK+PG878o350m26MAssPVT/2CnQcMRgj3+EiB5b8c+w2n0V3KvRHyVXVk/611L i5B7+aGSYyEvrgKyYrJBX+sRkEAuKJ2pzESUm51Dts/P+wigq1yu7Qh6Ayg9fBpdZhrf +88fStchCVGJhN6nm/Uglt9B+LYA6RbY4yi5PY4Epwh8OvlUWGPy5SuHm3OIobx38wrG lU7sZWbuJi0YrWUizAxytkbtXG6H1sy6oydyIxqBtZ7DlfeYIrdnEEOTbgflsOhlJDsR KMn78Qq5EUqwE25rcZzlS/XCGIyG3x+DDszIcfj1GPNS6nzljsoEWRxTWTvuPNIfpc7n x0+Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=lHFVx5Us; 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 c4si11689742ilk.14.2021.06.22.16.42.42; Tue, 22 Jun 2021 16:42: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=k20201202 header.b=lHFVx5Us; 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 S229955AbhFVXoZ (ORCPT + 99 others); Tue, 22 Jun 2021 19:44:25 -0400 Received: from mail.kernel.org ([198.145.29.99]:52604 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229833AbhFVXoX (ORCPT ); Tue, 22 Jun 2021 19:44:23 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 7644460FF2; Tue, 22 Jun 2021 23:42:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1624405326; bh=WakAHe+yP6lJG1nkLPwskdF6fN4xC3X4ng9N7y0HxIg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lHFVx5UscQihTFqU1WbwKoQINv2Mhm3/kDcechmE5SLS9w8cZd/hFEWCXLsdpm1sU Uh8F0w6itkCb10NI1KZUEdfPKRmeZykTbwm3lSk2lJKO0YdLU6+GY4iG06wurKoLVc FAVzYRq8WWJD5Ho0csDmFfvXPDPJBQHQHu/dL/LXynpqO6GJUmKCgAQGuzJZKgkAeD J8aUircASt3+TDrmhIrtr/lT8Rz7R0CuCbskCIQz7Cvtq9XtSWQRN8SAsmkTiCySw1 iqvwl9EcSBWwhEapSbRnQEsaSZnWa4Dj9mmZUrAXB0gnYB7yOZT3Scw0PazWl0QBjT zalGcIbTtM68A== From: Frederic Weisbecker To: Thomas Gleixner , Peter Zijlstra Cc: LKML , Frederic Weisbecker , "Eric W . Biederman" , Oleg Nesterov , Ingo Molnar Subject: [PATCH 2/7] posix-cpu-timers: Assert task sighand is locked while starting cputime counter Date: Wed, 23 Jun 2021 01:41:50 +0200 Message-Id: <20210622234155.119685-3-frederic@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210622234155.119685-1-frederic@kernel.org> References: <20210622234155.119685-1-frederic@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Starting the process wide cputime counter needs to be done in the same sighand locking sequence than actually arming the related timer otherwise we risk races against concurrent timers setting/expiring in the same threadgroup. Detecting that we start the cputime counter without holding the sighand lock is a first step toward debugging such situations. Suggested-by: Peter Zijlstra (Intel) Signed-off-by: Frederic Weisbecker Cc: Oleg Nesterov Cc: Thomas Gleixner Cc: Ingo Molnar Cc: Eric W. Biederman --- include/linux/sched/signal.h | 6 ++++++ kernel/signal.c | 13 +++++++++++++ kernel/time/posix-cpu-timers.c | 2 ++ 3 files changed, 21 insertions(+) diff --git a/include/linux/sched/signal.h b/include/linux/sched/signal.h index 7f4278fa21fe..65914e9be683 100644 --- a/include/linux/sched/signal.h +++ b/include/linux/sched/signal.h @@ -709,6 +709,12 @@ static inline void unlock_task_sighand(struct task_struct *task, spin_unlock_irqrestore(&task->sighand->siglock, *flags); } +#ifdef CONFIG_LOCKDEP +extern void lockdep_assert_task_sighand_held(struct task_struct *task); +#else +static inline void lockdep_assert_task_sighand_held(struct task_struct *task) { } +#endif + static inline unsigned long task_rlimit(const struct task_struct *task, unsigned int limit) { diff --git a/kernel/signal.c b/kernel/signal.c index f7c6ffcbd044..82cbb8ecff5a 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -1440,6 +1440,19 @@ struct sighand_struct *__lock_task_sighand(struct task_struct *tsk, return sighand; } +void lockdep_assert_task_sighand_held(struct task_struct *task) +{ + struct sighand_struct *sighand; + + rcu_read_lock(); + sighand = rcu_dereference(task->sighand); + if (sighand) + lockdep_assert_held(&sighand->siglock); + else + WARN_ON_ONCE(1); + rcu_read_unlock(); +} + /* * send signal info to all the members of a group */ diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c index aa52fc85dbcb..f78ccab58aa4 100644 --- a/kernel/time/posix-cpu-timers.c +++ b/kernel/time/posix-cpu-timers.c @@ -291,6 +291,8 @@ static void thread_group_start_cputime(struct task_struct *tsk, u64 *samples) struct thread_group_cputimer *cputimer = &tsk->signal->cputimer; struct posix_cputimers *pct = &tsk->signal->posix_cputimers; + lockdep_assert_task_sighand_held(tsk); + /* Check if cputimer isn't running. This is accessed without locking. */ if (!READ_ONCE(pct->timers_active)) { struct task_cputime sum; -- 2.25.1