Re: [PATCH V0 1/2] mshv: Stub out deposit memory functions

Wei Liu <[email protected]>
Newsgroups org.kernel.vger.linux-kernel,org.kernel.vger.linux-hyperv
Message-ID <[email protected]>
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
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.