Re: [PATCH 2/2] x86/amd_node: Avoid divide by zero on virtualized systems
David Laight <[email protected]>
| Newsgroups | org.kernel.vger.stable,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <20260812081158.41b8b205@pumpkin> |
On Tue, 11 Aug 2026 17:23:47 -0400 Jason Andryuk <[email protected]> wrote: > On 2026-08-11 04:21, David Laight wrote: > > On Mon, 10 Aug 2026 10:47:06 -0400 > > Yazen Ghannam <[email protected]> wrote: > > > >> On Thu, Aug 06, 2026 at 12:01:57PM -0400, Jason Andryuk wrote: > >>> On a virtualized system, the number of nodes does not have a > >>> relationship to the number of roots. A Xen PVH dom0 can calculate > >>> roots_per_node as 0, which crashes with a divide by zero in: > >>> > >>> if (count++ % roots_per_node) > >>> > >>> On a virtualized system, default the value to 1. The issue is seen with > >>> Xen, but it could affect other systems. > >>> > >>> Fixes: 0a4b61d9c2e4 ("x86/amd_node: Fix AMD root device caching") > >>> Cc: [email protected] > >>> Signed-off-by: Jason Andryuk <[email protected]> > >> > >> I agree with the idea with some minor feedback below. > >> > >>> --- > >>> X86_FEATURE_XENPV is only for PV, but this is observed with a PVH dom0. > >>> --- > >>> arch/x86/kernel/amd_node.c | 5 +++++ > >>> 1 file changed, 5 insertions(+) > >>> > >>> diff --git a/arch/x86/kernel/amd_node.c b/arch/x86/kernel/amd_node.c > >>> index ea553267e5fa..c5025e5291b6 100644 > >>> --- a/arch/x86/kernel/amd_node.c > >>> +++ b/arch/x86/kernel/amd_node.c > >>> @@ -286,6 +286,11 @@ static int __init amd_smn_init(void) > >>> return -ENOMEM; > >>> > >>> roots_per_node = num_roots / num_nodes; > >>> + if (roots_per_node == 0) { > >> > >> Can be '!roots_per_node'. > >> > >>> + if (!cpu_feature_enabled(X86_FEATURE_HYPERVISOR)) > >>> + pr_err(FW_BUG "Error detecting roots per node.\n"); > >>> + roots_per_node = 1; > >>> + } > >> > >> I don't think this is necessarily a Firmware bug. > >> > >> Likewise, it can be a 'warning' rather than 'error'. I interpret 'error' > >> as something known to be incorrect. This was my position before on this > >> topic. But the various contrary reports changed my mind (even if they > >> come from virtualization). > >> > >> Furthermore, I think 'warning' is more appropriate. It says "We found > >> something unexpected. We're letting you (the user) know about it. And > >> we'll mitigate it to avoid an error." > >> > >> Anyways, I just wanted to write out some thoughts since this topic has > >> come up a few times. > >> > >> Possible rework for the above change: > >> > >> if (!roots_per_node && !cpu_feature_enabled(X86_FEATURE_HYPERVISOR) > >> pr_warn("Expected at least 1 root per AMD node.\n"); > >> > >> roots_per_node = max(roots_per_node, 1); > > > > I'd not add the max(), just; > > if (!roots_per_node) { > > roots_per_node = 1; > > if (cpu_feature_enabled(X86_FEATURE_HYPERVISOR) > > pr_warn("Expected at least 1 root per AMD node.\n"); > > } > > I prefer this because it puts the special handing inside the check. > David, you dropped ! from X86_FEATURE_HYPERVISOR - did you mean that? No, C&P typo in the email client. David > The intent was to only warn if real hardware doesn't match the expectation. > > Really, I just want to get this fixed. > > Thanks, > Jason