On Tue, Aug 11, 2026 at 05:05:06PM -0700, Mukesh R wrote: > Stub out deposit memory functions so adding of new redesigned functions > is much eaiser to review. >
This leaves the system in a broken state. It can break bisection. Can yo try this: Patch 1: rename hv_call_deposit_pages to hv_call_deposit_pages_old, and then hv_call_deposit_pages calls the _old variant. Patch 2: introduce the new scheme. Patch 3: drop the _old variant. Hopefully this can make the diff more reviewable. If this proves to be not as useful as I think, I can squash both patches when I apply the patch series. Wei > Signed-off-by: Mukesh R <[email protected]> > --- > drivers/hv/hv_proc.c | 126 ++----------------------------------------- > 1 file changed, 3 insertions(+), 123 deletions(-) > > diff --git a/drivers/hv/hv_proc.c b/drivers/hv/hv_proc.c > index 57b2c64197cb..d5ce9a032e9c 100644 > --- a/drivers/hv/hv_proc.c > +++ b/drivers/hv/hv_proc.c > @@ -9,135 +9,15 @@ > #include <linux/export.h> > #include <asm/mshyperv.h> > > -/* > - * See struct hv_deposit_memory. The first u64 is partition ID, the rest > - * are GPAs. > - */ > -#define HV_DEPOSIT_MAX (HV_HYP_PAGE_SIZE / sizeof(u64) - 1) > - > -/* Deposits exact number of pages. Must be called with interrupts enabled. > */ > int hv_call_deposit_pages(int node, u64 partition_id, u32 num_pages) > { > - struct page **pages, *page; > - int *counts; > - int num_allocations; > - int i, j, page_count; > - int order; > - u64 status; > - int ret; > - u64 base_pfn; > - struct hv_deposit_memory *input_page; > - unsigned long flags; > - > - if (num_pages > HV_DEPOSIT_MAX) > - return -E2BIG; > - if (!num_pages) > - return 0; > - > - /* One buffer for page pointers and counts */ > - page = alloc_page(GFP_KERNEL); > - if (!page) > - return -ENOMEM; > - pages = page_address(page); > - > - counts = kzalloc_objs(int, HV_DEPOSIT_MAX); > - if (!counts) { > - free_page((unsigned long)pages); > - return -ENOMEM; > - } > - > - /* Allocate all the pages before disabling interrupts */ > - i = 0; > - > - while (num_pages) { > - /* Find highest order we can actually allocate */ > - order = 31 - __builtin_clz(num_pages); > - > - while (1) { > - pages[i] = alloc_pages_node(node, GFP_KERNEL, order); > - if (pages[i]) > - break; > - if (!order) { > - ret = -ENOMEM; > - num_allocations = i; > - goto err_free_allocations; > - } > - --order; > - } > - > - split_page(pages[i], order); > - counts[i] = 1 << order; > - num_pages -= counts[i]; > - i++; > - } > - num_allocations = i; > - > - local_irq_save(flags); > - > - input_page = *this_cpu_ptr(hyperv_pcpu_input_arg); > - > - input_page->partition_id = partition_id; > - > - /* Populate gpa_page_list - these will fit on the input page */ > - for (i = 0, page_count = 0; i < num_allocations; ++i) { > - base_pfn = page_to_pfn(pages[i]); > - for (j = 0; j < counts[i]; ++j, ++page_count) > - input_page->gpa_page_list[page_count] = base_pfn + j; > - } > - status = hv_do_rep_hypercall(HVCALL_DEPOSIT_MEMORY, > - page_count, 0, input_page, NULL); > - local_irq_restore(flags); > - if (!hv_result_success(status)) { > - hv_status_err(status, "\n"); > - ret = hv_result_to_errno(status); > - goto err_free_allocations; > - } > - > - ret = 0; > - goto free_buf; > - > -err_free_allocations: > - for (i = 0; i < num_allocations; ++i) { > - base_pfn = page_to_pfn(pages[i]); > - for (j = 0; j < counts[i]; ++j) > - __free_page(pfn_to_page(base_pfn + j)); > - } > - > -free_buf: > - free_page((unsigned long)pages); > - kfree(counts); > - return ret; > + return -ENOTSUPP; > } > EXPORT_SYMBOL_GPL(hv_call_deposit_pages); > > -int hv_deposit_memory_node(int node, u64 partition_id, > - u64 hv_status) > +int hv_deposit_memory_node(int node, u64 partition_id, u64 hv_status) > { > - u32 num_pages = 1; > - > - switch (hv_result(hv_status)) { > - case HV_STATUS_INSUFFICIENT_MEMORY: > - break; > - case HV_STATUS_INSUFFICIENT_CONTIGUOUS_MEMORY: > - num_pages = HV_MAX_CONTIGUOUS_ALLOCATION_PAGES; > - break; > - > - case HV_STATUS_INSUFFICIENT_CONTIGUOUS_ROOT_MEMORY: > - num_pages = HV_MAX_CONTIGUOUS_ALLOCATION_PAGES; > - fallthrough; > - case HV_STATUS_INSUFFICIENT_ROOT_MEMORY: > - if (!hv_root_partition()) { > - hv_status_err(hv_status, "Unexpected root memory > deposit\n"); > - return -ENOMEM; > - } > - partition_id = HV_PARTITION_ID_SELF; > - break; > - > - default: > - hv_status_err(hv_status, "Unexpected!\n"); > - return -ENOMEM; > - } > - return hv_call_deposit_pages(node, partition_id, num_pages); > + return -ENOTSUPP; > } > EXPORT_SYMBOL_GPL(hv_deposit_memory_node); > > -- > 2.51.2.vfs.0.1 >

