From nobody Sat Oct 11 00:30:48 2025 Received: from mail-pf1-f171.google.com (mail-pf1-f171.google.com [209.85.210.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A109B1A0BC9 for ; Thu, 12 Jun 2025 04:20:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749702046; cv=none; b=rLIixZPws7GwwOTKmrroZcZGxANeEhXUJ+5IlNsX4tFzXPja0XJJCaDYEP722VONJws4m+sCSKmsacUEta3xro7yDDh8W6/rUd9eTR5Tj+vwbdLTQxsvFL/IorV3Di8kkyLhPe3SGfGKAnQull0jUxcS91y2I8i+ljPq7WVPjwM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749702046; c=relaxed/simple; bh=2GkpFMkXFfl3T18Cz96lOl8ixQGqT3V/0aUv6tknrZQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=D87pqkfOrxiGLc+qhyuF5/kQ1d+ok3NPbnuLmmy7vI6++HMxGOLzr48tavo3tuQwbwD839ig5TdPCkz3Np3ZYZ5HweRHQ0JWb93oFCWI+ToBPvZ8OT+kWmEHHbgTrxiO6eHmYKF2AF9Jz7WYe/M4Ohci7J/fZnUQD/s5y/XvDDw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=gDCGjLza; arc=none smtp.client-ip=209.85.210.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="gDCGjLza" Received: by mail-pf1-f171.google.com with SMTP id d2e1a72fcca58-747fc7506d4so567162b3a.0 for ; Wed, 11 Jun 2025 21:20:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749702044; x=1750306844; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=78vj2uCodgRO2NQvf2s188xHcuRs6eU7DQ0fjLo6Ke0=; b=gDCGjLzaNuKFxAR4PSVGFbWP7GYT1ukOKnc10mINRxBJ7EOxvy160vz8Uheec+pDWV Lw66Vp2U5oA7uEWJpCl3NqQbrCBctGBSFSNLG6ih+TfuyprrSNo5F26dUqHd/h44DxeR i4HOVnbFo57eXsJnO13VyHcZOW8NbNvbahFKXoZtFYWfY6J0vrpB4a1PqMo1P2+bNY9D 4jiewNWPEJb5mJDts8q/Q2DUQboqv2s9UKBFso6i7IuI/BaKINCpoerilJdEP1+vbue5 QoOIEghZammJcs/e7dojJUgVs77owdhGu6T2WXVIIdx/U17BIW/sZaRwqxLZwlDAmIoo 7d3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749702044; x=1750306844; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=78vj2uCodgRO2NQvf2s188xHcuRs6eU7DQ0fjLo6Ke0=; b=HlsXX3JrhzmC81STsk9olGBR4D08ZrMvPB0SpPCBqEE61nk/vm5ZScX9+2V/2U7x8P UQC4sJd4Hsi65uhBrQ5NHcCvgtU8LthaEfT5yuSCs9FSeIqlb+nvrlsTBUoHxytzxojJ PwJC2NSbW0aOK3F98+s2XmoVBeWwWOgYnFBveLE3OhyanCWO3qJ4xNKdJrqUiCbHO0mW C39VaXhwptjMprgTysSlkkRr6yLcug5vZedLM1E0WpKhK+or+tMVlMzZKypMFarNPEdI qmgNhlSitNryNIZXvHDmpqVT/qho6NX0ucIZp2KxfNseq5O4kw4aFidFbTeJ/GOHA5+y RFJA== X-Forwarded-Encrypted: i=1; AJvYcCVgyM/+JTWrYOWTs2/c1RoHaUqxvvwtn8+k3150Pz3F1LSYPPxsLuZmUgBfWZZPmNOOuy96uleQ0O0KB2I=@vger.kernel.org X-Gm-Message-State: AOJu0Yw5X4pDmQQlj/XwUdEHGjVmuVcEmmoosFeFkiMqjucbje14JEUS GAflo8MH1gF9xP4J1VbA/ZOy7zyne5MHJbSq/qSL46GehAlOTEey4y7K X-Gm-Gg: ASbGnctFcm+gE12yisGjv5pbP7Qka/gsNToNGaqEBNIHqapI+xpwFNgI6PMwyzNRUOK H0m8BW5jce65orych19aIzd6yiPYm/pLZgkkxA8yI6uNxcxsvRPnjMGwpiQof2GbF6UZCqTjeKy M+eN0pD5IX5JZi6CpANikJ423FxbXZv7jtqBpTzzPmsFay4c8KRwIa1iwFvhD9zx68OF4OQqQ1Y 5BeMa+ht8kf4+OeRAUiOa3Z7uPb0xbQfBx7rx0aD5X3AL47PNAhzu1yP8lSsB88b9qE0XBJ+WGF zl8bC1LLqQ7x4CvP01uBTMf5qaF31VJj85nmrUK1Q0LdC4gunmbp/5dB3xxnaKLZiy0q7aToQ9D y0T/tgw== X-Google-Smtp-Source: AGHT+IG5Sz2jXAvQt6nprHOBhcaEtyzrN5CivB9HVh3hGjjLbu6U4jLkt7oMIqQ0iexJTMUHil/HLQ== X-Received: by 2002:a05:6a00:2d86:b0:732:2923:b70f with SMTP id d2e1a72fcca58-7487e246061mr2110278b3a.11.1749702043843; Wed, 11 Jun 2025 21:20:43 -0700 (PDT) Received: from EBJ9932692.tcent.cn ([103.88.46.15]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-748809d2b79sm439361b3a.92.2025.06.11.21.20.37 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 11 Jun 2025 21:20:43 -0700 (PDT) From: Lance Yang X-Google-Original-From: Lance Yang To: akpm@linux-foundation.org Cc: zi.li@linux.dev, anna.schumaker@oracle.com, boqun.feng@gmail.com, joel.granados@kernel.org, jstultz@google.com, kent.overstreet@linux.dev, leonylgao@tencent.com, linux-kernel@vger.kernel.org, longman@redhat.com, mhiramat@kernel.org, mingo@redhat.com, mingzhe.yang@ly.com, peterz@infradead.org, rostedt@goodmis.org, senozhatsky@chromium.org, tfiga@chromium.org, will@kernel.org, Lance Yang Subject: [PATCH RFC 1/3] locking/rwsem: make owner helpers globally available Date: Thu, 12 Jun 2025 12:19:24 +0800 Message-ID: <20250612042005.99602-2-lance.yang@linux.dev> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250612042005.99602-1-lance.yang@linux.dev> References: <20250612042005.99602-1-lance.yang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Lance Yang In preparation for extending blocker tracking to support rwsems, make the rwsem_owner() and is_rwsem_reader_owned() helpers globally available for determining if the blocker is a writer or one of the readers. Signed-off-by: Lance Yang Reviewed-by: Masami Hiramatsu (Google) --- include/linux/rwsem.h | 12 ++++++++++++ kernel/locking/rwsem.c | 8 +++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/include/linux/rwsem.h b/include/linux/rwsem.h index c8b543d428b0..544853bed5b9 100644 --- a/include/linux/rwsem.h +++ b/include/linux/rwsem.h @@ -132,6 +132,18 @@ static inline int rwsem_is_contended(struct rw_semapho= re *sem) return !list_empty(&sem->wait_list); } =20 +#if defined(CONFIG_DEBUG_RWSEMS) || defined(CONFIG_DETECT_HUNG_TASK_BLOCKE= R) +/* + * Return just the real task structure pointer of the owner + */ +extern struct task_struct *rwsem_owner(struct rw_semaphore *sem); + +/* + * Return true if the rwsem is owned by a reader. + */ +extern bool is_rwsem_reader_owned(struct rw_semaphore *sem); +#endif + #else /* !CONFIG_PREEMPT_RT */ =20 #include diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c index 2ddb827e3bea..6cb29442d4fc 100644 --- a/kernel/locking/rwsem.c +++ b/kernel/locking/rwsem.c @@ -181,11 +181,11 @@ static inline void rwsem_set_reader_owned(struct rw_s= emaphore *sem) __rwsem_set_reader_owned(sem, current); } =20 -#ifdef CONFIG_DEBUG_RWSEMS +#if defined(CONFIG_DEBUG_RWSEMS) || defined(CONFIG_DETECT_HUNG_TASK_BLOCKE= R) /* * Return just the real task structure pointer of the owner */ -static inline struct task_struct *rwsem_owner(struct rw_semaphore *sem) +struct task_struct *rwsem_owner(struct rw_semaphore *sem) { return (struct task_struct *) (atomic_long_read(&sem->owner) & ~RWSEM_OWNER_FLAGS_MASK); @@ -194,7 +194,7 @@ static inline struct task_struct *rwsem_owner(struct rw= _semaphore *sem) /* * Return true if the rwsem is owned by a reader. */ -static inline bool is_rwsem_reader_owned(struct rw_semaphore *sem) +bool is_rwsem_reader_owned(struct rw_semaphore *sem) { /* * Check the count to see if it is write-locked. @@ -205,7 +205,9 @@ static inline bool is_rwsem_reader_owned(struct rw_sema= phore *sem) return false; return rwsem_test_oflags(sem, RWSEM_READER_OWNED); } +#endif =20 +#ifdef CONFIG_DEBUG_RWSEMS /* * With CONFIG_DEBUG_RWSEMS configured, it will make sure that if there * is a task pointer in owner of a reader-owned rwsem, it will be the --=20 2.49.0 From nobody Sat Oct 11 00:30:48 2025 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BB1DD19CC29 for ; Thu, 12 Jun 2025 04:20:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749702053; cv=none; b=ohUtrC22adf7dgDct4j/SeoGAET0ktNrF3bWhLqw+jTLb8boo0qqkeLFNEKCt8Fjdn2KIAw24b9S05kHNrozeXavD5W7ULGC6Wth++XjlIYRMbbCbYcR3WthycPJRX5OJR1Ji+p1cRAjmJCIYRysOZlzqnlOIanKjt+3yeS/pb0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749702053; c=relaxed/simple; bh=vcWyfNfH2YoMo8SESGMWv11jFk5r3IO5X5RUxiSqjBA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ScckBGL2Gt1Oy120PN735kLKlTM4Nog4Yp/VAy96y73LaWjNKY5NTwgEpY0Y5ZvPJ27NhvyGam6zIZLk3/kCBeQB3kGYrDpxUa7wUp4lZHKfgsfthfX6K1JYbhls5w4D+j7VtObK4HBWCJmzRoCkhssRT459qp/2ENKvbTvAI5Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ivoNTu/t; arc=none smtp.client-ip=209.85.210.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ivoNTu/t" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-7426c44e014so499536b3a.3 for ; Wed, 11 Jun 2025 21:20:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749702051; x=1750306851; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=VazEG+u3TA3RyAL39AnM0LIMtofKUCAhL1m/XwFY6KE=; b=ivoNTu/t/D4nt4VNNZnjSpS5MZE57PLo2KkC4O6SS6tLsVav/T29CuL5CmdQPvRomy mmM04CSXoFHLT9rxuZcbWFxmX8tO3MhVpVcL++nP6kvOzj2mPtV4mh2GlP5YreQSc7mF Nxi8DTF5Bc/NSu9fb2cyI3oocEvZMQbnHeIv/yKsjuufDk1obwBSI4JPx1FVAKJg45y/ 2BzepYbA9VkAogoDpBpJYAcStZeWn+FZWTapLmW4aA0VvUl3jPuX3r2AfUvHccnRcezn k6m2MfbmujpkQSIw/k403nS9vOGJxjPLpRNmZpVDVaxtNsWmnbCx8uG5Qe6FZeekVSEC 7rmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749702051; x=1750306851; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=VazEG+u3TA3RyAL39AnM0LIMtofKUCAhL1m/XwFY6KE=; b=QwCBNtdhWfy9eSsXsRSxKqM6t+BLI+z82jGsmL/dhXr1h6vk7h+cW8uXinl0r2bfum H3sFcUsASeXMTr3UjBd+atjNW5MGowTMzYqxpmELD5y7WfgNzHmRtpGOUJ/Q+/Kt2U0n zaEOdP2xrYA8WYJr+3FLjS6kLN2SHjyk96crKAw9c5LQUtR4CMmR/t9ugO7DMOuZE+E+ 0t06w04Hl8TSnq/bW7gnB54qXAArG2CHE0Jfqu9ORNODvSqPEi/hVe/zxKaIly4N6kIv V4d8SD7+N+NI0VmhfcPscnkifoI6xHVKHbkZkqBcCrYAnJ3uDPWApfcT2mPitRDj5BC4 lemQ== X-Forwarded-Encrypted: i=1; AJvYcCWPMVvA6J/dUzUWWXL4HoMSxeqPViQtqJzdD9rcSBEdhY7fUUGyDyh5VIV/gxByVY5WKtgoH1JmsIVUP5g=@vger.kernel.org X-Gm-Message-State: AOJu0YywWkgu1XcEg2tOWJ0EEqiU70wvUTXaimAmcC+2OyEOeR3mufii mKaKPdl9URJcabGzPwVW6UOmvnMbiIfCKRxGnKrcbcV38A43WNZ1ltMi X-Gm-Gg: ASbGncvA5c4OxliyAt+t9ysGl/mQ1n/OKHULDvtTSLl/nix5MFlKBlCsWgV3C5XsPX2 4+jSbv7nujddzSj0L3dEtZO2AWmenFzLOsg6pOUANZeq3G9OiIrkEkVWJMJGsJRmwkw/Plq2UHK oG3HYsBGIl+2U3rdAKtTAGQKlDU6MrwbWjwqPisch5agB6EFyAdRUMfADTDzWi6hhx6YuMRKUHj uOl9SQMBxP7IIDLs8QMwa6B40+1sLEG07mdmtQCDj8GyCoY4Bfu4fhKj3K+uun70VpSALev9X+r RzAgmXnr6t6WUxivWa43A1qzBWvwu8uartDP63vGPXdt4zi3S/ldKJYHNm6D8EpSfQV8zLs= X-Google-Smtp-Source: AGHT+IGz+v7XWRB8gVATbbKgN9PPbtb6679dmaW2AM5cLn42LVHX+IFr7zXjcvo9D62SeiJuaDzYhA== X-Received: by 2002:a05:6a21:339a:b0:21b:603d:708e with SMTP id adf61e73a8af0-21f866d7123mr8102475637.22.1749702050901; Wed, 11 Jun 2025 21:20:50 -0700 (PDT) Received: from EBJ9932692.tcent.cn ([103.88.46.15]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-748809d2b79sm439361b3a.92.2025.06.11.21.20.44 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 11 Jun 2025 21:20:50 -0700 (PDT) From: Lance Yang X-Google-Original-From: Lance Yang To: akpm@linux-foundation.org Cc: zi.li@linux.dev, anna.schumaker@oracle.com, boqun.feng@gmail.com, joel.granados@kernel.org, jstultz@google.com, kent.overstreet@linux.dev, leonylgao@tencent.com, linux-kernel@vger.kernel.org, longman@redhat.com, mhiramat@kernel.org, mingo@redhat.com, mingzhe.yang@ly.com, peterz@infradead.org, rostedt@goodmis.org, senozhatsky@chromium.org, tfiga@chromium.org, will@kernel.org, Lance Yang Subject: [PATCH RFC 2/3] locking/rwsem: clear reader-owner on unlock to reduce false positives Date: Thu, 12 Jun 2025 12:19:25 +0800 Message-ID: <20250612042005.99602-3-lance.yang@linux.dev> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250612042005.99602-1-lance.yang@linux.dev> References: <20250612042005.99602-1-lance.yang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Lance Yang When CONFIG_DETECT_HUNG_TASK_BLOCKER is enabled, a stale owner pointer in a reader-owned rwsem can lead to false positives in blocker tracking. To mitigate this, let=E2=80=99s try to clear the owner field on unlock, as = a NULL owner is better than a stale one for diagnostics. Signed-off-by: Lance Yang --- kernel/locking/rwsem.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c index 6cb29442d4fc..a310eb9896de 100644 --- a/kernel/locking/rwsem.c +++ b/kernel/locking/rwsem.c @@ -205,14 +205,12 @@ bool is_rwsem_reader_owned(struct rw_semaphore *sem) return false; return rwsem_test_oflags(sem, RWSEM_READER_OWNED); } -#endif =20 -#ifdef CONFIG_DEBUG_RWSEMS /* - * With CONFIG_DEBUG_RWSEMS configured, it will make sure that if there - * is a task pointer in owner of a reader-owned rwsem, it will be the - * real owner or one of the real owners. The only exception is when the - * unlock is done by up_read_non_owner(). + * With CONFIG_DEBUG_RWSEMS or CONFIG_DETECT_HUNG_TASK_BLOCKER configured, + * it will make sure that the owner field of a reader-owned rwsem either + * points to a real reader-owner(s) or gets cleared. The only exception is + * when the unlock is done by up_read_non_owner(). */ static inline void rwsem_clear_reader_owned(struct rw_semaphore *sem) { --=20 2.49.0 From nobody Sat Oct 11 00:30:48 2025 Received: from mail-pf1-f171.google.com (mail-pf1-f171.google.com [209.85.210.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BC6B51A3165 for ; Thu, 12 Jun 2025 04:20:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749702060; cv=none; b=iWymRs/1dl/SoAe9BD9vg6FQNIxYj6pNmbeL/NG4iLvXJCtz2SLZXYBxtZ82QnRkU0FF84ftZHJJh+sHUjxfHKwoj7Olxv4BBBUwgOzmnyNfnpwYFzRvH/RR6JzvZbhKtIxDkLGkbWGIIepm+hh7XidQh/mEgsRsUg1E+mIW0AI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749702060; c=relaxed/simple; bh=TsxN2z8IOm8/jwGSpBka8PYJRa2K7ScElWp5HNUlTS4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=un0oKii4BECLznXfvVMhVVEpX5bnFg+IrisF2qTrPy6hYlUXyxCBz7JoRD/bmJimNYI/mjUHARDgiXOG83QQgAobE2zoyTq/RftIRzy9v5vi09GTJrIPVRCjZex0yLcGrpUOkBb0h7sC2LzkYeRYTgRQl7rzjHvzQwjXiG3zl7o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=KO0qY2Fu; arc=none smtp.client-ip=209.85.210.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="KO0qY2Fu" Received: by mail-pf1-f171.google.com with SMTP id d2e1a72fcca58-74877ac9d42so420803b3a.1 for ; Wed, 11 Jun 2025 21:20:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749702058; x=1750306858; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Ct43B9dpr2sXOkfVpusyhMVLq0HGGYTToPuza0NtbVc=; b=KO0qY2FuaBUkjt3xzLTK7vTEky+kVlvU87M35wkVIU911ZgcjstwdUP697OFIzHoN9 g2VavI9QzYIKS2/hoaXxBoaZId9xetGHq0sdPGWF072dBDe6L9W71I1KJKiFgYY+YeVM bIpQV75/wLkAvS3LogZqguY3I5TOMHVW+2bRdW3+J3zc7vc7bghGkfk7dNeEJmnrSTuL gOEiisGU1+4hbDFEx3HYOx+Etd2fGofMN8i8+RTg3f3OnFUZXPzaS/3uTZumL+OYBmc6 krxcCnhXMbXjhgTKL7AsmQwBA3NDoN3DyaOS+cRQ1O4kavymF6Zbma4QNe9tZP428A1n x5Zg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749702058; x=1750306858; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Ct43B9dpr2sXOkfVpusyhMVLq0HGGYTToPuza0NtbVc=; b=GnY0/5YHaiCOlXynIHbz98iewfQB9hhGU7786M7LFIkvW6ccBTnE3PE9xGitNeeEjt NcOWKda+C/oNfcY4iWNCu5/fUAnSrd8Ff7tgVbDy87clE4aGduct9qw/We4Dk458D/E3 GP0XjslqtsrsgbhcK0h1Ei2wV2rpnUyCkhvEUy18R8oxABr5Jo9NlweN1DWTUiP13BiH lQiXDW9CKUo3TVUemTecW+nwH7HUaZSjZLOCQjiAp69psTT19LxRK7K7WpaTLRzqQste L7yMU9VNEmPRHZWlJlsYEwIAXLpzmm6t4IelYzAfOjoOjjUNb2nQH9l6CPO2ZaCuySyX ZJyg== X-Forwarded-Encrypted: i=1; AJvYcCWB6O7ZEQGR4L1afp0vgVUSYSBMSQoxXzzASQUgjnJrDGBlt7TR7dGo7qj+ILPTiL75qze2DsTRtM5Hd0Y=@vger.kernel.org X-Gm-Message-State: AOJu0YxghuMADMs7uZc/4GeTxmOVUyBGJbPHSaE9dnKOuqT+W/GT8E/4 Opk9hJoM70sSrnb05EKzNj9V57ttt7IOKf8NgQraLWNHQmh/yfg7b/IDtX+5fA== X-Gm-Gg: ASbGncvaSU+ZTKkZX+R6iVE4md8m1ZlSz4HbdKGa8kreve6DXneStPzPhUHmr15hB52 3WWJ9miYnvfS+3Sy6II8eefv3bCYoQiTPK2aNNj0LjdsCGxOq1pvvA6bPbGLK8HMqMapc8a6YsD FVPZEHD2HRDmned4UJ70CvAn+TPSm+i+JdRXzewrn9/z5shNLmrxj5MUHhJOoJsTqikFtko6o1a j4x2jgH+4qQt3v5MrpuhU+p4EgRyMzEMo5K0bgJtgzMVFblCtYO5KwclPqwgf6R5qyNVwyklxz9 I06l6rFQfUG3GO1VLF814IFFbXDeM+26VkRSoOhT2y/vXmZAlZj6Jkul/5nshVk+K70Hm6o= X-Google-Smtp-Source: AGHT+IHp+TrDpYOL2EW1gnU8IlHnV/0vXqH0dISgVaNDvudJhUGB/JfjkFfiHo15CgWdHT+oLPnivw== X-Received: by 2002:aa7:88c9:0:b0:748:3a1a:ba72 with SMTP id d2e1a72fcca58-7487e29c60amr2188551b3a.20.1749702057954; Wed, 11 Jun 2025 21:20:57 -0700 (PDT) Received: from EBJ9932692.tcent.cn ([103.88.46.15]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-748809d2b79sm439361b3a.92.2025.06.11.21.20.51 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 11 Jun 2025 21:20:57 -0700 (PDT) From: Lance Yang X-Google-Original-From: Lance Yang To: akpm@linux-foundation.org Cc: zi.li@linux.dev, anna.schumaker@oracle.com, boqun.feng@gmail.com, joel.granados@kernel.org, jstultz@google.com, kent.overstreet@linux.dev, leonylgao@tencent.com, linux-kernel@vger.kernel.org, longman@redhat.com, mhiramat@kernel.org, mingo@redhat.com, mingzhe.yang@ly.com, peterz@infradead.org, rostedt@goodmis.org, senozhatsky@chromium.org, tfiga@chromium.org, will@kernel.org, Lance Yang Subject: [PATCH RFC 3/3] hung_task: extend hung task blocker tracking to rwsems Date: Thu, 12 Jun 2025 12:19:26 +0800 Message-ID: <20250612042005.99602-4-lance.yang@linux.dev> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250612042005.99602-1-lance.yang@linux.dev> References: <20250612042005.99602-1-lance.yang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Lance Yang Inspired by mutex blocker tracking[1], and having already extended it to semaphores, let's now add support for reader-writer semaphores (rwsems). The approach is simple: when a task enters TASK_UNINTERRUPTIBLE while waiting for an rwsem, we just call hung_task_set_blocker(). The hung task detector can then query the rwsem's owner to identify the lock holder. Tracking works reliably for writers, as there can only be a single writer holding the lock, and its task struct is stored in the owner field. The main challenge lies with readers. The owner field points to only one of many concurrent readers, so we might lose track of the blocker if that specific reader unlocks, even while others remain. This is not a significant issue, however. In practice, long-lasting lock contention is almost always caused by a writer. Therefore, reliably tracking the writer is the primary goal of this patch series ;) With this change, the hung task detector can now show blocker task's info like below: [Thu Jun 12 11:01:33 2025] INFO: task rw_sem_thread2:36526 blocked for more= than 122 seconds. [Thu Jun 12 11:01:33 2025] Tainted: G S O 6.16.0-rc1 #1 [Thu Jun 12 11:01:33 2025] "echo 0 > /proc/sys/kernel/hung_task_timeout_sec= s" disables this message. [Thu Jun 12 11:01:33 2025] task:rw_sem_thread2 state:D stack:0 pid:365= 26 tgid:36526 ppid:2 task_flags:0x208040 flags:0x00004000 [Thu Jun 12 11:01:33 2025] Call Trace: [Thu Jun 12 11:01:33 2025] [Thu Jun 12 11:01:33 2025] __schedule+0x7c7/0x1930 [Thu Jun 12 11:01:33 2025] ? __pfx___schedule+0x10/0x10 [Thu Jun 12 11:01:33 2025] ? _raw_spin_lock_irq+0x8a/0xe0 [Thu Jun 12 11:01:33 2025] ? __pfx__raw_spin_lock_irq+0x10/0x10 [Thu Jun 12 11:01:33 2025] schedule+0x6a/0x180 [Thu Jun 12 11:01:33 2025] schedule_preempt_disabled+0x15/0x30 [Thu Jun 12 11:01:33 2025] rwsem_down_write_slowpath+0x447/0x1090 [Thu Jun 12 11:01:33 2025] ? __pfx_rwsem_down_write_slowpath+0x10/0x10 [Thu Jun 12 11:01:33 2025] ? __pfx___schedule+0x10/0x10 [Thu Jun 12 11:01:33 2025] ? __pfx___might_resched+0x10/0x10 [Thu Jun 12 11:01:33 2025] ? __pfx_thread2_func+0x10/0x10 [rw_sem_test_2] [Thu Jun 12 11:01:33 2025] down_write+0x125/0x140 [Thu Jun 12 11:01:33 2025] ? __pfx_down_write+0x10/0x10 [Thu Jun 12 11:01:33 2025] ? msleep+0x91/0xf0 [Thu Jun 12 11:01:33 2025] ? __raw_spin_lock_irqsave+0x8c/0xf0 [Thu Jun 12 11:01:33 2025] thread2_func+0x37/0x70 [rw_sem_test_2] [Thu Jun 12 11:01:33 2025] kthread+0x39f/0x750 [Thu Jun 12 11:01:33 2025] ? __pfx_kthread+0x10/0x10 [Thu Jun 12 11:01:33 2025] ? __pfx__raw_spin_lock_irq+0x10/0x10 [Thu Jun 12 11:01:33 2025] ? __pfx_kthread+0x10/0x10 [Thu Jun 12 11:01:33 2025] ret_from_fork+0x25d/0x320 [Thu Jun 12 11:01:33 2025] ? __pfx_kthread+0x10/0x10 [Thu Jun 12 11:01:33 2025] ret_from_fork_asm+0x1a/0x30 [Thu Jun 12 11:01:33 2025] [Thu Jun 12 11:01:33 2025] INFO: task rw_sem_thread2:36526 blocked= on an rw-semaphore likely owned by task rw_sem_thread1:36525 [Thu Jun 12 11:01:33 2025] task:rw_sem_thread1 state:S stack:0 pid:365= 25 tgid:36525 ppid:2 task_flags:0x208040 flags:0x00004000 [Thu Jun 12 11:01:33 2025] Call Trace: [Thu Jun 12 11:01:33 2025] [Thu Jun 12 11:01:33 2025] __schedule+0x7c7/0x1930 [Thu Jun 12 11:01:33 2025] ? __pfx___schedule+0x10/0x10 [Thu Jun 12 11:01:33 2025] ? __mod_timer+0x304/0xa80 [Thu Jun 12 11:01:33 2025] ? irq_work_queue+0x6a/0xa0 [Thu Jun 12 11:01:33 2025] ? __pfx_vprintk_emit+0x10/0x10 [Thu Jun 12 11:01:33 2025] schedule+0x6a/0x180 [Thu Jun 12 11:01:33 2025] schedule_timeout+0xfb/0x230 [Thu Jun 12 11:01:33 2025] ? __pfx_schedule_timeout+0x10/0x10 [Thu Jun 12 11:01:33 2025] ? __pfx_process_timeout+0x10/0x10 [Thu Jun 12 11:01:33 2025] ? down_write+0xc4/0x140 [Thu Jun 12 11:01:33 2025] msleep_interruptible+0xbe/0x150 [Thu Jun 12 11:01:33 2025] ? __pfx_thread1_func+0x10/0x10 [rw_sem_test_2] [Thu Jun 12 11:01:33 2025] thread1_func+0x37/0x60 [rw_sem_test_2] [Thu Jun 12 11:01:33 2025] kthread+0x39f/0x750 [Thu Jun 12 11:01:33 2025] ? __pfx_kthread+0x10/0x10 [Thu Jun 12 11:01:33 2025] ? __pfx__raw_spin_lock_irq+0x10/0x10 [Thu Jun 12 11:01:33 2025] ? __pfx_kthread+0x10/0x10 [Thu Jun 12 11:01:33 2025] ret_from_fork+0x25d/0x320 [Thu Jun 12 11:01:33 2025] ? __pfx_kthread+0x10/0x10 [Thu Jun 12 11:01:33 2025] ret_from_fork_asm+0x1a/0x30 [Thu Jun 12 11:01:33 2025] [1] https://lore.kernel.org/all/174046694331.2194069.15472952050240807469.s= tgit@mhiramat.tok.corp.google.com/ Suggested-by: Masami Hiramatsu (Google) Signed-off-by: Lance Yang Reviewed-by: Masami Hiramatsu (Google) --- include/linux/hung_task.h | 18 +++++++++--------- kernel/hung_task.c | 29 +++++++++++++++++++++++++---- kernel/locking/rwsem.c | 17 ++++++++++++++++- 3 files changed, 50 insertions(+), 14 deletions(-) diff --git a/include/linux/hung_task.h b/include/linux/hung_task.h index 1bc2b3244613..34e615c76ca5 100644 --- a/include/linux/hung_task.h +++ b/include/linux/hung_task.h @@ -21,17 +21,17 @@ * type. * * Type encoding: - * 00 - Blocked on mutex (BLOCKER_TYPE_MUTEX) - * 01 - Blocked on semaphore (BLOCKER_TYPE_SEM) - * 10 - Blocked on rt-mutex (BLOCKER_TYPE_RTMUTEX) - * 11 - Blocked on rw-semaphore (BLOCKER_TYPE_RWSEM) + * 00 - Blocked on mutex (BLOCKER_TYPE_MUTEX) + * 01 - Blocked on semaphore (BLOCKER_TYPE_SEM) + * 10 - Blocked on rw-semaphore as READER (BLOCKER_TYPE_RWSEM_READER) + * 11 - Blocked on rw-semaphore as WRITER (BLOCKER_TYPE_RWSEM_WRITER) */ -#define BLOCKER_TYPE_MUTEX 0x00UL -#define BLOCKER_TYPE_SEM 0x01UL -#define BLOCKER_TYPE_RTMUTEX 0x02UL -#define BLOCKER_TYPE_RWSEM 0x03UL +#define BLOCKER_TYPE_MUTEX 0x00UL +#define BLOCKER_TYPE_SEM 0x01UL +#define BLOCKER_TYPE_RWSEM_READER 0x02UL +#define BLOCKER_TYPE_RWSEM_WRITER 0x03UL =20 -#define BLOCKER_TYPE_MASK 0x03UL +#define BLOCKER_TYPE_MASK 0x03UL =20 #ifdef CONFIG_DETECT_HUNG_TASK_BLOCKER static inline void hung_task_set_blocker(void *lock, unsigned long type) diff --git a/kernel/hung_task.c b/kernel/hung_task.c index d2432df2b905..8708a1205f82 100644 --- a/kernel/hung_task.c +++ b/kernel/hung_task.c @@ -23,6 +23,7 @@ #include #include #include +#include =20 #include =20 @@ -100,6 +101,7 @@ static void debug_show_blocker(struct task_struct *task) { struct task_struct *g, *t; unsigned long owner, blocker, blocker_type; + const char *rwsem_blocked_by, *rwsem_blocked_as; =20 RCU_LOCKDEP_WARN(!rcu_read_lock_held(), "No rcu lock held"); =20 @@ -111,12 +113,20 @@ static void debug_show_blocker(struct task_struct *ta= sk) =20 switch (blocker_type) { case BLOCKER_TYPE_MUTEX: - owner =3D mutex_get_owner( - (struct mutex *)hung_task_blocker_to_lock(blocker)); + owner =3D mutex_get_owner(hung_task_blocker_to_lock(blocker)); break; case BLOCKER_TYPE_SEM: - owner =3D sem_last_holder( - (struct semaphore *)hung_task_blocker_to_lock(blocker)); + owner =3D sem_last_holder(hung_task_blocker_to_lock(blocker)); + break; + case BLOCKER_TYPE_RWSEM_READER: + case BLOCKER_TYPE_RWSEM_WRITER: + owner =3D (unsigned long)rwsem_owner( + hung_task_blocker_to_lock(blocker)); + rwsem_blocked_as =3D (blocker_type =3D=3D BLOCKER_TYPE_RWSEM_READER) ? + "reader" : "writer"; + rwsem_blocked_by =3D is_rwsem_reader_owned( + hung_task_blocker_to_lock(blocker)) ? + "reader" : "writer"; break; default: WARN_ON_ONCE(1); @@ -134,6 +144,11 @@ static void debug_show_blocker(struct task_struct *tas= k) pr_err("INFO: task %s:%d is blocked on a semaphore, but the last holder= is not found.\n", task->comm, task->pid); break; + case BLOCKER_TYPE_RWSEM_READER: + case BLOCKER_TYPE_RWSEM_WRITER: + pr_err("INFO: task %s:%d is blocked on an rw-semaphore, but the owner i= s not found.\n", + task->comm, task->pid); + break; } return; } @@ -152,6 +167,12 @@ static void debug_show_blocker(struct task_struct *tas= k) pr_err("INFO: task %s:%d blocked on a semaphore likely last held by tas= k %s:%d\n", task->comm, task->pid, t->comm, t->pid); break; + case BLOCKER_TYPE_RWSEM_READER: + case BLOCKER_TYPE_RWSEM_WRITER: + pr_err("INFO: task %s:%d <%s> blocked on an rw-semaphore likely owned b= y task %s:%d <%s>\n", + task->comm, task->pid, rwsem_blocked_as, t->comm, + t->pid, rwsem_blocked_by); + break; } sched_show_task(t); return; diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c index a310eb9896de..92c6332da401 100644 --- a/kernel/locking/rwsem.c +++ b/kernel/locking/rwsem.c @@ -27,6 +27,7 @@ #include #include #include +#include #include =20 #ifndef CONFIG_PREEMPT_RT @@ -1065,10 +1066,13 @@ rwsem_down_read_slowpath(struct rw_semaphore *sem, = long count, unsigned int stat wake_up_q(&wake_q); =20 trace_contention_begin(sem, LCB_F_READ); + set_current_state(state); + + if (state =3D=3D TASK_UNINTERRUPTIBLE) + hung_task_set_blocker(sem, BLOCKER_TYPE_RWSEM_READER); =20 /* wait to be given the lock */ for (;;) { - set_current_state(state); if (!smp_load_acquire(&waiter.task)) { /* Matches rwsem_mark_wake()'s smp_store_release(). */ break; @@ -1083,8 +1087,12 @@ rwsem_down_read_slowpath(struct rw_semaphore *sem, l= ong count, unsigned int stat } schedule_preempt_disabled(); lockevent_inc(rwsem_sleep_reader); + set_current_state(state); } =20 + if (state =3D=3D TASK_UNINTERRUPTIBLE) + hung_task_clear_blocker(); + __set_current_state(TASK_RUNNING); lockevent_inc(rwsem_rlock); trace_contention_end(sem, 0); @@ -1146,6 +1154,9 @@ rwsem_down_write_slowpath(struct rw_semaphore *sem, i= nt state) set_current_state(state); trace_contention_begin(sem, LCB_F_WRITE); =20 + if (state =3D=3D TASK_UNINTERRUPTIBLE) + hung_task_set_blocker(sem, BLOCKER_TYPE_RWSEM_WRITER); + for (;;) { if (rwsem_try_write_lock(sem, &waiter)) { /* rwsem_try_write_lock() implies ACQUIRE on success */ @@ -1179,6 +1190,10 @@ rwsem_down_write_slowpath(struct rw_semaphore *sem, = int state) trylock_again: raw_spin_lock_irq(&sem->wait_lock); } + + if (state =3D=3D TASK_UNINTERRUPTIBLE) + hung_task_clear_blocker(); + __set_current_state(TASK_RUNNING); raw_spin_unlock_irq(&sem->wait_lock); lockevent_inc(rwsem_wlock); --=20 2.49.0