From nobody Mon Jun 15 00:20:39 2026 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (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 EBA9240DFDD for ; Tue, 7 Apr 2026 07:46:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775547978; cv=none; b=jtJTeyeMba7/0rco4suNmpocUa4hMmKGN3xY9XOzZ7vZUp0ztT0c3cQNHzGqykK6+CHMxyqSdfDYlg5GrXDSQpkLeNf2P0QGydimwlGKPLNd+yIGaUsGk4z4cEnV1IittADxV7wxIX2xJ3l1K4BL9jvDy0TQpAneVi818X+FIWY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775547978; c=relaxed/simple; bh=EYOC01mBiH66Yvwvv5MQCtPtMhdwTpXawAN17xqFFLE=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=nnH00jVunRzRxtt3YBFE8fS84fHtqvuCDaOzfmXja2OB445juZ124RYO3j0XxQQ2f/vgDWz/jox9vr/dP/i7Joq7Yrzfy0RrRU1ss9p0kDVo1NLgJoZBT0OZADKfFg+nAKAoYD2vD4fMZ5S4g1q8kXRNjBDK+O9AMl+7kIlM6to= 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=XfEeFr6w; arc=none smtp.client-ip=209.85.128.50 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="XfEeFr6w" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-483487335c2so47325105e9.2 for ; Tue, 07 Apr 2026 00:46:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775547975; x=1776152775; 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=oDRTVatnaVdVRoKqoryBgcipBx9RDK2t4fM6mlrK2lU=; b=XfEeFr6wzzZ1273CgD4qAE3T4mJcfxfu+HwKYfXuBM8J0C29H38zGlwasLbPtwMyHf fR89GJUH4TNq7GUpXOYe35rlvzGbuZiJxayb+/iH5/C5At3XHJtLS+kaQnv0EFZ4c7YZ iW7qAY5ANBZrV2onkZErD3BIC9lQeGDJ79Q6O5XG2lXA9h6U/zjw3XbGyjIyyiDKfQUd ffm5Dks0ygs2EjFdfa1xTgT5xGX969FpMD5Bhc+6mdQy21rnIuDrNYkzfULK5jZX3Wla MPt27y/B8uvXBv+NsVDObGZPRNnZ2gkjCj/1R5NJUrTn9kLfyyRzSbh7rq8CdEp7Q8Ao VovA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775547975; x=1776152775; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=oDRTVatnaVdVRoKqoryBgcipBx9RDK2t4fM6mlrK2lU=; b=pxU1v7nxtAEGlnJ1CpdFV5EgAIlsZnawvwFdBkET7ymig8fqtn3ncHMWxvKH7C9pt6 dVUM3HCNKJsinGF6jpYttTnn6M14zC4z79zN6oBX8oxDJZWvPKUwJHk4JMdRyV6Ov01g q9abpBA6uxUzklt18/XjwtCQ10iwXAUjlrL6gl3xM1KGyMclY0T9ngYBihEG65eKkIE0 ikcSwkHfHc2xZpxsy20SD7/T1Kqy33tbaRMemwkF/sTFNy6c+S/ikfluk4CMvMFBdqS3 Nwr+8MkbzATuxGK9i0S0woLMXpU4OcWScUwc1eQBzIwplp1TkTSNG+kopU9LkovbntDn CCiQ== X-Forwarded-Encrypted: i=1; AJvYcCXUCYZ1l/qQ+8ElI9pl76c27H9fTdTn5d+JZjjZ46mrEKCzOvJln+eTWkUOznm2BxymFxU2iKtnEhUukKE=@vger.kernel.org X-Gm-Message-State: AOJu0Yx+M/u3i5D+5UWhjCHnhSPxb6ghYPlfpb2SX8C+Rk0/sHY3PsR8 qL3Wgyc5xtjDONxSP+3B3TYaClqke6T1WugN45jk/LYcZbAhqkJNOiVBu6Cqwg== X-Gm-Gg: AeBDieu95y78q5+P76G6LNVNPTNsaWfhhtOzl0laSRHcHv9u5m4d0mwFGXuPGtoFGu6 YJZWPPYx4WODRUKs27daR3QXtWmYwWZw4auaWUGx8uMz22LKoTch6HEglsAMWjWBbc4UZBuC0/n iCauXQ75YDtg46Yog6hvTVqjlKs9g3mK3seZYUH1bAcCE7P/zk+SEfZzTzKJX2WmHLY4Rht4OFX 1+4ZBksRCywunn/1Rlb8ffTqJgkBSuGeWIgwfRFmdsE0FVFJpvrd6DrCzueKj4zZVb44KMGvv3U /ALXgWrS9TfSfjSDMJGbzJSkGcs6/2wlYzLLE/K+68rFDo7WA9tHneR9N9YwDFD9r10d57Ku/ib xYns2+NZnuEmusZ/DAzWluHbbwRXywaFkhOEOgDeZnQVREvFC1kSlvqKIzMR5e7oKP5ogB/qcVN 3FR9OObcSsYh0YHzA2bHoMiqvetcB9o9SvNq/E3UxptaMECnbqgt0UjS9H+k6JiZO2i05/UvUWv 0H8pn0RzDUPxGT37ySxlgHIxYHoMT9qZPMpeA== X-Received: by 2002:a05:600c:a418:b0:488:ae4e:51a5 with SMTP id 5b1f17b1804b1-488ae4e5464mr78747145e9.15.1775547974835; Tue, 07 Apr 2026 00:46:14 -0700 (PDT) Received: from fedora.homenet.telecomitalia.it (host-82-53-109-192.retail.telecomitalia.it. [82.53.109.192]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4888a7165aasm522040385e9.14.2026.04.07.00.46.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 00:46:14 -0700 (PDT) From: Adriano Vero To: palmer@dabbelt.com, pjw@kernel.org, aou@eecs.berkeley.edu Cc: alex@ghiti.fr, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, Adriano Vero Subject: [PATCH] riscv: Add WFI to secondary hart spinwait loop Date: Tue, 7 Apr 2026 09:45:34 +0200 Message-ID: <20260407074534.59179-1-litaliano00.contact@gmail.com> X-Mailer: git-send-email 2.53.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" The .Lwait_for_cpu_up loop in the RISCV_BOOT_SPINWAIT path busy-polls __cpu_spinwait_stack_pointer and __cpu_spinwait_task_pointer, burning power on all non-boot harts while they wait for the primary hart to complete early boot setup. Add a WFI instruction before each polling iteration to allow the hardware to enter a low-power state while waiting. Per the RISC-V privileged specification, WFI wakes on any pending interrupt even with global interrupts disabled (SIE=3D0), and implementations are permitted to treat it as a NOP, so this is safe in all contexts. The same pattern is already used in .Lsecondary_park in the same file. Signed-off-by: Adriano Vero --- arch/riscv/kernel/head.S | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/arch/riscv/kernel/head.S b/arch/riscv/kernel/head.S index 9c99c5ad6..ca208da7c 100644 --- a/arch/riscv/kernel/head.S +++ b/arch/riscv/kernel/head.S @@ -385,7 +385,14 @@ SYM_CODE_START(_start_kernel) * get far enough along the boot process that it should continue. */ .Lwait_for_cpu_up: - /* FIXME: We should WFI to save some energy here. */ + /* + * Wait for the boot hart to populate the stack and task pointers. + * Use WFI to avoid burning power in a busy-wait loop. Per the + * RISC-V privileged spec, WFI wakes on a pending interrupt even + * with global interrupts disabled (e.g. SIE=3D0), and implementations + * are permitted to treat it as a NOP, so this is always safe. + */ + wfi REG_L sp, (a1) REG_L tp, (a2) beqz sp, .Lwait_for_cpu_up --=20 2.53.0