From nobody Mon Feb 9 00:04:59 2026 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (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 E7D1B16E885 for ; Fri, 21 Jun 2024 09:37:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718962677; cv=none; b=Oviyti85olzr67AJdxjQe+T3z2xWTVYEeg1tXYiqM0I2n245wMyu7/RGrzdJkIMzGWrFE+3bHkMn+OUFDbRyUeAss8gQ777T4FWa7NlzHwn+1DR3VkhK80rAZiqgIvKITwmWlDwklJvzq4o/TxOhZ4kLvqnOJClDeWKrOJprazc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718962677; c=relaxed/simple; bh=NdpY6Y968D6lDTyF25zr8X8Xnv4Bt0kqMFWlhamaolY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=slbxPZVvsLevKghNzhDHaiQFqh7zuf2cLiCWmE/YxUka0yRzvaZZOaAyLRgWwlkDm+dgGPpnacbLJAKQkWCMAQmgNn6QAxarVT930EfNsIjx7bYyy2Q46GytY4IHMaBTVm0H7o46cB+e0W+/8/s058X9EYcbBH4rMUi38OrXf2U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=ZsZpB8Ef; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=/q3KKE9D; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="ZsZpB8Ef"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="/q3KKE9D" From: Anna-Maria Behnsen DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1718962674; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=1XYA2gxPP8gXiPiESdv8zBi94vK/dZ95nSLvONfoEUs=; b=ZsZpB8Ef4Gr9ct0FwTlyA+RNwV8lOlbg3ajGxP7QWpblZWCkHQ4IeRMaU5X6efxPgF40ir oBQ7OHXgf88GGEze4n4fkzt6IpGkk8gbLsfd4zGRiGc1/1jtfP9vC+0vXGOvAGgrwJh7fX HQ5s89akSkm6LDjDnNS5o9qVjJCgT19Q8jOF6zFphET4TjfPrmwA79IyCKtL77FpCiIWVX shXOfhx98gt7oViWFefyMREtuvJdLF4TT1Qn4CyTNLCmi2ucWfoeb7Sza602YbSEIpscnA QpzC8bu/Hz4Ljg3NEWpToweeSLvjbh1EwiMSM97wwnudE/RE3KUe4aMCP/RILg== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1718962674; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=1XYA2gxPP8gXiPiESdv8zBi94vK/dZ95nSLvONfoEUs=; b=/q3KKE9Du5MBdf0gzdaT+VRlS+u0gX+fInMP2NyZoqPQrpSxuB/GRjPu0gL8ssk71Zrz4x 9ilHcD0yysLjllCA== Date: Fri, 21 Jun 2024 11:37:06 +0200 Subject: [PATCH 1/3] timer_migration: Do not rely always on group->parent 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 Message-Id: <20240621-tmigr-fixes-v1-1-8c8a2d8e8d77@linutronix.de> References: <20240621-tmigr-fixes-v1-0-8c8a2d8e8d77@linutronix.de> In-Reply-To: <20240621-tmigr-fixes-v1-0-8c8a2d8e8d77@linutronix.de> To: Frederic Weisbecker , Thomas Gleixner , linux-kernel@vger.kernel.org Cc: Borislav Petkov , Anna-Maria Behnsen , Narasimhan V When reading group->parent without holding the group lock it is racy against CPUs coming online the first time and thereby creating another level of the hierarchy. This is not a problem when this value is read once to decide whether to abort a propagation or not. The worst outcome is an unnecessary/early CPU wake up. But it is racy when reading it several times during a single 'action' (like activation, deactivation, checking for remote timer expiry,...) and relying on the consitency of this value without holding the lock. This happens at the moment e.g. in tmigr_inactive_up() which is also calling tmigr_udpate_events(). Code relys on group->parent not to change during this 'action'. Update parent struct member description to explain the above only once. Remove parent pointer checks when they are not mandatory (like update of data->childmask). Remove a warning, which would be nice but the trigger of this warning is not reliable and add expand the data structure member description instead. Expand a comment, why it is safe to rely on parent pointer here (inside hierarchy update). Fixes: 7ee988770326 ("timers: Implement the hierarchical pull model") Reported-by: Borislav Petkov Signed-off-by: Anna-Maria Behnsen Cc: Narasimhan V --- kernel/time/timer_migration.c | 33 +++++++++++++++------------------ kernel/time/timer_migration.h | 12 +++++++++++- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/kernel/time/timer_migration.c b/kernel/time/timer_migration.c index 84413114db5c..d91efe1dc3bf 100644 --- a/kernel/time/timer_migration.c +++ b/kernel/time/timer_migration.c @@ -507,7 +507,14 @@ static void walk_groups(up_f up, void *data, struct tm= igr_cpu *tmc) * (get_next_timer_interrupt()) * @firstexp: Contains the first event expiry information when last * active CPU of hierarchy is on the way to idle to make - * sure CPU will be back in time. + * sure CPU will be back in time. It is updated in top + * level group only. Be aware, there could occur a new top + * level of the hierarchy between the 'top level call' in + * tmigr_update_events() and the check for the parent group + * in walk_groups(). Then @firstexp might contain a value + * !=3D KTIME_MAX even if it was not the final top + * level. This is not a problem, as the worst outcome is a + * CPU which might wake up a little early. * @evt: Pointer to tmigr_event which needs to be queued (of idle * child group) * @childmask: childmask of child group @@ -649,7 +656,7 @@ static bool tmigr_active_up(struct tmigr_group *group, =20 } while (!atomic_try_cmpxchg(&group->migr_state, &curstate.state, newstat= e.state)); =20 - if ((walk_done =3D=3D false) && group->parent) + if (walk_done =3D=3D false) data->childmask =3D group->childmask; =20 /* @@ -1317,20 +1324,9 @@ static bool tmigr_inactive_up(struct tmigr_group *gr= oup, /* Event Handling */ tmigr_update_events(group, child, data); =20 - if (group->parent && (walk_done =3D=3D false)) + if (walk_done =3D=3D false) data->childmask =3D group->childmask; =20 - /* - * data->firstexp was set by tmigr_update_events() and contains the - * expiry of the first global event which needs to be handled. It - * differs from KTIME_MAX if: - * - group is the top level group and - * - group is idle (which means CPU was the last active CPU in the - * hierarchy) and - * - there is a pending event in the hierarchy - */ - WARN_ON_ONCE(data->firstexp !=3D KTIME_MAX && group->parent); - trace_tmigr_group_set_cpu_inactive(group, newstate, childmask); =20 return walk_done; @@ -1552,10 +1548,11 @@ static void tmigr_connect_child_parent(struct tmigr= _group *child, data.childmask =3D child->childmask; =20 /* - * There is only one new level per time. When connecting the - * child and the parent and set the child active when the parent - * is inactive, the parent needs to be the uppermost - * level. Otherwise there went something wrong! + * There is only one new level per time (which is protected by + * tmigr_mutex). When connecting the child and the parent and + * set the child active when the parent is inactive, the parent + * needs to be the uppermost level. Otherwise there went + * something wrong! */ WARN_ON(!tmigr_active_up(parent, child, &data) && parent->parent); } diff --git a/kernel/time/timer_migration.h b/kernel/time/timer_migration.h index 6c37d94a37d9..494f68cc13f4 100644 --- a/kernel/time/timer_migration.h +++ b/kernel/time/timer_migration.h @@ -22,7 +22,17 @@ struct tmigr_event { * struct tmigr_group - timer migration hierarchy group * @lock: Lock protecting the event information and group hierarchy * information during setup - * @parent: Pointer to the parent group + * @parent: Pointer to the parent group. Pointer is updated when a + * new hierarchy level is added because of a CPU coming + * online the first time. Once it is set, the pointer will + * not be removed or updated. When accessing parent pointer + * lock less to decide whether to abort a propagation or + * not, it is not a problem. The worst outcome is an + * unnecessary/early CPU wake up. But do not access parent + * pointer several times in the same 'action' (like + * activation, deactivation, check for remote expiry,...) + * without holding the lock as it is not ensured that value + * will not change. * @groupevt: Next event of the group which is only used when the * group is !active. The group event is then queued into * the parent timer queue. --=20 2.39.2 From nobody Mon Feb 9 00:04:59 2026 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (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 4FD2716E887 for ; Fri, 21 Jun 2024 09:37:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718962677; cv=none; b=rnfVHD4iu+XJU+O/JxD5hnSsew1vUiTsb4vCpLvdXjrrEVuIb8Sx/8+a7jPqMWczPbsFBL0UPSV0jc46XgCq+c+twmrSSvjdVtlUxOpKNpdNII5YyNZPgMm1//0w99SvUZ5dsuCH6qQif/3Kjg6qbtwVy8h4k/Niac3zTvHg6V4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718962677; c=relaxed/simple; bh=/GHidRAy3Vri5PVWO70pWsVO1oukzsSFzBKorCXDvts=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EQZmXLehoJZvG0Zi70FJOjcojsSfb/a5SOU7N/zCw0XwrMhByRR+tLh+gQrcoMI872B2Qebfqza3igRl1/zF4lKhXEng3VM/VMRJ8BGfAekWnAGllSxF8svWLFHcQ31M4yBcua51xyCEWaEZqncYpDzOFPVrN7GW+ojYi4sD9go= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=wKgtLhzP; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=5Uzt/xsp; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="wKgtLhzP"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="5Uzt/xsp" From: Anna-Maria Behnsen DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1718962674; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+StE62xb2HG77ARJrlDkRwiDs6UDMTFPfx8HvR0X4XU=; b=wKgtLhzPZLrfk0EB9bF2pJ9y1DQnSEpS67QUIuPFl2pruogj37qfFSj9RQgsgQxT5/7Vqy Xu8uoOaJOK3KwVtNnFEF2PEkevIFyMNs5I/z9yBm1CX+ye1cNt/gR1W/Wbc9HVTy/1XEE9 epPBd7ne5eoS6RjKydZaHQcJaLh9tM+pYtCyLYidcIErQsduRjaov2F4TCYJC/Mp/T9EIy omvUboPaYXD7uTIGjHYabywQS4TNHj72adCRGtEl59MjwuEWWYkqgBvVltxI22JzSnF77m KQJuhyiv0Uwz1OAcFhd7XMpquDXFUZpQS164h7iEVS64HslepLAvvT0Kt0iVkw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1718962674; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+StE62xb2HG77ARJrlDkRwiDs6UDMTFPfx8HvR0X4XU=; b=5Uzt/xspo/8RusQBBGIUxSD7BOIKspYrdKnThzuTU5Xmk44beody6haC5VV19tHzGDQJMr 4vg7ou1Z0OfVdUBA== Date: Fri, 21 Jun 2024 11:37:07 +0200 Subject: [PATCH 2/3] timer_migration: Spare write when nothing changed 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 Message-Id: <20240621-tmigr-fixes-v1-2-8c8a2d8e8d77@linutronix.de> References: <20240621-tmigr-fixes-v1-0-8c8a2d8e8d77@linutronix.de> In-Reply-To: <20240621-tmigr-fixes-v1-0-8c8a2d8e8d77@linutronix.de> To: Frederic Weisbecker , Thomas Gleixner , linux-kernel@vger.kernel.org Cc: Anna-Maria Behnsen The wakeup value is written unconditionally in tmigr_cpu_new_timer(). When there was no new next timer expiry that needs to be propagated, then the value that was read before is written. This is not required. Move write to the place where wakeup value could have changed. Signed-off-by: Anna-Maria Behnsen --- kernel/time/timer_migration.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/kernel/time/timer_migration.c b/kernel/time/timer_migration.c index d91efe1dc3bf..f55be5411ad9 100644 --- a/kernel/time/timer_migration.c +++ b/kernel/time/timer_migration.c @@ -1237,14 +1237,13 @@ u64 tmigr_cpu_new_timer(u64 nextexp) if (nextexp !=3D tmc->cpuevt.nextevt.expires || tmc->cpuevt.ignore) { ret =3D tmigr_new_timer(tmc, nextexp); + /* + * Make sure the reevaluation of timers in idle path + * will not miss an event. + */ + WRITE_ONCE(tmc->wakeup, ret); } } - /* - * Make sure the reevaluation of timers in idle path will not miss an - * event. - */ - WRITE_ONCE(tmc->wakeup, ret); - trace_tmigr_cpu_new_timer_idle(tmc, nextexp); raw_spin_unlock(&tmc->lock); return ret; --=20 2.39.2 From nobody Mon Feb 9 00:04:59 2026 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (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 8938816E88C for ; Fri, 21 Jun 2024 09:37:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718962677; cv=none; b=Ss1JfLE9RhYo+XBLO4WUk/qsSxFce9ewHxagVT09LXYQ6XixfvnBCmIjjyiRlv9JM5dMmC9/bodTTqnqqh/qVl1uGeofki8STHcR96AVVjo5UpSyErw/wI/cyHAhWwkLT6O6Jf7dCeBrUlwW3SNkwcJGWmQV28sbhT91XRNDQOE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718962677; c=relaxed/simple; bh=PwYyFHQ4kiQ6SlbBfOlHQ9Tq9MamRHEQ978yb3m+p7I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=N64NjlfwvHSRadqfXMIRv67VjE2CBk3tPTzalZa1bUBn+lyHpyqcH16REB2fxWYjfFs28avzVkHdizJZQfWiYvH764ZxQ3izTsPVI7UysXys0e4ddO80is/8GTa9VX/1GBiCxIZU9vazsbLEVefF+ezbR6bWjsdAMG4bmAJTJhc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=Syf8++Sj; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=mWT3iKI5; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="Syf8++Sj"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="mWT3iKI5" From: Anna-Maria Behnsen DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1718962674; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kFB1tC9CT9g0HRd6KCO32Pre0A+EA4ekFX5x5x/JyAo=; b=Syf8++SjACZ7evxx6WsyucNANQ8MUwLdzXzek3g9+CNCI3556Gn/ujUTjOpOtYH4ZZ9dUi m2ym/6o0XbNc+ZoesLFJxjLg8RPcQxvcj28XiAG1Su/5ovqyA68sBUMgEDnoems+FoNxSu +V688d87cZKVIJNzmh2XGMm3G2dsyFWo/XpPGj6W1qZgW5E1jDxZNHL/6vfWhGJ1XEb9qP wcT8IZS0Qt3OpZj3G8SbCeJeLiXVHGb6qb3dmJBVpL4rim59H/hD3IxM3PBsWMZFt0NsP/ OdmgwrpBe7jR+c/5OU5X7xfcEicLIRgg9DpnpVrvY+HvCcEF37x1T0zf0U2vIg== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1718962674; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kFB1tC9CT9g0HRd6KCO32Pre0A+EA4ekFX5x5x/JyAo=; b=mWT3iKI51YKpZRElKbsKOYH+pUNshVdw3s6gfFUU46nzjecIeG6cp40DJYa+OfwMGzKWyS HCdaew106TCT5DAQ== Date: Fri, 21 Jun 2024 11:37:08 +0200 Subject: [PATCH 3/3] timer_migration: Improve tracing 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 Message-Id: <20240621-tmigr-fixes-v1-3-8c8a2d8e8d77@linutronix.de> References: <20240621-tmigr-fixes-v1-0-8c8a2d8e8d77@linutronix.de> In-Reply-To: <20240621-tmigr-fixes-v1-0-8c8a2d8e8d77@linutronix.de> To: Frederic Weisbecker , Thomas Gleixner , linux-kernel@vger.kernel.org Cc: Anna-Maria Behnsen Trace points of inactive and active propagation are located at the end of the related functions. The interesting information of those trace points is the updated group state. When trace points are not located directly at the place where group state changed, order of trace points in traces could be confusing. Move inactive and active propagation trace points directly after update of group state values. Signed-off-by: Anna-Maria Behnsen --- kernel/time/timer_migration.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/kernel/time/timer_migration.c b/kernel/time/timer_migration.c index f55be5411ad9..41ea48d08c65 100644 --- a/kernel/time/timer_migration.c +++ b/kernel/time/timer_migration.c @@ -656,6 +656,8 @@ static bool tmigr_active_up(struct tmigr_group *group, =20 } while (!atomic_try_cmpxchg(&group->migr_state, &curstate.state, newstat= e.state)); =20 + trace_tmigr_group_set_cpu_active(group, newstate, childmask); + if (walk_done =3D=3D false) data->childmask =3D group->childmask; =20 @@ -673,8 +675,6 @@ static bool tmigr_active_up(struct tmigr_group *group, */ group->groupevt.ignore =3D true; =20 - trace_tmigr_group_set_cpu_active(group, newstate, childmask); - return walk_done; } =20 @@ -1305,9 +1305,10 @@ static bool tmigr_inactive_up(struct tmigr_group *gr= oup, =20 WARN_ON_ONCE((newstate.migrator !=3D TMIGR_NONE) && !(newstate.active)); =20 - if (atomic_try_cmpxchg(&group->migr_state, &curstate.state, - newstate.state)) + if (atomic_try_cmpxchg(&group->migr_state, &curstate.state, newstate.sta= te)) { + trace_tmigr_group_set_cpu_inactive(group, newstate, childmask); break; + } =20 /* * The memory barrier is paired with the cmpxchg() in @@ -1326,8 +1327,6 @@ static bool tmigr_inactive_up(struct tmigr_group *gro= up, if (walk_done =3D=3D false) data->childmask =3D group->childmask; =20 - trace_tmigr_group_set_cpu_inactive(group, newstate, childmask); - return walk_done; } =20 --=20 2.39.2