-----Original Message-----
From: Julien Grall <jul...@xen.org>
Sent: 03 July 2020 11:36
To: Michał Leszczyński <michal.leszczyn...@cert.pl>;
xen-devel@lists.xenproject.org
Cc: luwei.k...@intel.com; tamas.leng...@intel.com; Andrew Cooper
<andrew.coop...@citrix.com>; George
Dunlap <george.dun...@citrix.com>; Ian Jackson <ian.jack...@eu.citrix.com>; Jan
Beulich
<jbeul...@suse.com>; Stefano Stabellini <sstabell...@kernel.org>; Wei Liu
<w...@xen.org>; p...@xen.org
Subject: Re: [PATCH v4 06/10] memory: batch processing in acquire_resource()
(+ Paul as the author XENMEM_acquire_resource)
Hi,
On 30/06/2020 13:33, Michał Leszczyński wrote:
From: Michal Leszczynski <michal.leszczyn...@cert.pl>
Allow to acquire large resources by allowing acquire_resource()
to process items in batches, using hypercall continuation.
Signed-off-by: Michal Leszczynski <michal.leszczyn...@cert.pl>
---
xen/common/memory.c | 32 +++++++++++++++++++++++++++++---
1 file changed, 29 insertions(+), 3 deletions(-)
diff --git a/xen/common/memory.c b/xen/common/memory.c
index 714077c1e5..3ab06581a2 100644
--- a/xen/common/memory.c
+++ b/xen/common/memory.c
@@ -1046,10 +1046,12 @@ static int acquire_grant_table(struct domain *d,
unsigned int id,
}
static int acquire_resource(
- XEN_GUEST_HANDLE_PARAM(xen_mem_acquire_resource_t) arg)
+ XEN_GUEST_HANDLE_PARAM(xen_mem_acquire_resource_t) arg,
+ unsigned long *start_extent)
{
struct domain *d, *currd = current->domain;
xen_mem_acquire_resource_t xmar;
+ uint32_t total_frames;
/*
* The mfn_list and gfn_list (below) arrays are ok on stack for the
* moment since they are small, but if they need to grow in future
@@ -1077,8 +1079,17 @@ static int acquire_resource(
return 0;
}
+ total_frames = xmar.nr_frames;
On 32-bit, the start_extent would be 26-bits wide which is not enough to
cover all the xmar.nr_frames. Therefore, you want that check that it is
possible to encode a continuation. Something like:
/* Is the size too large for us to encode a continuation? */
if ( unlikely(xmar.nr_frames > (UINT_MAX >> MEMOP_EXTENT_SHIFT)) )
+
+ if ( *start_extent ) > + {
+ xmar.frame += *start_extent;
+ xmar.nr_frames -= *start_extent;
As start_extent is exposed to the guest, you want to check if it is not
bigger than xmar.nr_frames.
+ guest_handle_add_offset(xmar.frame_list, *start_extent);
+ }
+
if ( xmar.nr_frames > ARRAY_SIZE(mfn_list) )
- return -E2BIG;
+ xmar.nr_frames = ARRAY_SIZE(mfn_list);
The documentation of the hypercall suggests that if you pass NULL, then
it will return the maximum number value for nr_frames supported by the
implementation. So technically a domain cannot use more than
ARRAY_SIZE(mfn_list).
However, you new addition conflict with the documentation. Can you
clarify how a domain will know that it can use more than
ARRAY_SIZE(mfn_list)?