All of lore.kernel.org
 help / color / mirror / Atom feed
From: Easwar Hariharan <easwar.hariharan@linux.microsoft.com>
To: Nuno Das Neves <nunodasneves@linux.microsoft.com>
Cc: linux-hyperv@vger.kernel.org, linux-kernel@vger.kernel.org,
	easwar.hariharan@linux.microsoft.com, kys@microsoft.com,
	haiyangz@microsoft.com, wei.liu@kernel.org, mhklinux@outlook.com,
	decui@microsoft.com, paekkaladevi@linux.microsoft.com,
	Jinank Jain <jinankjain@linux.microsoft.com>
Subject: Re: [PATCH 6/6] mshv: Introduce new hypercall to map stats page for L1VH partitions
Date: Fri, 5 Sep 2025 12:50:33 -0700	[thread overview]
Message-ID: <ed4ebc67-dc98-4ce4-af5e-b2f371d27c5b@linux.microsoft.com> (raw)
In-Reply-To: <1756428230-3599-7-git-send-email-nunodasneves@linux.microsoft.com>

On 8/28/2025 5:43 PM, Nuno Das Neves wrote:
> From: Jinank Jain <jinankjain@linux.microsoft.com>
> 
> Introduce HVCALL_MAP_STATS_PAGE2 which provides a map location (GPFN)
> to map the stats to. This hypercall is required for L1VH partitions,
> depending on the hypervisor version. This uses the same check as the
> state page map location; mshv_use_overlay_gpfn().
> 
> Add mshv_map_vp_state_page() helpers to use this new hypercall or the
> old one depending on availability.
> 
> For unmapping, the original HVCALL_UNMAP_STATS_PAGE works for both
> cases.
> 
> Signed-off-by: Jinank Jain <jinankjain@linux.microsoft.com>
> Signed-off-by: Nuno Das Neves <nunodasneves@linux.microsoft.com>
> ---
>  drivers/hv/mshv_root.h         | 10 ++--
>  drivers/hv/mshv_root_hv_call.c | 92 ++++++++++++++++++++++++++++++++--
>  drivers/hv/mshv_root_main.c    | 25 +++++----
>  include/hyperv/hvgdk_mini.h    |  1 +
>  include/hyperv/hvhdk_mini.h    |  7 +++
>  5 files changed, 115 insertions(+), 20 deletions(-)
> 
> diff --git a/drivers/hv/mshv_root.h b/drivers/hv/mshv_root.h
> index d7c9520ef788..d16a020ae0ee 100644
> --- a/drivers/hv/mshv_root.h
> +++ b/drivers/hv/mshv_root.h
> @@ -297,11 +297,11 @@ int hv_call_connect_port(u64 port_partition_id, union hv_port_id port_id,
>  int hv_call_disconnect_port(u64 connection_partition_id,
>  			    union hv_connection_id connection_id);
>  int hv_call_notify_port_ring_empty(u32 sint_index);
> -int hv_call_map_stat_page(enum hv_stats_object_type type,
> -			  const union hv_stats_object_identity *identity,
> -			  void **addr);
> -int hv_call_unmap_stat_page(enum hv_stats_object_type type,
> -			    const union hv_stats_object_identity *identity);
> +int hv_map_stats_page(enum hv_stats_object_type type,
> +		      const union hv_stats_object_identity *identity,
> +		      void **addr);
> +int hv_unmap_stats_page(enum hv_stats_object_type type, void *page_addr,
> +			const union hv_stats_object_identity *identity);
>  int hv_call_modify_spa_host_access(u64 partition_id, struct page **pages,
>  				   u64 page_struct_count, u32 host_access,
>  				   u32 flags, u8 acquire);
> diff --git a/drivers/hv/mshv_root_hv_call.c b/drivers/hv/mshv_root_hv_call.c
> index 1882cc90f2f5..44013751cfc1 100644
> --- a/drivers/hv/mshv_root_hv_call.c
> +++ b/drivers/hv/mshv_root_hv_call.c
> @@ -804,6 +804,45 @@ hv_call_notify_port_ring_empty(u32 sint_index)
>  	return hv_result_to_errno(status);
>  }
>  
> +static int
> +hv_call_map_stats_page2(enum hv_stats_object_type type,

Again, one line please. Also below.

> +			const union hv_stats_object_identity *identity,
> +			u64 map_location)
> +{
> +	unsigned long flags;
> +	struct hv_input_map_stats_page2 *input;
> +	u64 status;
> +	int ret;
> +
> +	if (!map_location || !mshv_use_overlay_gpfn())
> +		return -EINVAL;
> +
> +	do {
> +		local_irq_save(flags);
> +		input = *this_cpu_ptr(hyperv_pcpu_input_arg);
> +
> +		memset(input, 0, sizeof(*input));
> +		input->type = type;
> +		input->identity = *identity;
> +		input->map_location = map_location;
> +
> +		status = hv_do_hypercall(HVCALL_MAP_STATS_PAGE2, input, NULL);
> +
> +		local_irq_restore(flags);
> +		if (hv_result(status) != HV_STATUS_INSUFFICIENT_MEMORY) {
> +			if (hv_result_success(status))
> +				break;
> +			hv_status_debug(status, "\n");
> +			return hv_result_to_errno(status);
> +		}
> +
> +		ret = hv_call_deposit_pages(NUMA_NO_NODE,
> +					    hv_current_partition_id, 1);
> +	} while (!ret);
> +
> +	return ret;
> +}
> +
>  static int
>  hv_stats_get_area_type(enum hv_stats_object_type type,
>  		       const union hv_stats_object_identity *identity)
> @@ -822,9 +861,10 @@ hv_stats_get_area_type(enum hv_stats_object_type type,
>  	return -EINVAL;
>  }
>  
> -int hv_call_map_stat_page(enum hv_stats_object_type type,
> -			  const union hv_stats_object_identity *identity,
> -			  void **addr)
> +static int
> +hv_call_map_stats_page(enum hv_stats_object_type type,
> +		       const union hv_stats_object_identity *identity,
> +		       void **addr)

