From: Jason Andryuk <jason.andryuk@amd.com>
To: "Roger Pau Monné" <roger.pau@citrix.com>
Cc: <xen-devel@lists.xenproject.org>, <linux-kernel@vger.kernel.org>,
James Dingwall <james@dingwall.me.uk>,
Juergen Gross <jgross@suse.com>,
Stefano Stabellini <sstabellini@kernel.org>,
Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
Subject: Re: [PATCH] Partial revert "x86/xen: fix balloon target initialization for PVH dom0"
Date: Wed, 21 Jan 2026 12:21:33 -0500 [thread overview]
Message-ID: <d6e91265-b045-4257-8a41-6cb77a785924@amd.com> (raw)
In-Reply-To: <aXC1sFjIRUEB7qOW@Mac.lan>
[-- Attachment #1: Type: text/plain, Size: 2005 bytes --]
On 2026-01-21 06:17, Roger Pau Monné wrote:
> On Tue, Jan 20, 2026 at 03:10:06PM -0500, Jason Andryuk wrote:
>> On 2026-01-20 09:06, Roger Pau Monne wrote:
>>> This partially reverts commit 87af633689ce16ddb166c80f32b120e50b1295de so
>>> the current memory target for PV guests is still fetched from
>>> start_info->nr_pages, which matches exactly what the toolstack sets the
>>> initial memory target to.
>>>
>>> Using get_num_physpages() is possible on PV also, but needs adjusting to
>>> take into account the ISA hole and the PFN at 0 not considered usable
>>> memory depite being populated, and hence would need extra adjustments.
>>> Instead of carrying those extra adjustments switch back to the previous
>>> code. That leaves Linux with a difference in how current memory target is
>>> obtained for HVM vs PV, but that's better than adding extra logic just for
>>> PV.
>>>
>>> Also, for HVM the target is not (and has never been) accurately calculated,
>>> as in that case part of what starts as guest memory is reused by hvmloader
>>> and possibly other firmware to store ACPI tables and similar firmware
>>> information, thus the memory is no longer being reported as RAM in the
>>> memory map.
>>>
>>> Reported-by: James Dingwall <james@dingwall.me.uk>
>>> Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
>>
>> Reviewed-by: Jason Andryuk <jason.andryuk@amd.com>
>
> Thanks.
>
> I've been considering what we discussed and as a separate follow up we
> might want to attempt to switch to using `XENMEM_current_reservation`
> for dom0? It might make the accounting in PVH dom0 better, as that's
> what the toolstack uses to set the xenstore target when initializing
> dom0 values.
Yes, I thought that could be a follow on. I've attached what I have
tested, but it is based on a branch pre-dating xen_released_pages.
xenmem_current_reservation with PVH dom0 seemed good without the
xen_released_pages adjustment, but I don't know what that would be for a
PVH dom0.
Regards,
Jason
[-- Attachment #2: 0001-xen-balloon-Initialize-dom0-with-XENMEM_current_rese.patch --]
[-- Type: text/x-patch, Size: 3965 bytes --]
From 8b628ad0ebe52c30e31298e868f2f5187f2f52da Mon Sep 17 00:00:00 2001
From: Jason Andryuk <jason.andryuk@amd.com>
Date: Fri, 7 Nov 2025 16:44:53 -0500
Subject: [PATCH] xen/balloon: Initialize dom0 with XENMEM_current_reservation
The balloon driver bases its action off the memory/target and
memory/static-max xenstore keys. These are set by the toolstack and
match the domain's hypervisor allocated pages - domain_tot_pages().
However, PVH and HVM domains query get_num_physpages() for the initial
balloon driver current and target pages. get_num_physpages() is different
from dom_totain_pages(), and has been observed way off in a PVH dom0.
Here a PVH dom0 is assigned 917503 pages (3.5GB), but
get_num_physpages() is 7312455:
xen:balloon: pages curr 7312455 target 7312455
xen:balloon: current_reservation 917503
While Xen truncated the PVH dom0 memory map's RAM, Linux undoes that
operation and restores RAM regions in pvh_reserve_extra_memory().
Use XENMEM_current_reveration to initialize the balloon driver current
and target pages. This is the hypervisor value, and matches what the
toolstack writes. This avoids any ballooning from the inital
allocation. While domUs are affected, the implications of the change
are unclear - only make the change for dom0.
Signed-off-by: Jason Andryuk <jason.andryuk@amd.com>
---
drivers/xen/balloon.c | 9 ++++++---
drivers/xen/mem-reservation.c | 8 ++++++++
include/xen/interface/memory.h | 5 +++++
include/xen/mem-reservation.h | 2 ++
4 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
index 528395133b4f..fa6cbe6ce2ca 100644
--- a/drivers/xen/balloon.c
+++ b/drivers/xen/balloon.c
@@ -713,10 +713,13 @@ static int __init balloon_init(void)
#ifdef CONFIG_XEN_PV
balloon_stats.current_pages = xen_pv_domain()
- ? min(xen_start_info->nr_pages - xen_released_pages, max_pfn)
- : get_num_physpages();
+ ? min(xen_start_info->nr_pages - xen_released_pages, max_pfn) :
+ xen_initial_domain() ? xenmem_current_reservation() :
+ get_num_physpages();
#else
- balloon_stats.current_pages = get_num_physpages();
+ balloon_stats.current_pages =
+ xen_initial_domain() ? xenmem_current_reservation() :
+ get_num_physpages();
#endif
balloon_stats.target_pages = balloon_stats.current_pages;
balloon_stats.balloon_low = 0;
diff --git a/drivers/xen/mem-reservation.c b/drivers/xen/mem-reservation.c
index 24648836e0d4..40c5c40d34fe 100644
--- a/drivers/xen/mem-reservation.c
+++ b/drivers/xen/mem-reservation.c
@@ -113,3 +113,11 @@ int xenmem_reservation_decrease(int count, xen_pfn_t *frames)
return HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation);
}
EXPORT_SYMBOL_GPL(xenmem_reservation_decrease);
+
+long xenmem_current_reservation(void)
+{
+ struct xen_memory_domain domain = { .domid = DOMID_SELF };
+
+ return HYPERVISOR_memory_op(XENMEM_current_reservation, &domain);
+}
+EXPORT_SYMBOL_GPL(xenmem_current_reservation);
diff --git a/include/xen/interface/memory.h b/include/xen/interface/memory.h
index 1a371a825c55..72619a75fed2 100644
--- a/include/xen/interface/memory.h
+++ b/include/xen/interface/memory.h
@@ -104,6 +104,11 @@ DEFINE_GUEST_HANDLE_STRUCT(xen_memory_exchange);
*/
#define XENMEM_maximum_ram_page 2
+struct xen_memory_domain {
+ /* [IN] Domain information is being queried for. */
+ domid_t domid;
+};
+
/*
* Returns the current or maximum memory reservation, in pages, of the
* specified domain (may be DOMID_SELF). Returns -ve errcode on failure.
diff --git a/include/xen/mem-reservation.h b/include/xen/mem-reservation.h
index a2ab516fcd2c..e86f0dcd7b7f 100644
--- a/include/xen/mem-reservation.h
+++ b/include/xen/mem-reservation.h
@@ -57,4 +57,6 @@ int xenmem_reservation_increase(int count, xen_pfn_t *frames);
int xenmem_reservation_decrease(int count, xen_pfn_t *frames);
+long xenmem_current_reservation(void);
+
#endif
--
2.52.0
next prev parent reply other threads:[~2026-01-21 17:21 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-20 14:06 Roger Pau Monne
2026-01-20 15:33 ` Roger Pau Monné
2026-01-20 20:10 ` Jason Andryuk
2026-01-21 11:17 ` Roger Pau Monné
2026-01-21 17:21 ` Jason Andryuk [this message]
2026-01-21 17:49 ` Roger Pau Monné
2026-01-22 7:17 ` Jan Beulich
2026-01-22 8:23 ` Roger Pau Monné
2026-01-22 14:40 ` Jason Andryuk
2026-01-22 16:57 ` Roger Pau Monné
2026-01-22 17:03 ` Jason Andryuk
2026-01-22 17:46 ` Roger Pau Monné
2026-01-21 11:03 ` James Dingwall
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=d6e91265-b045-4257-8a41-6cb77a785924@amd.com \
--to=jason.andryuk@amd.com \
--cc=james@dingwall.me.uk \
--cc=jgross@suse.com \
--cc=linux-kernel@vger.kernel.org \
--cc=oleksandr_tyshchenko@epam.com \
--cc=roger.pau@citrix.com \
--cc=sstabellini@kernel.org \
--cc=xen-devel@lists.xenproject.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®