|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH for-4.16 v5] gnttab: allow setting max version per-domain
On 03.11.2021 15:57, Roger Pau Monne wrote:
> --- a/tools/libs/light/libxl_create.c
> +++ b/tools/libs/light/libxl_create.c
> @@ -454,6 +454,28 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc,
> libxl_defbool_setdefault(&b_info->nested_hvm, false);
> }
>
> + if (b_info->max_grant_version == LIBXL_MAX_GRANT_DEFAULT) {
> + libxl_physinfo info;
> +
> + rc = libxl_get_physinfo(CTX, &info);
> + if (rc) {
> + LOG(ERROR, "failed to get hypervisor info");
> + return rc;
> + }
> +
> + if (info.cap_gnttab_v2)
> + b_info->max_grant_version = 2;
> + else if (info.cap_gnttab_v1)
> + b_info->max_grant_version = 1;
> + else
> + /* No grant table support reported */
> + b_info->max_grant_version = 0;
> + } else if (b_info->max_grant_version & ~XEN_DOMCTL_GRANT_version_mask) {
Aren't you introducing a dependency of a stable library on an unstable
interface here? I'm surprised this even builds, as I didn't expect
libxl sources to include domctl.h in the first place.
> @@ -219,6 +220,13 @@ static void parse_global_config(const char *configfile,
> else if (e != ESRCH)
> exit(1);
>
> + e = xlu_cfg_get_bounded_long (config, "max_grant_version", 0,
> + INT_MAX, &l, 1);
> + if (!e)
> + max_grant_version = l;
> + else if (e != ESRCH)
> + exit(1);
Would be kind of nice if out-of-range values were detected and
reported right here, rather than causing puzzling errors at domain
creation. But I have no idea whether doing so would be inconsistent
with the processing of other global settings.
> @@ -1917,11 +1918,26 @@ active_alloc_failed:
> }
>
> int grant_table_init(struct domain *d, int max_grant_frames,
> - int max_maptrack_frames)
> + int max_maptrack_frames, unsigned int options)
> {
> struct grant_table *gt;
> + unsigned int max_grant_version = options & XEN_DOMCTL_GRANT_version_mask;
> int ret = -ENOMEM;
>
> + if ( !max_grant_version )
> + {
> + dprintk(XENLOG_INFO, "%pd: invalid grant table version 0
> requested\n",
> + d);
> + return -EINVAL;
> + }
Wouldn't 0 rather be the most natural way to request no gnttab at all
for a domain? (Arguably making things work that way could be left to
a future change.)
> + if ( max_grant_version > opt_gnttab_max_version )
> + {
> + dprintk(XENLOG_INFO,
> + "%pd: requested grant version (%u) greater than supported
> (%u)\n",
> + d, max_grant_version, opt_gnttab_max_version);
> + return -EINVAL;
> + }
> +
> /* Default to maximum value if no value was specified */
> if ( max_grant_frames < 0 )
> max_grant_frames = opt_max_grant_frames;
Neither here nor in domain_create() you check that the other bits of
"options" are zero.
> @@ -69,7 +69,8 @@ int gnttab_acquire_resource(
>
> static inline int grant_table_init(struct domain *d,
> int max_grant_frames,
> - int max_maptrack_frames)
> + int max_maptrack_frames,
> + unsigned int options)
> {
> return 0;
> }
While arbitrary table size requests may be okay to ignore here, I'm
unsure about the max-version: Requesting v3 is surely an error in any
event; I'd even be inclined to suggest requesting v1 or v2 is as
well. Adding such a check here looks like it would be compatible with
all the other adjustments you're making.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |