When device memory blocks are hot-added via add_memory_driver_managed(), the HV balloon driver intercepts them but fails to online these memory blocks. This could result in device driver initialization failures. To address this, fall back to the generic online callback for memory blocks not added by the HV balloon driver. Similar cases are handled the same way in virtio-mem driver. Suggested-by: Vikram Sethi <vsethi@xxxxxxxxxx> Tested-by: Michael Frohlich <mfrohlich@xxxxxxxxxxxxx> Signed-off-by: Jacob Pan <jacob.pan@xxxxxxxxxxxxxxxxxxx> --- drivers/hv/hv_balloon.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/drivers/hv/hv_balloon.c b/drivers/hv/hv_balloon.c index a99112e6f0b8..c999daf34108 100644 --- a/drivers/hv/hv_balloon.c +++ b/drivers/hv/hv_balloon.c @@ -766,16 +766,18 @@ static void hv_online_page(struct page *pg, unsigned int order) struct hv_hotadd_state *has; unsigned long pfn = page_to_pfn(pg); - guard(spinlock_irqsave)(&dm_device.ha_lock); - list_for_each_entry(has, &dm_device.ha_region_list, list) { - /* The page belongs to a different HAS. */ - if (pfn < has->start_pfn || - (pfn + (1UL << order) > has->end_pfn)) - continue; + scoped_guard(spinlock_irqsave, &dm_device.ha_lock) { + list_for_each_entry(has, &dm_device.ha_region_list, list) { + /* The page belongs to a different HAS. */ + if (pfn < has->start_pfn || + (pfn + (1UL << order) > has->end_pfn)) + continue; - hv_bring_pgs_online(has, pfn, 1UL << order); - break; + hv_bring_pgs_online(has, pfn, 1UL << order); + return; + } } + generic_online_page(pg, order); } static int pfn_covered(unsigned long start_pfn, unsigned long pfn_cnt) -- 2.34.1