On Thu, Nov 04, 2021 at 09:55:03AM +0100, Jan Beulich wrote:
> 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.

libxl API is stable, but not it's ABI, and libxl strictly depends and
uses domctl. See for example libxl__domain_make and it's usage of
xen_domctl_createdomain.

I think the usage here of XEN_DOMCTL_GRANT_version_mask is fine.

> > @@ -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.

Hm, it could be done but doesn't seem to be common. AFAICT
parse_global_config just reads the values from the config file,
whether those values are sane doesn't seem to be implemented there.

> > @@ -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.)

Indeed, but that's not part of this change. I will post an updated
version of the grant disabling patch separately, as I don't think
that's 4.16 material.

> > +    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.

Right, will add.

> > @@ -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.

I think if the grant table is disabled at build time we should only
accept version 0 as valid here.

Thanks, Roger.

Reply via email to