From nobody Tue Dec 16 15:27:54 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 B511D16EB7C for ; Tue, 6 May 2025 09:16:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746522971; cv=none; b=AUhXS1DsIk+/ldEEAXfTxtfclM5WoWo+kO5c5FQG1q27rrzYiiRPj7TQ7d8vPugPiAZLcW08Y3XH2alGueGJTIXmaET4y6nzr8nziuokBRHtjkprg/6Qr9+9jzlfWy4IClL9tjeGMkMQ0ecWA5HW+6KBYlUmYH/hY8tpFch1D5I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746522971; c=relaxed/simple; bh=nzqaHVCQLqt0ZT1op3rJmqmLSmefWiGiX5DRVh+qLWs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BIldm6VZeJqebARMBvmBNjAL4GG9IoXEK5B5rUFn9lkpQFzIjbW5mG5AH/RrtLjcoQCKR49kmqA1JBIy1kM7U5IuhysqMEG0y8KaiSdTns2Ck0eG8+q/xFJNfhHTeNxzaL5NRy36x6k5DpKLkwj5K6GHMtxTB/xL55nDEOIMp7g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=Pf6+iEWx; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="Pf6+iEWx" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1746522966; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=RanUlC3m67V8/d9vcVxV35xIkcuZaA6VEAbfrJ8XTQc=; b=Pf6+iEWxXiBCpbXhLHcO5g7c1fyDB0JI/znjC1Ago3CtgrxioMyWvhhtHLOk/UsUnUh0Eq SbZzNYLtkU39Glc7IvnUWCmjMOdXp68esRKXRZZFsP2rH81X8WaiMXeOsZX39sun+eN6Jp 2PbRh+t4ZJ21LSwTkAEMd+fcfyRbunI= Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-572-IGOxTVcwM0CTW-1RpOpUOA-1; Tue, 06 May 2025 05:16:05 -0400 X-MC-Unique: IGOxTVcwM0CTW-1RpOpUOA-1 X-Mimecast-MFC-AGG-ID: IGOxTVcwM0CTW-1RpOpUOA_1746522964 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 60B241955D8A; Tue, 6 May 2025 09:16:04 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.215]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id A7F48195608D; Tue, 6 May 2025 09:16:01 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Frederic Weisbecker , Thomas Gleixner , Waiman Long Cc: Gabriele Monaco Subject: [PATCH v4 1/5] timers: Rename tmigr 'online' bit to 'available' Date: Tue, 6 May 2025 11:15:36 +0200 Message-ID: <20250506091534.42117-8-gmonaco@redhat.com> In-Reply-To: <20250506091534.42117-7-gmonaco@redhat.com> References: <20250506091534.42117-7-gmonaco@redhat.com> 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 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 Content-Type: text/plain; charset="utf-8" The timer migration hierarchy excludes offline CPUs via the tmigr_is_not_available function, which is essentially checking the online bit for the CPU. Rename the online bit to available and all references in function names and tracepoint to generalise the concept of available CPUs. Signed-off-by: Gabriele Monaco --- include/trace/events/timer_migration.h | 4 ++-- kernel/time/timer_migration.c | 22 +++++++++++----------- kernel/time/timer_migration.h | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/include/trace/events/timer_migration.h b/include/trace/events/= timer_migration.h index 47db5eaf2f9a..61171b13c687 100644 --- a/include/trace/events/timer_migration.h +++ b/include/trace/events/timer_migration.h @@ -173,14 +173,14 @@ DEFINE_EVENT(tmigr_cpugroup, tmigr_cpu_active, TP_ARGS(tmc) ); =20 -DEFINE_EVENT(tmigr_cpugroup, tmigr_cpu_online, +DEFINE_EVENT(tmigr_cpugroup, tmigr_cpu_available, =20 TP_PROTO(struct tmigr_cpu *tmc), =20 TP_ARGS(tmc) ); =20 -DEFINE_EVENT(tmigr_cpugroup, tmigr_cpu_offline, +DEFINE_EVENT(tmigr_cpugroup, tmigr_cpu_unavailable, =20 TP_PROTO(struct tmigr_cpu *tmc), =20 diff --git a/kernel/time/timer_migration.c b/kernel/time/timer_migration.c index 2f6330831f08..7efd897c7959 100644 --- a/kernel/time/timer_migration.c +++ b/kernel/time/timer_migration.c @@ -427,7 +427,7 @@ static DEFINE_PER_CPU(struct tmigr_cpu, tmigr_cpu); =20 static inline bool tmigr_is_not_available(struct tmigr_cpu *tmc) { - return !(tmc->tmgroup && tmc->online); + return !(tmc->tmgroup && tmc->available); } =20 /* @@ -926,7 +926,7 @@ static void tmigr_handle_remote_cpu(unsigned int cpu, u= 64 now, * updated the event takes care when hierarchy is completely * idle. Otherwise the migrator does it as the event is enqueued. */ - if (!tmc->online || tmc->remote || tmc->cpuevt.ignore || + if (!tmc->available || tmc->remote || tmc->cpuevt.ignore || now < tmc->cpuevt.nextevt.expires) { raw_spin_unlock_irq(&tmc->lock); return; @@ -973,7 +973,7 @@ static void tmigr_handle_remote_cpu(unsigned int cpu, u= 64 now, * (See also section "Required event and timerqueue update after a * remote expiry" in the documentation at the top) */ - if (!tmc->online || !tmc->idle) { + if (!tmc->available || !tmc->idle) { timer_unlock_remote_bases(cpu); goto unlock; } @@ -1435,19 +1435,19 @@ static long tmigr_trigger_active(void *unused) { struct tmigr_cpu *tmc =3D this_cpu_ptr(&tmigr_cpu); =20 - WARN_ON_ONCE(!tmc->online || tmc->idle); + WARN_ON_ONCE(!tmc->available || tmc->idle); =20 return 0; } =20 -static int tmigr_cpu_offline(unsigned int cpu) +static int tmigr_cpu_unavailable(unsigned int cpu) { struct tmigr_cpu *tmc =3D this_cpu_ptr(&tmigr_cpu); int migrator; u64 firstexp; =20 raw_spin_lock_irq(&tmc->lock); - tmc->online =3D false; + tmc->available =3D false; WRITE_ONCE(tmc->wakeup, KTIME_MAX); =20 /* @@ -1455,7 +1455,7 @@ static int tmigr_cpu_offline(unsigned int cpu) * offline; Therefore nextevt value is set to KTIME_MAX */ firstexp =3D __tmigr_cpu_deactivate(tmc, KTIME_MAX); - trace_tmigr_cpu_offline(tmc); + trace_tmigr_cpu_unavailable(tmc); raw_spin_unlock_irq(&tmc->lock); =20 if (firstexp !=3D KTIME_MAX) { @@ -1466,7 +1466,7 @@ static int tmigr_cpu_offline(unsigned int cpu) return 0; } =20 -static int tmigr_cpu_online(unsigned int cpu) +static int tmigr_cpu_available(unsigned int cpu) { struct tmigr_cpu *tmc =3D this_cpu_ptr(&tmigr_cpu); =20 @@ -1475,11 +1475,11 @@ static int tmigr_cpu_online(unsigned int cpu) return -EINVAL; =20 raw_spin_lock_irq(&tmc->lock); - trace_tmigr_cpu_online(tmc); + trace_tmigr_cpu_available(tmc); tmc->idle =3D timer_base_is_idle(); if (!tmc->idle) __tmigr_cpu_activate(tmc); - tmc->online =3D true; + tmc->available =3D true; raw_spin_unlock_irq(&tmc->lock); return 0; } @@ -1850,7 +1850,7 @@ static int __init tmigr_init(void) goto err; =20 ret =3D cpuhp_setup_state(CPUHP_AP_TMIGR_ONLINE, "tmigr:online", - tmigr_cpu_online, tmigr_cpu_offline); + tmigr_cpu_available, tmigr_cpu_unavailable); if (ret) goto err; =20 diff --git a/kernel/time/timer_migration.h b/kernel/time/timer_migration.h index ae19f70f8170..70879cde6fdd 100644 --- a/kernel/time/timer_migration.h +++ b/kernel/time/timer_migration.h @@ -97,7 +97,7 @@ struct tmigr_group { */ struct tmigr_cpu { raw_spinlock_t lock; - bool online; + bool available; bool idle; bool remote; struct tmigr_group *tmgroup; --=20 2.49.0 From nobody Tue Dec 16 15:27:54 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (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 E93D5275117 for ; Tue, 6 May 2025 09:16:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746522974; cv=none; b=GDXKa4b8W4aPC1+Vq2hq1+YrXPPe0RksbTFpxjfp/ZoIpClTFtOmFCnIky+WeSke7/PsrKPG4aHhvSQnKBZwd1I1soK/ytSny+vWV57gX4S47vEUsBjvx2gVH/0LN7XC4MeQ+fgL2OiOc/CpJnSwc9VVfjUYSff9F7ogdkz0mcg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746522974; c=relaxed/simple; bh=oJfC6o5m5P1YisWX5sseAY5o4KMr7ZyiAPQCb8q6T/E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=J/KOL9E012GFogEx7kudoCoQ0mXu17tvAcDM/jsU6ZJbpsxt/OZZQl4itpDilA68SYD6j9YuQ6/N7n0fbq840Yrt2OsTAfj/psp3FtAObJ1fHlFii+wkeY8J0Q4Jl37ConENGbN63g5/r1WIaGwkwrIBZafeyUKBRLSdrhe9VQc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=BodVSFxD; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="BodVSFxD" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1746522971; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=7DBUr7Tsi3ZK47KS1wKN6MpKnbFEHSyvqrNjk76TULQ=; b=BodVSFxDO2BcqOeUENxmW4rIEGTiJm6NPzA4CdZJTeYDc0AF3TSHul/QVQ7GyEwopwey7U K/Gra/3qQkqh+CkxkDvoEFT3fTSvEPUz1jbd5E3ybb+pIRkEL6Zm7xXBWHk7y/aAmNpBdp tst/JLVuWg52DqBANKIYjrpYG5XSatQ= Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-77-e9arhCnKMR2XeuG8ldztWw-1; Tue, 06 May 2025 05:16:08 -0400 X-MC-Unique: e9arhCnKMR2XeuG8ldztWw-1 X-Mimecast-MFC-AGG-ID: e9arhCnKMR2XeuG8ldztWw_1746522967 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id CFC04180099A; Tue, 6 May 2025 09:16:07 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.215]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 2CF361956096; Tue, 6 May 2025 09:16:04 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Frederic Weisbecker , Thomas Gleixner , Waiman Long Cc: Gabriele Monaco Subject: [PATCH v4 2/5] timers: Add the available mask in timer migration Date: Tue, 6 May 2025 11:15:37 +0200 Message-ID: <20250506091534.42117-9-gmonaco@redhat.com> In-Reply-To: <20250506091534.42117-7-gmonaco@redhat.com> References: <20250506091534.42117-7-gmonaco@redhat.com> 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 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 Content-Type: text/plain; charset="utf-8" Keep track of the CPUs available for timer migration in a cpumask. This prepares the ground to generalise the concept of unavailable CPUs. Signed-off-by: Gabriele Monaco --- kernel/time/timer_migration.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/kernel/time/timer_migration.c b/kernel/time/timer_migration.c index 7efd897c7959..25439f961ccf 100644 --- a/kernel/time/timer_migration.c +++ b/kernel/time/timer_migration.c @@ -422,6 +422,9 @@ static unsigned int tmigr_crossnode_level __read_mostly; =20 static DEFINE_PER_CPU(struct tmigr_cpu, tmigr_cpu); =20 +/* CPUs available for timer migration */ +static cpumask_var_t tmigr_available_cpumask; + #define TMIGR_NONE 0xFF #define BIT_CNT 8 =20 @@ -1449,6 +1452,7 @@ static int tmigr_cpu_unavailable(unsigned int cpu) raw_spin_lock_irq(&tmc->lock); tmc->available =3D false; WRITE_ONCE(tmc->wakeup, KTIME_MAX); + cpumask_clear_cpu(cpu, tmigr_available_cpumask); =20 /* * CPU has to handle the local events on his own, when on the way to @@ -1459,7 +1463,7 @@ static int tmigr_cpu_unavailable(unsigned int cpu) raw_spin_unlock_irq(&tmc->lock); =20 if (firstexp !=3D KTIME_MAX) { - migrator =3D cpumask_any_but(cpu_online_mask, cpu); + migrator =3D cpumask_any(tmigr_available_cpumask); work_on_cpu(migrator, tmigr_trigger_active, NULL); } =20 @@ -1480,6 +1484,7 @@ static int tmigr_cpu_available(unsigned int cpu) if (!tmc->idle) __tmigr_cpu_activate(tmc); tmc->available =3D true; + cpumask_set_cpu(cpu, tmigr_available_cpumask); raw_spin_unlock_irq(&tmc->lock); return 0; } @@ -1801,6 +1806,11 @@ static int __init tmigr_init(void) if (ncpus =3D=3D 1) return 0; =20 + if (!zalloc_cpumask_var(&tmigr_available_cpumask, GFP_KERNEL)) { + ret =3D -ENOMEM; + goto err; + } + /* * Calculate the required hierarchy levels. Unfortunately there is no * reliable information available, unless all possible CPUs have been --=20 2.49.0 From nobody Tue Dec 16 15:27:54 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 0AF3627703B for ; Tue, 6 May 2025 09:16:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746522977; cv=none; b=Fo2uGM85e8Ubkbe9/G4OmEfC1e0Yxwbt7xgWOcoC3doGcQVXizdwEx+r8bMqPDmwTJaGvSWNrimDa1r8pLkb6pAlC1EC/OsR//I7HnCjRiHcV9i6Uyi4k/Uz/zfV3GWzjOIrmQfsfDB6DnF1YLzs1cRhFqE8tgJWw9k+3W1qrUU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746522977; c=relaxed/simple; bh=5uWZ+x1hH7lTxGEdVf/oIHzPhkMz871Ffr5aBhd/dz8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tDWjllIWoxe87302nTMG30N4TN4/juA3SOpc66vtBWEarYk3HBgMf+wE8ZFGgz4U4XDm9OnHu/dppJZ1DRUaVjChU26/bnp3GwZBfkzJGQXAIgSLaNMge+z1Wn3tywYKsViQw+9a6zhhEOoNNCOmWdH42ZKS//4GP/lSd5dwz2M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=h7lnRRwA; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="h7lnRRwA" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1746522975; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=i8Gdzo0iVH31s/N1EJyjEB2OOAhhJQcvZlvoKrINrU0=; b=h7lnRRwASx2Y0XT4ByUX3ttIyAjhFTWzhFSJReISGpN6Dw6BZSdTYDpIoT5ufQ/ztC/spo slUkYU8Uxx9UGwEZawd7IFaLvsXlJzT6k83XoGqQjG7zweOTAtsahU1KuSM5wN9XzdV5eD yVWNzFz7BC9hmWlCIzpNy7kxJuDFZ4g= Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-198-UCOMKecBMgumUm-Gou2Kvw-1; Tue, 06 May 2025 05:16:11 -0400 X-MC-Unique: UCOMKecBMgumUm-Gou2Kvw-1 X-Mimecast-MFC-AGG-ID: UCOMKecBMgumUm-Gou2Kvw_1746522970 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id B20E41955D4E; Tue, 6 May 2025 09:16:10 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.215]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 6DDC4195608D; Tue, 6 May 2025 09:16:08 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Frederic Weisbecker , Thomas Gleixner , Waiman Long Cc: Gabriele Monaco Subject: [PATCH v4 3/5] cgroup/cpuset: Rename update_unbound_workqueue_cpumask to update_exclusion_cpumasks Date: Tue, 6 May 2025 11:15:38 +0200 Message-ID: <20250506091534.42117-10-gmonaco@redhat.com> In-Reply-To: <20250506091534.42117-7-gmonaco@redhat.com> References: <20250506091534.42117-7-gmonaco@redhat.com> 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 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 Content-Type: text/plain; charset="utf-8" The function calls the workqueue_unbound_exclude_cpumask function when there's a change in isolated CPUs. The function can be used for other subsystems requiring updated when isolated CPUs change. Generalise the name to update_exclusion_cpumasks to prepare for other functions unrelated to workqueues to be called in that spot. Signed-off-by: Gabriele Monaco --- kernel/cgroup/cpuset.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index 306b60430091..95316d39c282 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -1323,7 +1323,7 @@ static bool partition_xcpus_del(int old_prs, struct c= puset *parent, return isolcpus_updated; } =20 -static void update_unbound_workqueue_cpumask(bool isolcpus_updated) +static void update_exclusion_cpumasks(bool isolcpus_updated) { int ret; =20 @@ -1454,7 +1454,7 @@ static int remote_partition_enable(struct cpuset *cs,= int new_prs, list_add(&cs->remote_sibling, &remote_children); cpumask_copy(cs->effective_xcpus, tmp->new_cpus); spin_unlock_irq(&callback_lock); - update_unbound_workqueue_cpumask(isolcpus_updated); + update_exclusion_cpumasks(isolcpus_updated); cpuset_force_rebuild(); cs->prs_err =3D 0; =20 @@ -1495,7 +1495,7 @@ static void remote_partition_disable(struct cpuset *c= s, struct tmpmasks *tmp) compute_effective_exclusive_cpumask(cs, NULL, NULL); reset_partition_data(cs); spin_unlock_irq(&callback_lock); - update_unbound_workqueue_cpumask(isolcpus_updated); + update_exclusion_cpumasks(isolcpus_updated); cpuset_force_rebuild(); =20 /* @@ -1563,7 +1563,7 @@ static void remote_cpus_update(struct cpuset *cs, str= uct cpumask *xcpus, if (xcpus) cpumask_copy(cs->exclusive_cpus, xcpus); spin_unlock_irq(&callback_lock); - update_unbound_workqueue_cpumask(isolcpus_updated); + update_exclusion_cpumasks(isolcpus_updated); if (adding || deleting) cpuset_force_rebuild(); =20 @@ -1906,7 +1906,7 @@ static int update_parent_effective_cpumask(struct cpu= set *cs, int cmd, WARN_ON_ONCE(parent->nr_subparts < 0); } spin_unlock_irq(&callback_lock); - update_unbound_workqueue_cpumask(isolcpus_updated); + update_exclusion_cpumasks(isolcpus_updated); =20 if ((old_prs !=3D new_prs) && (cmd =3D=3D partcmd_update)) update_partition_exclusive_flag(cs, new_prs); @@ -2931,7 +2931,7 @@ static int update_prstate(struct cpuset *cs, int new_= prs) else if (isolcpus_updated) isolated_cpus_update(old_prs, new_prs, cs->effective_xcpus); spin_unlock_irq(&callback_lock); - update_unbound_workqueue_cpumask(isolcpus_updated); + update_exclusion_cpumasks(isolcpus_updated); =20 /* Force update if switching back to member & update effective_xcpus */ update_cpumasks_hier(cs, &tmpmask, !new_prs); --=20 2.49.0 From nobody Tue Dec 16 15:27:54 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (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 3AEE927817A for ; Tue, 6 May 2025 09:16:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746522981; cv=none; b=gnrgTf8h3VYYwoEUSD1sH6tSfdbOgefMB0hEHQ+B4W962+3UiK6wHXTzz4jhORmsVb01nRRPNhbO4wBkpvWxLljeOxvc6XX6Gt5Wuzxjxbkv5cM4QP7T5Dl5rLnFJK4Vmh1hJkR8TGFvew1xTVNj1LTSB816lHAIAOfP/OneMmk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746522981; c=relaxed/simple; bh=d7e4SY3eBR4nbUQC7DkP59mThg+oNjjxuxhDS9pJDuU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RDjlLOfp0H8LkqaXPsidmqKyS0wGuhBbB7VRFJZ9Xj2kE5W4KQzjtbrSgFTwIO7tGfkacqO5UHxoVlXKoodrPdLVA55cFxZUv/IT1WsLZgUiHCqqis/6Ryjorzv8VyKDqK6ihZN0SmnuFQt8rVIyDDTD1kG3qALLdpL2vJ9SlU8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=BpA/4tqJ; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="BpA/4tqJ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1746522976; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=hzGfxZzb+LEZ7cGAFGG9fsxDMPaEkbSDyL6czA2CMzY=; b=BpA/4tqJJZxVyXqNjY4b+0yXPrJdElk3GmaIiwuBxgtzsqozU8OiJFMaCSnt3A4zpuv2rR ekxWRBaMkk7IjCmRT0SgfzQ3NFdt3pr+emlZXcEQqLUSy7yPAQD4556nVfUbQjDtllQ1uZ iFClCdOO3+8PHPiYWZdDk1PTnBWX17I= Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-549--9YHFMNHMoiM8zn7pO3WDA-1; Tue, 06 May 2025 05:16:14 -0400 X-MC-Unique: -9YHFMNHMoiM8zn7pO3WDA-1 X-Mimecast-MFC-AGG-ID: -9YHFMNHMoiM8zn7pO3WDA_1746522974 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id DBEE4195607B; Tue, 6 May 2025 09:16:13 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.215]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 65921195608D; Tue, 6 May 2025 09:16:11 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Frederic Weisbecker , Thomas Gleixner , Waiman Long Cc: Gabriele Monaco Subject: [PATCH v4 4/5] timers: Add timer_base_remote_is_idle to query from remote cpus Date: Tue, 6 May 2025 11:15:39 +0200 Message-ID: <20250506091534.42117-11-gmonaco@redhat.com> In-Reply-To: <20250506091534.42117-7-gmonaco@redhat.com> References: <20250506091534.42117-7-gmonaco@redhat.com> 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 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 Content-Type: text/plain; charset="utf-8" The function timer_base_is_idle allows to query if the current CPU's timer base is set to idle. There's currently no way to get the same information for a remote CPU. Add timer_base_remote_is_idle that given a CPU number returns the timer base idle state of that CPU. Signed-off-by: Gabriele Monaco --- kernel/time/tick-internal.h | 1 + kernel/time/timer.c | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/kernel/time/tick-internal.h b/kernel/time/tick-internal.h index faac36de35b9..75580f7c69c6 100644 --- a/kernel/time/tick-internal.h +++ b/kernel/time/tick-internal.h @@ -167,6 +167,7 @@ extern void fetch_next_timer_interrupt_remote(unsigned = long basej, u64 basem, extern void timer_lock_remote_bases(unsigned int cpu); extern void timer_unlock_remote_bases(unsigned int cpu); extern bool timer_base_is_idle(void); +extern bool timer_base_remote_is_idle(unsigned int cpu); extern void timer_expire_remote(unsigned int cpu); # endif #else /* CONFIG_NO_HZ_COMMON */ diff --git a/kernel/time/timer.c b/kernel/time/timer.c index 4d915c0a263c..f7fbd3b3cb83 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c @@ -2162,6 +2162,17 @@ bool timer_base_is_idle(void) return __this_cpu_read(timer_bases[BASE_LOCAL].is_idle); } =20 +/** + * timer_base_remote_is_idle() - Return whether timer base is set idle for= cpu + * @cpu: Remote CPU + * + * Returns value of local timer base is_idle value for remote cpu. + */ +bool timer_base_remote_is_idle(unsigned int cpu) +{ + return per_cpu(timer_bases[BASE_LOCAL].is_idle, cpu); +} + static void __run_timer_base(struct timer_base *base); =20 /** --=20 2.49.0 From nobody Tue Dec 16 15:27:54 2025 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (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 EA33227874E for ; Tue, 6 May 2025 09:16:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746522985; cv=none; b=jMhFoQYQvF5i4VoOoxzV/jr+tUF6/Xxw9BDyytWqCcVfsRloQOam6SMVBAVd+yqu+JEGzNvRHMSjqmtOegbFLvvofU1sVVKVFGP3xXC39/+UHt6uEPRSX5iEEbF+umZB6CUE5NqJuZvgHPHPFxE+Jb5EkJ7XtQfT/xjXrcHfC6A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746522985; c=relaxed/simple; bh=SZu+/855vKDCouCnGeIRy0RLbJjvnek5SuoGEKsiXhU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q+WMf0hh7tcVU0uRe4X8V8QfYV80DeTvvIaQgqzNKxQ4ZUK8FPTh4rWUXA9tFivdUVYhT+OWQ/v6yfGWUpmM+Twy+4t9wC2CEK6NDPvYZO9J75vPPZs3xRBJcP7qiXo07uHsktwuQa7KBF0xaMzhL64xGHmIusiw+d8cL9mDjMg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=OuW8ltnI; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="OuW8ltnI" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1746522981; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PMJP+h90KvE0FJ+WMXj9tnu2kwwxuQ8mi50pBzYQBp0=; b=OuW8ltnIYWx4B6RNqXJ81kccxAkM2RNXkF2Its00U8b/gYCAyTQbs3vYQj9dDiYl+q3myN PO5ZK9GVjKZZ8HLA59zFGDSON3GwU1mvm01r2PTL7nTL9+LIWK61Tl+1eZIUK2AVeisx4E zYjsKUG8IXbI+Bq/6DitUxmpN1/0eLk= Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-589-54tXezIZNGW7ZzY7Qo_aPg-1; Tue, 06 May 2025 05:16:19 -0400 X-MC-Unique: 54tXezIZNGW7ZzY7Qo_aPg-1 X-Mimecast-MFC-AGG-ID: 54tXezIZNGW7ZzY7Qo_aPg_1746522977 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 8EF911801A19; Tue, 6 May 2025 09:16:17 +0000 (UTC) Received: from gmonaco-thinkpadt14gen3.rmtit.com (unknown [10.45.224.215]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id A9500195608D; Tue, 6 May 2025 09:16:14 +0000 (UTC) From: Gabriele Monaco To: linux-kernel@vger.kernel.org, Frederic Weisbecker , Thomas Gleixner , Waiman Long Cc: Gabriele Monaco Subject: [PATCH v4 5/5] timers: Exclude isolated cpus from timer migation Date: Tue, 6 May 2025 11:15:40 +0200 Message-ID: <20250506091534.42117-12-gmonaco@redhat.com> In-Reply-To: <20250506091534.42117-7-gmonaco@redhat.com> References: <20250506091534.42117-7-gmonaco@redhat.com> 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 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 Content-Type: text/plain; charset="utf-8" The timer migration mechanism allows active CPUs to pull timers from idle ones to improve the overall idle time. This is however undesired when CPU intensive workloads run on isolated cores, as the algorithm would move the timers from housekeeping to isolated cores, negatively affecting the isolation. This effect was noticed on a 128 cores machine running oslat on the isolated cores (1-31,33-63,65-95,97-127). The tool monopolises CPUs, and the CPU with lowest count in a timer migration hierarchy (here 1 and 65) appears as always active and continuously pulls global timers, from the housekeeping CPUs. This ends up moving driver work (e.g. delayed work) to isolated CPUs and causes latency spikes: before the change: # oslat -c 1-31,33-63,65-95,97-127 -D 62s ... Maximum: 1203 10 3 4 ... 5 (us) after the change: # oslat -c 1-31,33-63,65-95,97-127 -D 62s ... Maximum: 10 4 3 4 3 ... 5 (us) Exclude isolated cores from the timer migration algorithm, extend the concept of unavailable cores, currently used for offline ones, to isolated ones: * A core is unavailable if isolated or offline; * A core is available if isolated and offline; A core is considered unavailable as idle if: * is in the isolcpus list * is in the nohz_full list * is in an isolated cpuset Due to how the timer migration algorithm works, any CPU part of the hierarchy can have their global timers pulled by remote CPUs and have to pull remote timers, only skipping pulling remote timers would break the logic. For this reason, we prevent isolated CPUs from pulling remote global timers, but also the other way around: any global timer started on an isolated CPU will run there. This does not break the concept of isolation (global timers don't come from outside the CPU) and, if considered inappropriate, can usually be mitigated with other isolation techniques (e.g. IRQ pinning). Signed-off-by: Gabriele Monaco --- include/linux/timer.h | 6 ++++++ kernel/cgroup/cpuset.c | 2 ++ kernel/time/timer_migration.c | 31 ++++++++++++++++++++++++++++--- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/include/linux/timer.h b/include/linux/timer.h index 10596d7c3a34..4722e075d984 100644 --- a/include/linux/timer.h +++ b/include/linux/timer.h @@ -190,4 +190,10 @@ int timers_dead_cpu(unsigned int cpu); #define timers_dead_cpu NULL #endif =20 +#if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ_COMMON) +extern void tmigr_isolated_exclude_cpumask(cpumask_var_t exclude_cpumask); +#else +static inline void tmigr_isolated_exclude_cpumask(cpumask_var_t exclude_cp= umask) { } +#endif + #endif diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index 95316d39c282..866b4b818811 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -1334,6 +1334,8 @@ static void update_exclusion_cpumasks(bool isolcpus_u= pdated) =20 ret =3D workqueue_unbound_exclude_cpumask(isolated_cpus); WARN_ON_ONCE(ret < 0); + + tmigr_isolated_exclude_cpumask(isolated_cpus); } =20 /** diff --git a/kernel/time/timer_migration.c b/kernel/time/timer_migration.c index 25439f961ccf..e4b394d78a8d 100644 --- a/kernel/time/timer_migration.c +++ b/kernel/time/timer_migration.c @@ -10,6 +10,7 @@ #include #include #include +#include =20 #include "timer_migration.h" #include "tick-internal.h" @@ -1445,7 +1446,7 @@ static long tmigr_trigger_active(void *unused) =20 static int tmigr_cpu_unavailable(unsigned int cpu) { - struct tmigr_cpu *tmc =3D this_cpu_ptr(&tmigr_cpu); + struct tmigr_cpu *tmc =3D per_cpu_ptr(&tmigr_cpu, cpu); int migrator; u64 firstexp; =20 @@ -1472,15 +1473,24 @@ static int tmigr_cpu_unavailable(unsigned int cpu) =20 static int tmigr_cpu_available(unsigned int cpu) { - struct tmigr_cpu *tmc =3D this_cpu_ptr(&tmigr_cpu); + struct tmigr_cpu *tmc =3D per_cpu_ptr(&tmigr_cpu, cpu); =20 /* Check whether CPU data was successfully initialized */ if (WARN_ON_ONCE(!tmc->tmgroup)) return -EINVAL; =20 + /* + * Isolated CPUs don't participate in timer migration. + * Checking here guarantees that CPUs isolated at boot (e.g. isolcpus) + * are not marked as available when they first become online. + * During runtime, any offline isolated CPU is also not incorrectly + * marked as available once it gets back online. + */ + if (cpu_is_isolated(cpu)) + return 0; raw_spin_lock_irq(&tmc->lock); trace_tmigr_cpu_available(tmc); - tmc->idle =3D timer_base_is_idle(); + tmc->idle =3D timer_base_remote_is_idle(cpu); if (!tmc->idle) __tmigr_cpu_activate(tmc); tmc->available =3D true; @@ -1489,6 +1499,21 @@ static int tmigr_cpu_available(unsigned int cpu) return 0; } =20 +void tmigr_isolated_exclude_cpumask(cpumask_var_t exclude_cpumask) +{ + int cpu; + + lockdep_assert_cpus_held(); + + for_each_cpu_and(cpu, exclude_cpumask, tmigr_available_cpumask) + tmigr_cpu_unavailable(cpu); + + for_each_cpu_andnot(cpu, cpu_online_mask, exclude_cpumask) { + if (!cpumask_test_cpu(cpu, tmigr_available_cpumask)) + tmigr_cpu_available(cpu); + } +} + static void tmigr_init_group(struct tmigr_group *group, unsigned int lvl, int node) { --=20 2.49.0