Re: [PATCH 2/2] x86/amd_node: Avoid divide by zero on virtualized systems
Jason Andryuk <[email protected]>
| Newsgroups | org.kernel.vger.stable,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
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? The intent was to only warn if real hardware doesn't match the expectation. Really, I just want to get this fixed. Thanks, Jason