From nobody Mon Feb 9 12:01:38 2026 Received: from mail-ej1-f51.google.com (mail-ej1-f51.google.com [209.85.218.51]) (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 95C8E199FC9 for ; Tue, 28 Jan 2025 14:07:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738073240; cv=none; b=uNx4IqdXoNT5Sk4xjM3wDtMIPirvLxlabmveEuFrGdnGwmvjFVy1iLQjY9d/gEYAPs4O3JvHxi8/tPFlEQoMMwF7bhCETjdIrrtbzxXgGBitcrLbw5hIQ5nAoNgiYPeXOeitBXHCD/RHMjlw7qjlmk5Wj+Eb4JddsB/ORYUFyhY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738073240; c=relaxed/simple; bh=PQbWRzmCMdVEEj3gjjShy2OQx/D9wXicNAMiPm5QQ/M=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=b/BrAlQlaMKAAbXgRNZ6M4kD0PBK3Ud66Zlnp6SLIV4j+Hm+2q2EMq2Nm1ucZBOPfUBy1dcO2XD5ToYT3B1TLpA+CrpaP1k7z1Ha+vg6/ZBw8yY7MJgcYVOTzkmfAtIjbSTpv5cSWaYU3N1XLdYOqPfcHOmji6lFQ1rPXqece8Q= 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=l3C4TvKc; arc=none smtp.client-ip=209.85.218.51 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="l3C4TvKc" Received: by mail-ej1-f51.google.com with SMTP id a640c23a62f3a-ab39f84cbf1so1089096566b.3 for ; Tue, 28 Jan 2025 06:07:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738073236; x=1738678036; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=VcQRVbzdIICkrqxKMT4X1l5Fux/5X8g37KvRx7AU3E0=; b=l3C4TvKcE5hJwr9ZN4eADSD5yJZ1AtLVCVydBohapm8KwpN8aRFgEStO85FwTG4z6A yvFw1faF+dIZ6COx1cjVPcYCamQqagzIz89ZftHO9TefUCErbq4kx4RI/UaY27vg602P oeQJ0T+Ton7NpHknM/+d14MgxxKtHqlzr+rOi0O+DveFUJCxPRTCRP5fdsv1QXjWU2TO YLM0JrJcuC7G5fk5v+3PgIvf8/2JBXa/4rPqe8M9pxCEhsuQrJqukMv7LRvpTEbGYg5b X60Cc2Cw5Iia3/lHnQf6Wn6avn2W/kADC+i2IWEp2x3h6Bb7lTzcamcAiCFp70k74h3Y vyfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738073236; x=1738678036; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=VcQRVbzdIICkrqxKMT4X1l5Fux/5X8g37KvRx7AU3E0=; b=JkehiJQqaTqjaVMOvBii10+q9fR+EzGLh5JD5lHnlJtaOFOCyrvjuDGM22KUJ47avy pdsWyJPKH/b6vsaWYdEzjIpnpNoT7LD0OkfhSUTAf/s4OWdipG2xOxtjye7ZIzu0sE8Q ttij7cChEVAq83lMzClpifSqAawQYtTUZYtSXL+miLwaQArz0zVmQRGEuPFtPlYc4kVq 2ZViTcppnF8Sd/XtEkOzaRyKRxwqEbRorOMpfShA9xZrD/hOVm7JnBIEQU9+YmslxihG MmeWrqNGm8h8TM0AGBmpr0z8IvmisvtCQH6WVEdGORdKS+NT/45gbLDOfEcUZuvKjjJX F1IA== X-Gm-Message-State: AOJu0YyjQ6fU+6IO1r6orTrkEb6zKK3+5jhMh4PKnrpLonQFSYxpmFKN R+KzqkIqmHNOxMFMfKY2gngGXISUnoq/2+/hrzv6DfirKOtYSeTP X-Gm-Gg: ASbGncvfagVmZs+IXhcRZSfbvlvraZnrFfV6AAHECuv/bDmBsHQt2PBtHeeodOdXaDZ o6j7+jQxOudTQABMyfjBOA3X9Tn+DIO2CS3mmoj3KMvNWhdH7PIhTp7gTkVSRZMIAoWpHuFQrAq mi3p5ppF9c0BHsNsv77LoSb6bHIF40q3D+GpSbdUVjvMyDxwwTvnmurUWzdxtRsd7Zkq8PkBYT5 UF8IXi84+cjsfBS9MWAXJlxEzgeVscgg0nOGmyXJRLQPhzS0kWmYhRRSa40VnDmQRkSWn8GN+pM 3RgpqZxZLVH+zDZzk9bQKcQjFvfcQpc= X-Google-Smtp-Source: AGHT+IHijQH9fPjMJRtKZQRbn+B5Vma9HueHBf0qBRtx7YlC1Qu1EdoZNlqoGT/iqC1XrZ/WgIcOJw== X-Received: by 2002:a17:907:7207:b0:ab3:8b1:12aa with SMTP id a640c23a62f3a-ab38b0a2216mr4569892666b.8.1738073235368; Tue, 28 Jan 2025 06:07:15 -0800 (PST) Received: from f.. (cst-prg-69-60.cust.vodafone.cz. [46.135.69.60]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ab6760fb3f7sm797779466b.138.2025.01.28.06.07.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Jan 2025 06:07:14 -0800 (PST) From: Mateusz Guzik To: brauner@kernel.org, oleg@redhat.com, akpm@linux-foundation.org Cc: linux-kernel@vger.kernel.org, Mateusz Guzik Subject: [PATCH] exit: call add_device_randomness() without tasklist_lock Date: Tue, 28 Jan 2025 15:07:01 +0100 Message-ID: <20250128140701.3136924-1-mjguzik@gmail.com> X-Mailer: git-send-email 2.43.0 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" Parallel calls to add_device_randomness() contend in their own right. The clone side aleady runs outside of tasklist_lock, which in turn means any caller on the exit side extends the tasklist_lock hold time while contending on the random-private lock. Fixing this problem bumps thread creation/destruction rate by 4% on a 24 core vm. Bench (plop into will-it-scale): $ cat tests/threadspawn1.c char *testcase_description =3D "Thread creation and teardown"; static void *worker(void *arg) { return (NULL); } void testcase(unsigned long long *iterations, unsigned long nr) { pthread_t thread; int error; while (1) { error =3D pthread_create(&thread, NULL, worker, NULL); assert(error =3D=3D 0); error =3D pthread_join(thread, NULL); assert(error =3D=3D 0); (*iterations)++; } } Signed-off-by: Mateusz Guzik --- kernel/exit.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/kernel/exit.c b/kernel/exit.c index 1dcddfe537ee..8a9ac55dc26e 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -141,13 +141,14 @@ static void __unhash_process(struct task_struct *p, b= ool group_dead) /* * This function expects the tasklist_lock write-locked. */ -static void __exit_signal(struct task_struct *tsk) +static unsigned long long __exit_signal(struct task_struct *tsk) { struct signal_struct *sig =3D tsk->signal; bool group_dead =3D thread_group_leader(tsk); struct sighand_struct *sighand; struct tty_struct *tty; u64 utime, stime; + unsigned long long randomness; =20 sighand =3D rcu_dereference_check(tsk->sighand, lockdep_tasklist_lock_is_held()); @@ -174,8 +175,7 @@ static void __exit_signal(struct task_struct *tsk) sig->curr_target =3D next_thread(tsk); } =20 - add_device_randomness((const void*) &tsk->se.sum_exec_runtime, - sizeof(unsigned long long)); + randomness =3D tsk->se.sum_exec_runtime; =20 /* * Accumulate here the counters for all threads as they die. We could @@ -214,6 +214,8 @@ static void __exit_signal(struct task_struct *tsk) flush_sigqueue(&sig->shared_pending); tty_kref_put(tty); } + + return randomness; } =20 static void delayed_put_task_struct(struct rcu_head *rhp) @@ -242,6 +244,7 @@ void release_task(struct task_struct *p) struct task_struct *leader; struct pid *thread_pid; int zap_leader; + unsigned long long randomness; repeat: /* don't need to get the RCU readlock here - the process is dead and * can't be modifying its own credentials. But shut RCU-lockdep up */ @@ -254,7 +257,7 @@ void release_task(struct task_struct *p) write_lock_irq(&tasklist_lock); ptrace_release_task(p); thread_pid =3D get_pid(p->thread_pid); - __exit_signal(p); + randomness =3D __exit_signal(p); =20 /* * If we are the last non-leader member of the thread @@ -280,6 +283,8 @@ void release_task(struct task_struct *p) put_pid(thread_pid); release_thread(p); put_task_struct_rcu_user(p); + add_device_randomness((const void*) &randomness, + sizeof(unsigned long long)); =20 p =3D leader; if (unlikely(zap_leader)) --=20 2.43.0