From: Wei Liu <wei.liu@kernel.org>
To: Michael Kelley <mhklinux@outlook.com>
Cc: "wei.liu@kernel.org" <wei.liu@kernel.org>,
"iommu@lists.linux.dev" <iommu@lists.linux.dev>,
"netdev@vger.kernel.org" <netdev@vger.kernel.org>,
"linux-hyperv@vger.kernel.org" <linux-hyperv@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-scsi@vger.kernel.org" <linux-scsi@vger.kernel.org>,
"kys@microsoft.com" <kys@microsoft.com>,
"haiyangz@microsoft.com" <haiyangz@microsoft.com>,
"decui@microsoft.com" <decui@microsoft.com>,
"tglx@linutronix.de" <tglx@linutronix.de>,
"mingo@redhat.com" <mingo@redhat.com>,
"bp@alien8.de" <bp@alien8.de>,
"dave.hansen@linux.intel.com" <dave.hansen@linux.intel.com>,
"x86@kernel.org" <x86@kernel.org>,
"hpa@zytor.com" <hpa@zytor.com>,
"joro@8bytes.org" <joro@8bytes.org>,
"will@kernel.org" <will@kernel.org>,
"robin.murphy@arm.com" <robin.murphy@arm.com>,
"davem@davemloft.net" <davem@davemloft.net>,
"edumazet@google.com" <edumazet@google.com>,
"kuba@kernel.org" <kuba@kernel.org>,
"pabeni@redhat.com" <pabeni@redhat.com>,
"James.Bottomley@HansenPartnership.com"
<James.Bottomley@hansenpartnership.com>,
"martin.petersen@oracle.com" <martin.petersen@oracle.com>
Subject: Re: [PATCH 0/5] hyper-v: Don't assume cpu_possible_mask is dense
Date: Wed, 11 Dec 2024 00:14:50 +0000 [thread overview]
Message-ID: <Z1jZengWxcjEPdJD@liuwe-devbox-debian-v2> (raw)
In-Reply-To: <SN6PR02MB415740B41A34B1468BC6AE28D43D2@SN6PR02MB4157.namprd02.prod.outlook.com>
On Tue, Dec 10, 2024 at 07:58:34PM +0000, Michael Kelley wrote:
> From: mhkelley58@gmail.com <mhkelley58@gmail.com> Sent: Wednesday, October 2, 2024 8:53 PM
> >
> > Code specific to Hyper-V guests currently assumes the cpu_possible_mask
> > is "dense" -- i.e., all bit positions 0 thru (nr_cpu_ids - 1) are set,
> > with no "holes". Therefore, num_possible_cpus() is assumed to be equal
> > to nr_cpu_ids.
> >
> > Per a separate discussion[1], this assumption is not valid in the
> > general case. For example, the function setup_nr_cpu_ids() in
> > kernel/smp.c is coded to assume cpu_possible_mask may be sparse,
> > and other patches have been made in the past to correctly handle
> > the sparseness. See bc75e99983df1efd ("rcu: Correctly handle sparse
> > possible cpu") as noted by Mark Rutland.
> >
> > The general case notwithstanding, the configurations that Hyper-V
> > provides to guest VMs on x86 and ARM64 hardware, in combination
> > with the algorithms currently used by architecture specific code
> > to assign Linux CPU numbers, *does* always produce a dense
> > cpu_possible_mask. So the invalid assumption is not currently
> > causing failures. But in the interest of correctness, and robustness
> > against future changes in the code that populates cpu_possible_mask,
> > update the Hyper-V code to no longer assume denseness.
> >
> > The typical code pattern with the invalid assumption is as follows:
> >
> > array = kcalloc(num_possible_cpus(), sizeof(<some struct>),
> > GFP_KERNEL);
> > ....
> > index into "array" with smp_processor_id()
> >
> > In such as case, the array might be indexed by a value beyond the size
> > of the array. The correct approach is to allocate the array with size
> > "nr_cpu_ids". While this will probably leave unused any array entries
> > corresponding to holes in cpu_possible_mask, the holes are assumed to
> > be minimal and hence the amount of memory wasted by unused entries is
> > minimal.
> >
> > Removing the assumption in Hyper-V code is done in several patches
> > because they touch different kernel subsystems:
> >
> > Patch 1: Hyper-V x86 initialization of hv_vp_assist_page (there's no
> > hv_vp_assist_page on ARM64)
> > Patch 2: Hyper-V common init of hv_vp_index
> > Patch 3: Hyper-V IOMMU driver
> > Patch 4: storvsc driver
> > Patch 5: netvsc driver
>
> Wei --
>
> Could you pick up Patches 1, 2, and 3 in this series for the hyperv-next
> tree? Peter Zijlstra acked the full series [2], and Patches 4 and 5 have
> already been picked by the SCSI and net maintainers respectively [3][4].
>
> Let me know if you have any concerns.
Michael, I will take a look later after I finish dealing with the
hyperv-fixes branch.
Thanks,
Wei.
>
> Thanks,
>
> Michael
>
> [2] https://lore.kernel.org/linux-hyperv/20241004100742.GO18071@noisy.programming.kicks-ass.net/
> [3] https://lore.kernel.org/linux-hyperv/yq15xnsjlc1.fsf@ca-mkp.ca.oracle.com/
> [4] https://lore.kernel.org/linux-hyperv/172808404024.2772330.2975585273609596688.git-patchwork-notify@kernel.org/
>
> >
> > I tested the changes by hacking the construction of cpu_possible_mask
> > to include a hole on x86. With a configuration set to demonstrate the
> > problem, a Hyper-V guest kernel eventually crashes due to memory
> > corruption. After the patches in this series, the crash does not occur.
> >
> > [1] https://lore.kernel.org/lkml/SN6PR02MB4157210CC36B2593F8572E5ED4692@SN6PR02MB4157.namprd02.prod.outlook.com/
> >
> > Michael Kelley (5):
> > x86/hyperv: Don't assume cpu_possible_mask is dense
> > Drivers: hv: Don't assume cpu_possible_mask is dense
> > iommu/hyper-v: Don't assume cpu_possible_mask is dense
> > scsi: storvsc: Don't assume cpu_possible_mask is dense
> > hv_netvsc: Don't assume cpu_possible_mask is dense
> >
> > arch/x86/hyperv/hv_init.c | 2 +-
> > drivers/hv/hv_common.c | 4 ++--
> > drivers/iommu/hyperv-iommu.c | 4 ++--
> > drivers/net/hyperv/netvsc_drv.c | 2 +-
> > drivers/scsi/storvsc_drv.c | 13 ++++++-------
> > 5 files changed, 12 insertions(+), 13 deletions(-)
> >
> > --
> > 2.25.1
> >
next prev parent reply other threads:[~2024-12-11 0:14 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-03 3:53 [PATCH 0/5] hyper-v: Don't assume cpu_possible_mask is dense mhkelley58
2024-10-03 3:53 ` [PATCH 1/5] x86/hyperv: " mhkelley58
2024-10-03 3:53 ` [PATCH 2/5] Drivers: hv: " mhkelley58
2024-10-03 3:53 ` [PATCH 3/5] iommu/hyper-v: " mhkelley58
2024-10-03 3:53 ` [PATCH 4/5] scsi: storvsc: " mhkelley58
2024-12-06 2:58 ` Michael Kelley
2024-12-10 2:58 ` Martin K. Petersen
2024-10-03 3:53 ` [PATCH net-next 5/5] hv_netvsc: " mhkelley58
2024-10-04 10:07 ` [PATCH 0/5] hyper-v: " Peter Zijlstra
2024-10-04 23:20 ` patchwork-bot+netdevbpf
2024-10-04 23:25 ` Jakub Kicinski
2024-10-04 23:34 ` Michael Kelley
2024-12-10 19:58 ` Michael Kelley
2024-12-11 0:14 ` Wei Liu [this message]
2024-12-17 19:21 ` Wei Liu
2025-01-02 22:46 ` (subset) " Martin K. Petersen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Z1jZengWxcjEPdJD@liuwe-devbox-debian-v2 \
--to=wei.liu@kernel.org \
--cc=James.Bottomley@hansenpartnership.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=davem@davemloft.net \
--cc=decui@microsoft.com \
--cc=edumazet@google.com \
--cc=haiyangz@microsoft.com \
--cc=hpa@zytor.com \
--cc=iommu@lists.linux.dev \
--cc=joro@8bytes.org \
--cc=kuba@kernel.org \
--cc=kys@microsoft.com \
--cc=linux-hyperv@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=mhklinux@outlook.com \
--cc=mingo@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=robin.murphy@arm.com \
--cc=tglx@linutronix.de \
--cc=will@kernel.org \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.