From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-dy1-f175.google.com (mail-dy1-f175.google.com [74.125.82.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 BDD2C314B6D for ; Tue, 19 May 2026 02:24:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.175 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779157474; cv=none; b=lrGTZtBBksUKIF+bfuYGEpAflOhHBDSFgfQ6eDhwG277R65lvW7dmUtkj8KAHpik3ML4/EtQmQ1pzvEn1OsBjt7NFaY54aJ/ciB4TYsgSLBzsfUOxxISy+8iCDZO3He63AHFbkb3FYt/t4Se+K4zdRZvyXB6LBaQNHCSKM+fsIk= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779157474; c=relaxed/simple; bh=NADwrGOVcc4FjQYywWuWugOChYFB0Dkz+W/ArfLZ0PY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uRJoD48Ul/E+2+X3WS+WiyZF6bGiTx8ToRxntJfhtDtZabSE4YnIxDXxrkKOKCMdMIxoc2Rg2qvszpLuWWv4IyT/HbXwWQ9hzPnJbPQPNqQvk8O7OBcq+MslNOXmAnuS3dXT2DV5EICI8tfNFZFkln0ltU0n9mLaqbrJyH1SBaQ= 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=MIafeVGi; arc=none smtp.client-ip=74.125.82.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="MIafeVGi" Received: by mail-dy1-f175.google.com with SMTP id 5a478bee46e88-2ef2a1cc06dso2305921eec.0 for ; Mon, 18 May 2026 19:24:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779157472; x=1779762272; 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=eqlrn3+hTvrRB6nPsNJHnq1yi6Gz0E9UU0IYHYA6w/k=; b=MIafeVGip0alPPvE/EmE9nbdJfkQp4rxxxZ7hdPG0/Lx+QWw8KsQG1Dhzrb3bA8ep5 KqfMa/U2GNaC7vs73ml6YgYcz7sa+m46MKnrszkIEHLuyl5D26yN9WSOFj98bir9P7Uw HtHnyFSLXr7Lv/BtD1e1QqtB3tC7BVtW7ryiPcQ6KGHdc+DnZi28J/Jx4Fgbq6V3NIPT 0j/01zIq1ZUb+HWebnL4f5VKGEEBc40sK8AGgWBg0lK4V373fvRt+aei9HYpHd91Sv/U jyurh9O0DeCvRrzx4pw+Zb8oI7weXWX+DRwcGq0o8PQqAR/I57+WCXiOTHnL+yrBzE3B q31Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779157472; x=1779762272; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=eqlrn3+hTvrRB6nPsNJHnq1yi6Gz0E9UU0IYHYA6w/k=; b=T5GAT4fOjxSA04O1qgpjBKteKrS6uOyXBhOTdcNzJL2Id5kwggujwN9EtvdFy0az6x s6dcLCpFQkmD/5zx0Nkf5Pp6B7lCGlDN/UDv7eKSHDJibTLa4ImjQuMdB5ky5FPZEghL 1VAGOc06BnRO47mjqxw65iHRdzJmjLO5Aw965i6+IA30yVgFANYOdsyDssV3Bo450hpX JTB6mEvSYg7rw4zNBd02Rhw0A4VhrgdfVm29mcN4r/1G2SpwNx+bDrWz+qsgL1gk25Mh +uU8N6S3XsZ0q8pBCdywPFTe4VqQXhYBupCAwAG/fk38gqC3mgZ88MVMHQqebQbs772v poew== X-Gm-Message-State: AOJu0YyyVSjPtCR5V+jV9qXUcwS4HOHYrvROixSj0Yb7T4LH+aDbX+D8 ysYkaDzB3siORkEv+E8ZAqJuyLQLUgwBVnwAdxWlsQ9RlUc8rhTAVOnm X-Gm-Gg: Acq92OFMvVKhnUvBec1fPa2r8kki4yAH8cOHC+vByjuxkeM+dGEQa4lnK6IERmz9RIq 5Ddc8+zzDv7XH0vx3lCanNIYc3iQUyteNjtrjYf4/MwbS6vhehAMgDNKGAcXSlPnAFJmHddxM6L QDYyd+UcKgwSCR5OHXaMgvMn3wZECPli95jQ0j1HjRyz681idjkdqDUXR8J3gkKsmu5v7xtlKv+ 2dq8sZKb2QWmYf28bWiOtmYeChKX5kipsLmGruHCqH1Bf08wPV7kUOS14pzH89Ve0+bqkI3AyXU cOZRgZTF5d+kdgd55NlCsenOt7SNCVHc2Ly3fQsld0ouRqBk/RMqZLanrpE+sRzHgQ7PAkwwFKZ jxuxE9wGx1uFS2fcA9I0DR+M5donc8HP7Gj02a/1T7Lq3aIhZgpxNpzweDtcGgp4IryWQjih9JI 5PYvCQWRdSu8DV0lZ+IpKhCxo5oPLOmvBKns3l3MunolbTEj8= X-Received: by 2002:a05:7301:2c8a:b0:2f2:32bc:787d with SMTP id 5a478bee46e88-30398637044mr7365399eec.23.1779157471451; Mon, 18 May 2026 19:24:31 -0700 (PDT) Received: from s7t7-debian-test.local ([67.170.89.46]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-30294adddaasm15104386eec.13.2026.05.18.19.24.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 May 2026 19:24:31 -0700 (PDT) From: Tony Rodriguez To: davem@davemloft.net, sparclinux@vger.kernel.org Cc: linux-kernel@vger.kernel.org, andreas@gaisler.com, tglx@kernel.org, thomas.weissschuh@linutronix.de, regressions@lists.linux.dev, glaubitz@physik.fu-berlin.de, linux@leemhuis.info, torvalds@linux-foundation.org, Tony Rodriguez Subject: [PATCH v2 1/1] sparc64: Fix comparator problem with timer interrupts Date: Mon, 18 May 2026 19:24:09 -0700 Message-ID: <20260519022421.5978-2-unixpro1970@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260519022421.5978-1-unixpro1970@gmail.com> References: <20260519022421.5978-1-unixpro1970@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit On SPARC64 the check: return ((long)(new_tick - (orig_tick + adj))) > 0L; Is safe only if retries make forward progress. The comparator can take effect with a latency, so the moment when counter == comparator may be missed, which can cause delays or hangs on some SPARC64 systems. For clarity: exp = orig_tick + adj /* expected comparator value */ The current check requires new_tick to be strictly greater than exp; equality (new_tick == exp) is treated as not yet passed and the caller will retry. By contrast, using: return ((long)(new_tick - (orig_tick + adj))) >= 0L; causes the caller to stop retrying and assume the timer is scheduled; both equality and greater-than are accepted (new_tick == exp or new_tick > exp). Signed-off-by: Tony Rodriguez --- arch/sparc/kernel/time_64.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arch/sparc/kernel/time_64.c b/arch/sparc/kernel/time_64.c index 87b267043ccd..783b60e547c4 100644 --- a/arch/sparc/kernel/time_64.c +++ b/arch/sparc/kernel/time_64.c @@ -146,7 +146,7 @@ static int tick_add_compare(unsigned long adj) : "=r" (new_tick)); new_tick &= ~TICKCMP_IRQ_BIT; - return ((long)(new_tick - (orig_tick+adj))) > 0L; + return ((long)(new_tick - (orig_tick+adj))) >= 0L; } static unsigned long tick_add_tick(unsigned long adj) @@ -277,7 +277,7 @@ static int stick_add_compare(unsigned long adj) : "=r" (new_tick)); new_tick &= ~TICKCMP_IRQ_BIT; - return ((long)(new_tick - (orig_tick+adj))) > 0L; + return ((long)(new_tick - (orig_tick+adj))) >= 0L; } static unsigned long stick_get_frequency(void) @@ -411,7 +411,7 @@ static int hbtick_add_compare(unsigned long adj) val2 = __hbird_read_stick() & ~TICKCMP_IRQ_BIT; - return ((long)(val2 - val)) > 0L; + return ((long)(val2 - val)) >= 0L; } static unsigned long hbtick_get_frequency(void) -- 2.53.0