From: Boqun Feng <boqun.feng@xxxxxxxxx> Sent: Thursday, March 24, 2022 7:32 PM > > Currently there are known potential issues for balloon and hot-add on > ARM64: > > * Unballoon requests from Hyper-V should only unballoon ranges > that are guest page size aligned, otherwise guests cannot handle > because it's impossible to partially free a page. This is a > problem when guest page size > 4096 bytes. > > * Memory hot-add requests from Hyper-V should provide the NUMA > node id of the added ranges or ARM64 should have a functional > memory_add_physaddr_to_nid(), otherwise the node id is missing > for add_memory(). > > These issues require discussions on design and implementation. In the > meanwhile, post_status() is working and essential to guest monitoring. > Therefore instead of disabling the entire hv_balloon driver, the > ballooning (when page size > 4096 bytes) and hot-add are disabled > accordingly for now. Once the issues are fixed, they can be re-enable in > these cases. > > Signed-off-by: Boqun Feng <boqun.feng@xxxxxxxxx> > --- > drivers/hv/hv_balloon.c | 36 ++++++++++++++++++++++++++++++++++-- > 1 file changed, 34 insertions(+), 2 deletions(-) > > diff --git a/drivers/hv/hv_balloon.c b/drivers/hv/hv_balloon.c > index 062156b88a87..eee7402cfc02 100644 > --- a/drivers/hv/hv_balloon.c > +++ b/drivers/hv/hv_balloon.c > @@ -1660,6 +1660,38 @@ static void disable_page_reporting(void) > } > } > > +static int ballooning_enabled(void) > +{ > + /* > + * Disable ballooning if the page size is not 4k (HV_HYP_PAGE_SIZE), > + * since currently it's unclear to us whether an unballoon request can > + * make sure all page ranges are guest page size aligned. > + */ > + if (PAGE_SIZE != HV_HYP_PAGE_SIZE) { > + pr_info("Ballooning disabled because page size is not 4096 bytes\n"); > + return 0; > + } > + > + return 1; > +} > + > +static int hot_add_enabled(void) > +{ > + /* > + * Disable hot add on ARM64, because we currently rely on > + * memory_add_physaddr_to_nid() to get a node id of a hot add range, > + * however ARM64's memory_add_physaddr_to_nid() always return 0 and > + * DM_MEM_HOT_ADD_REQUEST doesn't have the NUMA node information for > + * add_memory(). > + */ > + if (IS_ENABLED(CONFIG_ARM64)) { > + pr_info("Memory hot add disabled on ARM64\n"); > + return 0; > + } > + > + return 1; > +} > + > static int balloon_connect_vsp(struct hv_device *dev) > { > struct dm_version_request version_req; > @@ -1731,8 +1763,8 @@ static int balloon_connect_vsp(struct hv_device *dev) > * currently still requires the bits to be set, so we have to add code > * to fail the host's hot-add and balloon up/down requests, if any. > */ > - cap_msg.caps.cap_bits.balloon = 1; > - cap_msg.caps.cap_bits.hot_add = 1; > + cap_msg.caps.cap_bits.balloon = ballooning_enabled(); > + cap_msg.caps.cap_bits.hot_add = hot_add_enabled(); > > /* > * Specify our alignment requirements as it relates > -- > 2.35.1 Reviewed-by: Michael Kelley <mikelley@xxxxxxxxxxxxx>