Re: [Xen-devel] [PATCH v7 14/16] xen: make grant resource limits per domain

2017-09-19 Thread Paul Durrant
> -Original Message-
> From: Xen-devel [mailto:xen-devel-boun...@lists.xen.org] On Behalf Of
> Juergen Gross
> Sent: 19 September 2017 10:59
> To: xen-de...@lists.xenproject.org
> Cc: Juergen Gross <jgr...@suse.com>; sstabell...@kernel.org; Wei Liu
> <wei.l...@citrix.com>; George Dunlap <george.dun...@citrix.com>;
> Andrew Cooper <andrew.coop...@citrix.com>; Ian Jackson
> <ian.jack...@citrix.com>; Tim (Xen.org) <t...@xen.org>;
> julien.gr...@arm.com; jbeul...@suse.com; dgde...@tycho.nsa.gov
> Subject: [Xen-devel] [PATCH v7 14/16] xen: make grant resource limits per
> domain
> 
> Instead of using the same global resource limits of grant tables (max.
> number of grant frames, max. number of maptrack frames) for all domains
> make these limits per domain. Set those per-domain limits in
> grant_table_set_limits().
> 
> Signed-off-by: Juergen Gross <jgr...@suse.com>

Reviewed-by: Paul Durrant <paul.durr...@citrix.com>