...

>  {
>  	unsigned long flags;
>  	struct hv_input_map_stats_page *input;
> @@ -880,8 +920,37 @@ int hv_call_map_stat_page(enum hv_stats_object_type type,
>  	return ret;
>  }
>  
> -int hv_call_unmap_stat_page(enum hv_stats_object_type type,
> -			    const union hv_stats_object_identity *identity)
> +int hv_map_stats_page(enum hv_stats_object_type type,
> +		      const union hv_stats_object_identity *identity,
> +		      void **addr)
> +{
> +	int ret;
> +	struct page *allocated_page = NULL;
> +
> +	if (!addr)
> +		return -EINVAL;
> +
> +	if (mshv_use_overlay_gpfn()) {
> +		allocated_page = alloc_page(GFP_KERNEL);
> +		if (!allocated_page)
> +			return -ENOMEM;
> +
> +		ret = hv_call_map_stats_page2(type, identity,
> +					      page_to_pfn(allocated_page));
> +		*addr = page_address(allocated_page);
> +	} else {
> +		ret = hv_call_map_stats_page(type, identity, addr);
> +	}
> +
> +	if (ret && allocated_page)
> +		__free_page(allocated_page);
> +
> +	return ret;
> +}
> +
> +static int
> +hv_call_unmap_stats_page(enum hv_stats_object_type type,

...

> +			 const union hv_stats_object_identity *identity)
>  {
>  	unsigned long flags;
>  	struct hv_input_unmap_stats_page *input;
> @@ -900,6 +969,19 @@ int hv_call_unmap_stat_page(enum hv_stats_object_type type,
>  	return hv_result_to_errno(status);
>  }
>  
> +int hv_unmap_stats_page(enum hv_stats_object_type type, void *page_addr,
> +			const union hv_stats_object_identity *identity)
> +{
> +	int ret;
> +
> +	ret = hv_call_unmap_stats_page(type, identity);
> +
> +	if (mshv_use_overlay_gpfn() && page_addr)
> +		__free_page(virt_to_page(page_addr));
> +
> +	return ret;
> +}
> +
>  int hv_call_modify_spa_host_access(u64 partition_id, struct page **pages,
>  				   u64 page_struct_count, u32 host_access,
>  				   u32 flags, u8 acquire)
> diff --git a/drivers/hv/mshv_root_main.c b/drivers/hv/mshv_root_main.c
> index f91880cc9e29..1699423cc524 100644
> --- a/drivers/hv/mshv_root_main.c
> +++ b/drivers/hv/mshv_root_main.c
> @@ -894,7 +894,8 @@ mshv_vp_release(struct inode *inode, struct file *filp)
>  	return 0;
>  }
>  
> -static void mshv_vp_stats_unmap(u64 partition_id, u32 vp_index)
> +static void mshv_vp_stats_unmap(u64 partition_id, u32 vp_index,
> +				void *stats_pages[])
>  {
>  	union hv_stats_object_identity identity = {
>  		.vp.partition_id = partition_id,
> @@ -902,10 +903,13 @@ static void mshv_vp_stats_unmap(u64 partition_id, u32 vp_index)
>  	};
>  
>  	identity.vp.stats_area_type = HV_STATS_AREA_SELF;
> -	hv_call_unmap_stat_page(HV_STATS_OBJECT_VP, &identity);
> +	hv_unmap_stats_page(HV_STATS_OBJECT_VP, NULL, &identity);
> +
> +	if (stats_pages[HV_STATS_AREA_PARENT] == stats_pages[HV_STATS_AREA_SELF])
> +		return;
>  
>  	identity.vp.stats_area_type = HV_STATS_AREA_PARENT;
> -	hv_call_unmap_stat_page(HV_STATS_OBJECT_VP, &identity);
> +	hv_unmap_stats_page(HV_STATS_OBJECT_VP, NULL, &identity);
>  }
>  
>  static int mshv_vp_stats_map(u64 partition_id, u32 vp_index,
> @@ -918,14 +922,14 @@ static int mshv_vp_stats_map(u64 partition_id, u32 vp_index,
>  	int err;
>  
>  	identity.vp.stats_area_type = HV_STATS_AREA_SELF;
> -	err = hv_call_map_stat_page(HV_STATS_OBJECT_VP, &identity,
> -				    &stats_pages[HV_STATS_AREA_SELF]);
> +	err = hv_map_stats_page(HV_STATS_OBJECT_VP, &identity,
> +				&stats_pages[HV_STATS_AREA_SELF]);

Shouldn't this be in the previous patch where the other hv_call_map_stat_page() calls were
converted, same below?

>  	if (err)
>  		return err;
>  
>  	identity.vp.stats_area_type = HV_STATS_AREA_PARENT;
> -	err = hv_call_map_stat_page(HV_STATS_OBJECT_VP, &identity,
> -				    &stats_pages[HV_STATS_AREA_PARENT]);
> +	err = hv_map_stats_page(HV_STATS_OBJECT_VP, &identity,
> +				&stats_pages[HV_STATS_AREA_PARENT]);

...

>  	if (err)
>  		goto unmap_self;
>  
> @@ -936,7 +940,7 @@ static int mshv_vp_stats_map(u64 partition_id, u32 vp_index,
>  
>  unmap_self:
>  	identity.vp.stats_area_type = HV_STATS_AREA_SELF;
> -	hv_call_unmap_stat_page(HV_STATS_OBJECT_VP, &identity);
> +	hv_unmap_stats_page(HV_STATS_OBJECT_VP, NULL, &identity);
>  	return err;
>  }
>

<snip>

  reply	other threads:[~2025-09-05 19:50 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-08-29  0:43 [PATCH 0/6] mshv: Fixes for stats and vp state page mappings Nuno Das Neves
2025-08-29  0:43 ` [PATCH 1/6] mshv: Only map vp->vp_stats_pages if on root scheduler Nuno Das Neves
2025-09-04 17:00   ` Anirudh Rayabharam
2025-09-05 15:20   ` Praveen K Paladugu
2025-09-05 19:43   ` Easwar Hariharan
2025-09-06  7:11   ` Tianyu Lan
2025-08-29  0:43 ` [PATCH 2/6] mshv: Ignore second stats page map result failure Nuno Das Neves
2025-09-05 15:31   ` Praveen K Paladugu
2025-09-05 18:48     ` Nuno Das Neves
2025-09-05 19:21   ` Easwar Hariharan
2025-09-08 17:04     ` Nuno Das Neves
2025-09-08 17:22       ` Easwar Hariharan
2025-09-08 18:06         ` Nuno Das Neves
2025-09-09 14:52           ` Praveen K Paladugu
2025-09-09 16:27             ` Easwar Hariharan
2025-09-09 17:31               ` Nuno Das Neves
2025-09-06 17:30   ` Tianyu Lan
2025-08-29  0:43 ` [PATCH 3/6] mshv: Add the HVCALL_GET_PARTITION_PROPERTY_EX hypercall Nuno Das Neves
2025-09-04 17:12   ` Anirudh Rayabharam
2025-09-05 15:40   ` Praveen K Paladugu
2025-09-05 19:28   ` Easwar Hariharan
2025-09-05 23:13     ` Nuno Das Neves
2025-08-29  0:43 ` [PATCH 4/6] mshv: Get the vmm capabilities offered by the hypervisor Nuno Das Neves
2025-09-05 15:43   ` Praveen K Paladugu
2025-09-05 18:49     ` Nuno Das Neves
2025-09-05 19:03   ` Anirudh Rayabharam
2025-09-05 23:07     ` Nuno Das Neves
2025-09-05 19:29   ` Easwar Hariharan
2025-09-06 17:34   ` Tianyu Lan
2025-08-29  0:43 ` [PATCH 5/6] mshv: Allocate vp state page for HVCALL_MAP_VP_STATE_PAGE on L1VH Nuno Das Neves
2025-09-05 16:18   ` Praveen K Paladugu
2025-09-05 19:41   ` Easwar Hariharan
2025-08-29  0:43 ` [PATCH 6/6] mshv: Introduce new hypercall to map stats page for L1VH partitions Nuno Das Neves
2025-09-05 19:50   ` Easwar Hariharan [this message]
2025-09-05 23:12     ` Nuno Das Neves
2025-09-08 16:26       ` Easwar Hariharan

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=ed4ebc67-dc98-4ce4-af5e-b2f371d27c5b@linux.microsoft.com \
    --to=easwar.hariharan@linux.microsoft.com \
    --cc=decui@microsoft.com \
    --cc=haiyangz@microsoft.com \
    --cc=jinankjain@linux.microsoft.com \
    --cc=kys@microsoft.com \
    --cc=linux-hyperv@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mhklinux@outlook.com \
    --cc=nunodasneves@linux.microsoft.com \
    --cc=paekkaladevi@linux.microsoft.com \
    --cc=wei.liu@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.