From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 2651F356A16; Tue, 27 Jan 2026 19:44:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=13.77.154.182 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769543068; cv=none; b=Z9KrqSmN2Okfx7yXhNuN81qKfWgznRSFkpOlX8URbOl94g6bPK04v8AFXJunw7WZWp/9dqYMWV48NCFSf7laQok+b667X8Ybz/MD3yqoVjk2mUFzJ+5oMsyRkOe1lZ7DTTuPD5Ag+oEZ+7EpuO2JYNltG/GaHfILXVJODzdbAXo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769543068; c=relaxed/simple; bh=YUzlXIRQcNl143bqXuNHEcG6dvgpIweNDE9iN21UCfE=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=QMwcdNYPaKGGjbByMGGAE2Z4ZneENMNUqmKUOdyPbxv9johUQWZjlb2c0T/Z4ebXnK3e2B5OTTCP8eAE6pVyfNlUWzp79f7OwUmT+GQv4vWI3S2N964aa/QMCtYVQobQsi/eaLfWFb/UjbB4sh+Nwtx2LFZelLa4NJWGR63MfVM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.microsoft.com; spf=pass smtp.mailfrom=linux.microsoft.com; dkim=pass (1024-bit key) header.d=linux.microsoft.com header.i=@linux.microsoft.com header.b=N98vCBsp; arc=none smtp.client-ip=13.77.154.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.microsoft.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.microsoft.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.microsoft.com header.i=@linux.microsoft.com header.b="N98vCBsp" Received: from [192.168.0.88] (192-184-212-33.fiber.dynamic.sonic.net [192.184.212.33]) by linux.microsoft.com (Postfix) with ESMTPSA id 5976A20B7165; Tue, 27 Jan 2026 11:44:26 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 5976A20B7165 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1769543066; bh=CGlfvffTsj1Of/OdXHacaZj5Y0P8py6qzmoydypAPYA=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=N98vCBsptVPIMTCd2YFWiJgq4Yc5kyYGd2iFngbIJe6rIi37nGh5OgYlLKzkQIVFC pze6XgX6zIsEUovch8tqP1e+Q0y0jAjV1AH6wk3H6HZ0p6jxHte3dTJ60AePI3bV7E uK+HJd/acuQRoe/qnqTWSz2i0Fx77S8kmRcYt0Rk= Message-ID: <8d141a6a-d06f-f91a-686b-82f8f0facabc@linux.microsoft.com> Date: Tue, 27 Jan 2026 11:44:25 -0800 Precedence: bulk X-Mailing-List: linux-hyperv@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.13.1 Subject: Re: [PATCH 2/4] mshv: Introduce hv_deposit_memory helper functions Content-Language: en-US To: Stanislav Kinsburskii Cc: kys@microsoft.com, haiyangz@microsoft.com, wei.liu@kernel.org, decui@microsoft.com, longli@microsoft.com, linux-hyperv@vger.kernel.org, linux-kernel@vger.kernel.org References: <176913164914.89165.5792608454600292463.stgit@skinsburskii-cloud-desktop.internal.cloudapp.net> <176913212322.89165.12915292926444353627.stgit@skinsburskii-cloud-desktop.internal.cloudapp.net> <23f52e20-f156-a2aa-ff04-00dc55238c51@linux.microsoft.com> From: Mukesh R In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 1/27/26 10:30, Stanislav Kinsburskii wrote: > On Mon, Jan 26, 2026 at 06:06:23PM -0800, Mukesh R wrote: >> On 1/25/26 14:41, Stanislav Kinsburskii wrote: >>> On Fri, Jan 23, 2026 at 04:33:39PM -0800, Mukesh R wrote: >>>> On 1/22/26 17:35, Stanislav Kinsburskii wrote: >>>>> Introduce hv_deposit_memory_node() and hv_deposit_memory() helper >>>>> functions to handle memory deposition with proper error handling. >>>>> >>>>> The new hv_deposit_memory_node() function takes the hypervisor status >>>>> as a parameter and validates it before depositing pages. It checks for >>>>> HV_STATUS_INSUFFICIENT_MEMORY specifically and returns an error for >>>>> unexpected status codes. >>>>> >>>>> This is a precursor patch to new out-of-memory error codes support. >>>>> No functional changes intended. >>>>> >>>>> Signed-off-by: Stanislav Kinsburskii >>>>> --- >>>>> drivers/hv/hv_proc.c | 22 ++++++++++++++++++++-- >>>>> drivers/hv/mshv_root_hv_call.c | 25 +++++++++---------------- >>>>> drivers/hv/mshv_root_main.c | 3 +-- >>>>> include/asm-generic/mshyperv.h | 10 ++++++++++ >>>>> 4 files changed, 40 insertions(+), 20 deletions(-) >>>>> >>>>> diff --git a/drivers/hv/hv_proc.c b/drivers/hv/hv_proc.c >>>>> index 80c66d1c74d5..c0c2bfc80d77 100644 >>>>> --- a/drivers/hv/hv_proc.c >>>>> +++ b/drivers/hv/hv_proc.c >>>>> @@ -110,6 +110,23 @@ int hv_call_deposit_pages(int node, u64 partition_id, u32 num_pages) >>>>> } >>>>> EXPORT_SYMBOL_GPL(hv_call_deposit_pages); >>>>> +int hv_deposit_memory_node(int node, u64 partition_id, >>>>> + u64 hv_status) >>>>> +{ >>>>> + u32 num_pages; >>>>> + >>>>> + switch (hv_result(hv_status)) { >>>>> + case HV_STATUS_INSUFFICIENT_MEMORY: >>>>> + num_pages = 1; >>>>> + break; >>>>> + default: >>>>> + hv_status_err(hv_status, "Unexpected!\n"); >>>>> + return -ENOMEM; >>>>> + } >>>>> + return hv_call_deposit_pages(node, partition_id, num_pages); >>>>> +} >>>>> +EXPORT_SYMBOL_GPL(hv_deposit_memory_node); >>>>> + >>>> >>>> Different hypercalls may want to deposit different number of pages in one >>>> shot. As feature evolves, page sizes get mixed, we'd almost need that >>>> flexibility. So, imo, either we just don't do this for now, or add num pages >>>> parameter to be passed down. >>>> >>> >>> What you do mean by "page sizes get mixed"? >>> A helper to deposit num pages already exists: its >>> hv_call_deposit_pages(). >> >> My point, you are removing number of pages, and we may want to keep >> that so one can quickly play around and change them. >> >> - ret = hv_call_deposit_pages(NUMA_NO_NODE, >> - pt_id, 1); >> + ret = hv_deposit_memory(pt_id, status); >> >> For example, in hv_call_initialize_partition() we may realize after >> some analysis that depositing 2 pages or 4 pages is much better. >> > > We have been using this 1-page deposit logic from the beginning. To > change the number of pages, simply replace hv_deposit_memory with > hv_call_deposit_pages and specify the desired number of pages. You could perhaps rename it to hv_deposit_page(). > The proposed approach reduces code duplication and is less error-prone, > as there are multiple error codes to handle. Consolidating the logic > also makes the driver more robust. > > > Thanks, Stanislav > >>> Thanks, >>> Stanislav >>> >>>> Thanks, >>>> -Mukesh >>>> >>>> >>>> >>>>> bool hv_result_oom(u64 status) >>>>> { >>>>> switch (hv_result(status)) { >>>>> @@ -155,7 +172,8 @@ int hv_call_add_logical_proc(int node, u32 lp_index, u32 apic_id) >>>>> } >>>>> break; >>>>> } >>>>> - ret = hv_call_deposit_pages(node, hv_current_partition_id, 1); >>>>> + ret = hv_deposit_memory_node(node, hv_current_partition_id, >>>>> + status); >>>>> } while (!ret); >>>>> return ret; >>>>> @@ -197,7 +215,7 @@ int hv_call_create_vp(int node, u64 partition_id, u32 vp_index, u32 flags) >>>>> } >>>>> break; >>>>> } >>>>> - ret = hv_call_deposit_pages(node, partition_id, 1); >>>>> + ret = hv_deposit_memory_node(node, partition_id, status); >>>>> } while (!ret); >>>>> diff --git a/drivers/hv/mshv_root_hv_call.c b/drivers/hv/mshv_root_hv_call.c >>>>> index 58c5cbf2e567..06f2bac8039d 100644 >>>>> --- a/drivers/hv/mshv_root_hv_call.c >>>>> +++ b/drivers/hv/mshv_root_hv_call.c >>>>> @@ -123,8 +123,7 @@ int hv_call_create_partition(u64 flags, >>>>> break; >>>>> } >>>>> local_irq_restore(irq_flags); >>>>> - ret = hv_call_deposit_pages(NUMA_NO_NODE, >>>>> - hv_current_partition_id, 1); >>>>> + ret = hv_deposit_memory(hv_current_partition_id, status); >>>>> } while (!ret); >>>>> return ret; >>>>> @@ -151,7 +150,7 @@ int hv_call_initialize_partition(u64 partition_id) >>>>> ret = hv_result_to_errno(status); >>>>> break; >>>>> } >>>>> - ret = hv_call_deposit_pages(NUMA_NO_NODE, partition_id, 1); >>>>> + ret = hv_deposit_memory(partition_id, status); >>>>> } while (!ret); >>>>> return ret; >>>>> @@ -465,8 +464,7 @@ int hv_call_get_vp_state(u32 vp_index, u64 partition_id, >>>>> } >>>>> local_irq_restore(flags); >>>>> - ret = hv_call_deposit_pages(NUMA_NO_NODE, >>>>> - partition_id, 1); >>>>> + ret = hv_deposit_memory(partition_id, status); >>>>> } while (!ret); >>>>> return ret; >>>>> @@ -525,8 +523,7 @@ int hv_call_set_vp_state(u32 vp_index, u64 partition_id, >>>>> } >>>>> local_irq_restore(flags); >>>>> - ret = hv_call_deposit_pages(NUMA_NO_NODE, >>>>> - partition_id, 1); >>>>> + ret = hv_deposit_memory(partition_id, status); >>>>> } while (!ret); >>>>> return ret; >>>>> @@ -573,7 +570,7 @@ static int hv_call_map_vp_state_page(u64 partition_id, u32 vp_index, u32 type, >>>>> local_irq_restore(flags); >>>>> - ret = hv_call_deposit_pages(NUMA_NO_NODE, partition_id, 1); >>>>> + ret = hv_deposit_memory(partition_id, status); >>>>> } while (!ret); >>>>> return ret; >>>>> @@ -722,8 +719,7 @@ hv_call_create_port(u64 port_partition_id, union hv_port_id port_id, >>>>> ret = hv_result_to_errno(status); >>>>> break; >>>>> } >>>>> - ret = hv_call_deposit_pages(NUMA_NO_NODE, port_partition_id, 1); >>>>> - >>>>> + ret = hv_deposit_memory(port_partition_id, status); >>>>> } while (!ret); >>>>> return ret; >>>>> @@ -776,8 +772,7 @@ hv_call_connect_port(u64 port_partition_id, union hv_port_id port_id, >>>>> ret = hv_result_to_errno(status); >>>>> break; >>>>> } >>>>> - ret = hv_call_deposit_pages(NUMA_NO_NODE, >>>>> - connection_partition_id, 1); >>>>> + ret = hv_deposit_memory(connection_partition_id, status); >>>>> } while (!ret); >>>>> return ret; >>>>> @@ -848,8 +843,7 @@ static int hv_call_map_stats_page2(enum hv_stats_object_type type, >>>>> break; >>>>> } >>>>> - ret = hv_call_deposit_pages(NUMA_NO_NODE, >>>>> - hv_current_partition_id, 1); >>>>> + ret = hv_deposit_memory(hv_current_partition_id, status); >>>>> } while (!ret); >>>>> return ret; >>>>> @@ -885,8 +879,7 @@ static int hv_call_map_stats_page(enum hv_stats_object_type type, >>>>> return ret; >>>>> } >>>>> - ret = hv_call_deposit_pages(NUMA_NO_NODE, >>>>> - hv_current_partition_id, 1); >>>>> + ret = hv_deposit_memory(hv_current_partition_id, status); >>>>> if (ret) >>>>> return ret; >>>>> } while (!ret); >>>>> diff --git a/drivers/hv/mshv_root_main.c b/drivers/hv/mshv_root_main.c >>>>> index f4697497f83e..5fc572e31cd7 100644 >>>>> --- a/drivers/hv/mshv_root_main.c >>>>> +++ b/drivers/hv/mshv_root_main.c >>>>> @@ -264,8 +264,7 @@ static int mshv_ioctl_passthru_hvcall(struct mshv_partition *partition, >>>>> if (!hv_result_oom(status)) >>>>> ret = hv_result_to_errno(status); >>>>> else >>>>> - ret = hv_call_deposit_pages(NUMA_NO_NODE, >>>>> - pt_id, 1); >>>>> + ret = hv_deposit_memory(pt_id, status); >>>>> } while (!ret); >>>>> args.status = hv_result(status); >>>>> diff --git a/include/asm-generic/mshyperv.h b/include/asm-generic/mshyperv.h >>>>> index b73352a7fc9e..c8e8976839f8 100644 >>>>> --- a/include/asm-generic/mshyperv.h >>>>> +++ b/include/asm-generic/mshyperv.h >>>>> @@ -344,6 +344,7 @@ static inline bool hv_parent_partition(void) >>>>> } >>>>> bool hv_result_oom(u64 status); >>>>> +int hv_deposit_memory_node(int node, u64 partition_id, u64 status); >>>>> int hv_call_deposit_pages(int node, u64 partition_id, u32 num_pages); >>>>> int hv_call_add_logical_proc(int node, u32 lp_index, u32 acpi_id); >>>>> int hv_call_create_vp(int node, u64 partition_id, u32 vp_index, u32 flags); >>>>> @@ -353,6 +354,10 @@ static inline bool hv_root_partition(void) { return false; } >>>>> static inline bool hv_l1vh_partition(void) { return false; } >>>>> static inline bool hv_parent_partition(void) { return false; } >>>>> static inline bool hv_result_oom(u64 status) { return false; } >>>>> +static inline int hv_deposit_memory_node(int node, u64 partition_id, u64 status) >>>>> +{ >>>>> + return -EOPNOTSUPP; >>>>> +} >>>>> static inline int hv_call_deposit_pages(int node, u64 partition_id, u32 num_pages) >>>>> { >>>>> return -EOPNOTSUPP; >>>>> @@ -367,6 +372,11 @@ static inline int hv_call_create_vp(int node, u64 partition_id, u32 vp_index, u3 >>>>> } >>>>> #endif /* CONFIG_MSHV_ROOT */ >>>>> +static inline int hv_deposit_memory(u64 partition_id, u64 status) >>>>> +{ >>>>> + return hv_deposit_memory_node(NUMA_NO_NODE, partition_id, status); >>>>> +} >>>>> + >>>>> #if IS_ENABLED(CONFIG_HYPERV_VTL_MODE) >>>>> u8 __init get_vtl(void); >>>>> #else >>>>> >>>>>