From patchwork Fri Jun 16 18:53:19 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: tip-bot2 for Thomas Gleixner X-Patchwork-Id: 109302 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp1554921vqr; Fri, 16 Jun 2023 12:03:49 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ48KDdXWwUVxZ3JtVGQOUdmdGge4qYQ7U2F5iFyfeFt+A6bAlOkuS1Xt7oc4R5CUBqO40Mv X-Received: by 2002:a17:902:d38d:b0:1b1:9f7d:2aec with SMTP id e13-20020a170902d38d00b001b19f7d2aecmr2462085pld.68.1686942228733; Fri, 16 Jun 2023 12:03:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686942228; cv=none; d=google.com; s=arc-20160816; b=JI4iyKdk7kbJ0nlehi9rmifKYlPzYTuFMJ+mKMjE23N/+Gft8dPGjMOsfzV+ncGELB 7ft80Yy5GagutoCwwiXV4dVDADyebXDw2Ws2mzaWjylcwH4jCkgGpHjiDuotecYwdBq3 yEdLgiVtI9cS0ZJlZUZTOKGom6eYMmMDZW419L2AbgddmqI1AqD6W5aVg0bK+Bnpq5UR cbhvItDwyzIU4ROjJbVZBYRbA05K9z/CQRNGsQaGJJo+xv1vWgUUBN8MnDaPZJsJj3dg 480NWnMnfyeECfIpvA9VMHxNAlgO6+6HLcWk+LAOFzlr/cAXU7tq3FpY1uLLvnQDPUIj 3A6A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:robot-unsubscribe :robot-id:message-id:mime-version:references:in-reply-to:cc:subject :to:reply-to:sender:from:dkim-signature:dkim-signature:date; bh=vwwe934FIcaw97RpxpbJdTmS2f0r5fdZZt43SX5cE2I=; b=nXgu4eTtNlnZAxrCmkruBSP2ROD5PbH0R8LkK4Y1fL4M/6vm/8nex1SnM9cqCwc8+e ipKuncn0UEkdKkRxw6yA80cUuSoNNnoFY1B7EvwmIhe8LFpwopJJH27GHNm+7uhvohwe iPYcvm3Ui1IJvXmaFT2OJ5dQxy9lbsKGHuII+LPEnHTVd099h8okNPGFg9yVQbOpxaZy 8UEQpD53io9mLhb7Ogxr6C6jbq5Kt6e5fyhzIA6QXH4smORV6nsmVtaTAPsseB+5OYO0 VjJH+KwzZEosM1WkYKkQK3V3vhwgJ7DbbFNSdjnv9rGdJjWjwE27pX3j/z5BVHdAoDjW XIig== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=BojAA2eX; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e header.b=tkIMnXU+; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id h21-20020a170902ac9500b001ab2431f012si10834620plr.423.2023.06.16.12.03.34; Fri, 16 Jun 2023 12:03:48 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=BojAA2eX; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e header.b=tkIMnXU+; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345280AbjFPSxd (ORCPT + 99 others); Fri, 16 Jun 2023 14:53:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34032 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345156AbjFPSx0 (ORCPT ); Fri, 16 Jun 2023 14:53:26 -0400 Received: from galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4D8AE3A9E; Fri, 16 Jun 2023 11:53:22 -0700 (PDT) Date: Fri, 16 Jun 2023 18:53:19 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1686941600; h=from:from:sender:sender:reply-to: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=vwwe934FIcaw97RpxpbJdTmS2f0r5fdZZt43SX5cE2I=; b=BojAA2eXo0THrTKJEZbIpojWx9evZe7MU47eHPGhLHbaPCA4AaV/euHLRXdBNIBytdAPDM epV2Ac9WAcLrmg9xXoYQGN8uO4mnr/MXB8C9HIOrQX3uoY4Y7gpn3AbYqOPvyxM3k3MGk1 hKM2HBB1D58LhPQprApVrNrOTsN99rYYi4VQ3wCpgwQkRqj5BZu+I2JIPuy+YiEot603rd jNpoH9+HU1OEttuG8EkrXrJyF7Hvog+3onJGDwonYcK7zOJta9yNdMD8mWxZKRWoOoj5HL 2SjUWR3GxICjTipPDufuqQk5tte59lho7hq6I0Yk34XFgfRT0tLzrg7nxm4v4A== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1686941600; h=from:from:sender:sender:reply-to: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=vwwe934FIcaw97RpxpbJdTmS2f0r5fdZZt43SX5cE2I=; b=tkIMnXU+b12oBdoyl2GFlPd9wmGyB4UoBkOZvEp7hql83pwsz7qXRQwXu8zxL4obV5XfdV 3v5QnXA07FHsZLBQ== From: "tip-bot2 for Thomas Gleixner" Sender: tip-bot2@linutronix.de Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: timers/urgent] tick/common: Align tick period during sched_timer setup Cc: Mathias Krause , "Bhatnagar, Rishabh" , Thomas Gleixner , Sebastian Andrzej Siewior , "Richard W.M. Jones" , SeongJae Park , stable@vger.kernel.org, x86@kernel.org, linux-kernel@vger.kernel.org In-Reply-To: <5a56290d-806e-b9a5-f37c-f21958b5a8c0@grsecurity.net> References: <5a56290d-806e-b9a5-f37c-f21958b5a8c0@grsecurity.net> MIME-Version: 1.0 Message-ID: <168694159988.404.1902283865304443546.tip-bot2@tip-bot2> Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1768887134566611084?= X-GMAIL-MSGID: =?utf-8?q?1768887134566611084?= The following commit has been merged into the timers/urgent branch of tip: Commit-ID: 13bb06f8dd42071cb9a49f6e21099eea05d4b856 Gitweb: https://git.kernel.org/tip/13bb06f8dd42071cb9a49f6e21099eea05d4b856 Author: Thomas Gleixner AuthorDate: Thu, 15 Jun 2023 11:18:30 +02:00 Committer: Thomas Gleixner CommitterDate: Fri, 16 Jun 2023 20:45:28 +02:00 tick/common: Align tick period during sched_timer setup The tick period is aligned very early while the first clock_event_device is registered. At that point the system runs in periodic mode and switches later to one-shot mode if possible. The next wake-up event is programmed based on the aligned value (tick_next_period) but the delta value, that is used to program the clock_event_device, is computed based on ktime_get(). With the subtracted offset, the device fires earlier than the exact time frame. With a large enough offset the system programs the timer for the next wake-up and the remaining time left is too small to make any boot progress. The system hangs. Move the alignment later to the setup of tick_sched timer. At this point the system switches to oneshot mode and a high resolution clocksource is available. At this point it is safe to align tick_next_period because ktime_get() will now return accurate (not jiffies based) time. [bigeasy: Patch description + testing]. Fixes: e9523a0d81899 ("tick/common: Align tick period with the HZ tick.") Reported-by: Mathias Krause Reported-by: "Bhatnagar, Rishabh" Suggested-by: Mathias Krause Signed-off-by: Thomas Gleixner Signed-off-by: Sebastian Andrzej Siewior Signed-off-by: Thomas Gleixner Tested-by: Richard W.M. Jones Tested-by: Mathias Krause Acked-by: SeongJae Park Cc: stable@vger.kernel.org Link: https://lore.kernel.org/5a56290d-806e-b9a5-f37c-f21958b5a8c0@grsecurity.net Link: https://lore.kernel.org/12c6f9a3-d087-b824-0d05-0d18c9bc1bf3@amazon.com Link: https://lore.kernel.org/r/20230615091830.RxMV2xf_@linutronix.de --- kernel/time/tick-common.c | 13 +------------ kernel/time/tick-sched.c | 13 ++++++++++++- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c index 65b8658..e9138cd 100644 --- a/kernel/time/tick-common.c +++ b/kernel/time/tick-common.c @@ -218,19 +218,8 @@ static void tick_setup_device(struct tick_device *td, * this cpu: */ if (tick_do_timer_cpu == TICK_DO_TIMER_BOOT) { - ktime_t next_p; - u32 rem; - tick_do_timer_cpu = cpu; - - next_p = ktime_get(); - div_u64_rem(next_p, TICK_NSEC, &rem); - if (rem) { - next_p -= rem; - next_p += TICK_NSEC; - } - - tick_next_period = next_p; + tick_next_period = ktime_get(); #ifdef CONFIG_NO_HZ_FULL /* * The boot CPU may be nohz_full, in which case set diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 5225467..42c0be3 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -161,8 +161,19 @@ static ktime_t tick_init_jiffy_update(void) raw_spin_lock(&jiffies_lock); write_seqcount_begin(&jiffies_seq); /* Did we start the jiffies update yet ? */ - if (last_jiffies_update == 0) + if (last_jiffies_update == 0) { + u32 rem; + + /* + * Ensure that the tick is aligned to a multiple of + * TICK_NSEC. + */ + div_u64_rem(tick_next_period, TICK_NSEC, &rem); + if (rem) + tick_next_period += TICK_NSEC - rem; + last_jiffies_update = tick_next_period; + } period = last_jiffies_update; write_seqcount_end(&jiffies_seq); raw_spin_unlock(&jiffies_lock);