> ---
> V6:
> - several changes due to new patch order
> 
> V3:
> - correct error message (Paul Durrant)
> ---
>  xen/common/compat/grant_table.c   |  31 +++---
>  xen/common/grant_table.c  | 121 
> --
>  xen/include/asm-arm/grant_table.h |   6 +-
>  3 files changed, 88 insertions(+), 70 deletions(-)
> 
> diff --git a/xen/common/compat/grant_table.c
> b/xen/common/compat/grant_table.c
> index cce3ff0b9a..ff1d678f01 100644
> --- a/xen/common/compat/grant_table.c
> +++ b/xen/common/compat/grant_table.c
> @@ -157,21 +157,14 @@ int compat_grant_table_op(unsigned int cmd,
>  unsigned int max_frame_list_size_in_page =
>  (COMPAT_ARG_XLAT_SIZE - sizeof(*nat.setup)) /
>  sizeof(*nat.setup->frame_list.p);
> -if ( max_frame_list_size_in_page < max_grant_frames )
> -{
> -gdprintk(XENLOG_WARNING,
> - "max_grant_frames is too large (%u,%u)\n",
> - max_grant_frames, max_frame_list_size_in_page);
> -rc = -EINVAL;
> -}
> -else
> -{
> +
>  #define XLAT_gnttab_setup_table_HNDL_frame_list(_d_, _s_) \
> -set_xen_guest_handle((_d_)->frame_list, (unsigned long
> *)(nat.setup + 1))
> -XLAT_gnttab_setup_table(nat.setup, );
> +set_xen_guest_handle((_d_)->frame_list, (unsigned long
> *)(nat.setup + 1))
> +XLAT_gnttab_setup_table(nat.setup, );
>  #undef XLAT_gnttab_setup_table_HNDL_frame_list
> -rc = gnttab_setup_table(guest_handle_cast(nat.uop,
> gnttab_setup_table_t), 1);
> -}
> +rc = gnttab_setup_table(guest_handle_cast(nat.uop,
> +  
> gnttab_setup_table_t),
> +1, max_frame_list_size_in_page);
>  }
>  ASSERT(rc <= 0);
>  if ( rc == 0 )
> @@ -294,16 +287,6 @@ int compat_grant_table_op(unsigned int cmd,
>  rc = -EFAULT;
>  break;
>  }
> -if ( max_frame_list_size_in_pages <
> - grant_to_status_frames(max_grant_frames) )
> -{
> -gdprintk(XENLOG_WARNING,
> - "grant_to_status_frames(max_grant_frames) is too 
> large
> (%u,%u)\n",
> - grant_to_status_frames(max_grant_frames),
> - max_frame_list_size_in_pages);
> -rc = -EINVAL;
> -break;
> -}
> 
>  #define XLAT_gnttab_get_status_frames_HNDL_frame_list(_d_, _s_) \
>  set_xen_guest_handle((_d_)->frame_list, (uint64_t 
> *)(nat.get_status
> + 1))
> @@ -312,7 +295,7 @@ int compat_grant_table_op(unsigned int cmd,
> 
>  rc = gnttab_get_status_frames(
>  guest_handle_cast(nat.uop, gnttab_get_status_frames_t),
> -count);
> +count, max_frame_list_size_in_pages);
>  if ( rc >= 0 )
>  {
>  #define XLAT_gnttab_get_status_frames_HNDL_frame_list(_d_, _s_) \
> diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c
> index 26f9a32656..a0d8f32869 100644
> --- a/xen/common/grant_table.c
> +++ b/xen/common/grant_table.c
> @@ -54,6 +54,9 @@ struct grant_table {
>   * what version to use yet.
>   */
>  unsigned int  gt_version;
> +/* Resource limits of the domain. */
> +unsigned int   

[Xen-devel] [PATCH v7 14/16] xen: make grant resource limits per domain

2017-09-19 Thread Juergen Gross
Instead of using the same global resource limits of grant tables (max.
number of grant frames, max. number of maptrack frames) for all domains
make these limits per domain. Set those per-domain limits in
grant_table_set_limits().

Signed-off-by: Juergen Gross 
---
V6:
- several changes due to new patch order

V3:
- correct error message (Paul Durrant)
---
 xen/common/compat/grant_table.c   |  31 +++---
 xen/common/grant_table.c  | 121 --
 xen/include/asm-arm/grant_table.h |   6 +-
 3 files changed, 88 insertions(+), 70 deletions(-)

diff --git a/xen/common/compat/grant_table.c b/xen/common/compat/grant_table.c
index cce3ff0b9a..ff1d678f01 100644
--- a/xen/common/compat/grant_table.c
+++ b/xen/common/compat/grant_table.c
@@ -157,21 +157,14 @@ int compat_grant_table_op(unsigned int cmd,
 unsigned int max_frame_list_size_in_page =
 (COMPAT_ARG_XLAT_SIZE - sizeof(*nat.setup)) /
 sizeof(*nat.setup->frame_list.p);
-if ( max_frame_list_size_in_page < max_grant_frames )
-{
-gdprintk(XENLOG_WARNING,
- "max_grant_frames is too large (%u,%u)\n",
- max_grant_frames, max_frame_list_size_in_page);
-rc = -EINVAL;
-}
-else
-{
+
 #define XLAT_gnttab_setup_table_HNDL_frame_list(_d_, _s_) \
-set_xen_guest_handle((_d_)->frame_list, (unsigned long 
*)(nat.setup + 1))
-XLAT_gnttab_setup_table(nat.setup, );
+set_xen_guest_handle((_d_)->frame_list, (unsigned long 
*)(nat.setup + 1))
+XLAT_gnttab_setup_table(nat.setup, );
 #undef XLAT_gnttab_setup_table_HNDL_frame_list
-rc = gnttab_setup_table(guest_handle_cast(nat.uop, 
gnttab_setup_table_t), 1);
-}
+rc = gnttab_setup_table(guest_handle_cast(nat.uop,
+  
gnttab_setup_table_t),
+1, max_frame_list_size_in_page);
 }
 ASSERT(rc <= 0);
 if ( rc == 0 )
@@ -294,16 +287,6 @@ int compat_grant_table_op(unsigned int cmd,
 rc = -EFAULT;
 break;
 }
-if ( max_frame_list_size_in_pages <
- grant_to_status_frames(max_grant_frames) )
-{
-gdprintk(XENLOG_WARNING,
- "grant_to_status_frames(max_grant_frames) is too 
large (%u,%u)\n",
- grant_to_status_frames(max_grant_frames),
- max_frame_list_size_in_pages);
-rc = -EINVAL;
-break;
-}
 
 #define XLAT_gnttab_get_status_frames_HNDL_frame_list(_d_, _s_) \
 set_xen_guest_handle((_d_)->frame_list, (uint64_t 
*)(nat.get_status + 1))
@@ -312,7 +295,7 @@ int compat_grant_table_op(unsigned int cmd,
 
 rc = gnttab_get_status_frames(
 guest_handle_cast(nat.uop, gnttab_get_status_frames_t),
-count);
+count, max_frame_list_size_in_pages);
 if ( rc >= 0 )
 {
 #define XLAT_gnttab_get_status_frames_HNDL_frame_list(_d_, _s_) \
diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c
index 26f9a32656..a0d8f32869 100644
--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
@@ -54,6 +54,9 @@ struct grant_table {
  * what version to use yet.
  */
 unsigned int  gt_version;
+/* Resource limits of the domain. */
+unsigned int  max_grant_frames;
+unsigned int  max_maptrack_frames;
 /* Table size. Number of frames shared with guest */
 unsigned int  nr_grant_frames;
 /* Number of grant status frames shared with guest (for version 2) */
@@ -290,8 +293,8 @@ num_act_frames_from_sha_frames(const unsigned int num)
 return DIV_ROUND_UP(num * sha_per_page, ACGNT_PER_PAGE);
 }
 
-#define max_nr_active_grant_frames \
-num_act_frames_from_sha_frames(max_grant_frames)
+#define max_nr_active_grant_frames(gt) \
+num_act_frames_from_sha_frames(gt->max_grant_frames)
 
 static inline unsigned int
 nr_active_grant_frames(struct grant_table *gt)
@@ -528,7 +531,7 @@ get_maptrack_handle(
  * out of memory, try stealing an entry from another VCPU (in case the
  * guest isn't mapping across its VCPUs evenly).
  */
-if ( nr_maptrack_frames(lgt) < max_maptrack_frames )
+if ( nr_maptrack_frames(lgt) < lgt->max_maptrack_frames )
 new_mt = alloc_xenheap_page();
 
 if ( !new_mt )
@@ -1667,23 +1670,26 @@ grant_table_init(struct grant_table *gt)
 
 /* Active grant table. */
 gt->active = xzalloc_array(struct active_grant_entry *,
-   max_nr_active_grant_frames);
+