|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH for-4.16 v4] gnttab: allow setting max version per-domain
On Tue, Nov 02, 2021 at 02:34:03PM +0000, Andrew Cooper wrote:
> On 30/10/2021 08:53, Roger Pau Monné wrote:
> > On Fri, Oct 29, 2021 at 05:39:52PM +0100, Andrew Cooper wrote:
> >> On 29/10/2021 08:59, Roger Pau Monne wrote:
> >>> diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c
> >>> index e510395d08..f94f0f272c 100644
> >>> --- a/xen/common/grant_table.c
> >>> +++ b/xen/common/grant_table.c
> >>> @@ -1917,11 +1918,33 @@ 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 == XEN_DOMCTL_GRANT_version_default )
> >>> + max_grant_version = opt_gnttab_max_version;
> >>> + if ( !max_grant_version )
> >>> + {
> >>> + dprintk(XENLOG_INFO, "%pd: invalid grant table version 0
> >>> requested\n",
> >>> + d);
> >>> + return -EINVAL;
> >>> + }
> >>> + 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;
> >>> + }
> >> I think this wants to live in sanitise_domain_config() along with all
> >> the other auditing of flags and settings.
> > The reason to place those there is that the sanity checks for the
> > other grant table related parameters (max_grant_frames and
> > max_maptrack_frames) are performed in this function also. I think it's
> > better to keep the checks together.
> >
> > We should consider exporting the relevant values from grant table
> > code and then moving all the checks to sanitise_domain_config, but
> > likely a follow up work given the current point in the release.
> >
> >> Also, it can be simplified:
> >>
> >> if ( max_grant_version < 1 ||
> >> max_grant_version > opt_gnttab_max_version )
> >> {
> >> dprintk(XENLOG_INFO, "Requested gnttab max version %u outside of
> >> supported range [%u, %u]\n", ...);
> >> }
> > It was originally done this way so that the first check
> > (!max_grant_version) could be adjusted when support for
> > max_grant_version == 0 was introduced [0] in order to signal the
> > disabling of grant tables altogether.
> >
> >>
> >>> + if ( unlikely(max_page >= PFN_DOWN(TB(16))) && is_pv_domain(d) &&
> >>> + max_grant_version < 2 )
> >>> + dprintk(XENLOG_INFO,
> >>> + "%pd: host memory above 16Tb and grant table v2
> >>> disabled\n",
> >>> + d);
> >> This is rather more complicated.
> >>
> >> For PV, this going wrong in the first place is conditional on
> >> CONFIG_BIGMEM.
> >> For HVM, it the guest address size, not the host.
> >> For ARM, I don't even know, because I've lost track of which bits of the
> >> ABI are directmap in an otherwise translated domain.
> > This was only aiming to cover the PV case, which I think it's the more
> > likely one. It's possible there's people attempting to create PV
> > guests on a 16TB machine, but I think it's more unlikely that the
> > guest itself will have 16TB of RAM.
> >
> >> I think it is probably useful to do something about it, but probably not
> >> in this patch.
> > I'm fine with this, we had no warning at all before, so I don't think
> > it should be a hard requirement to add one now. It would be nice if
> > there's consensus, but otherwise let's just skip it.
> >
> >> Perhaps modify domain_set_alloc_bitsize() to impose an upper limit for
> >> the "host memory size matters" cases?
> >>
> >> For the guest address size cases, this possibly wants to feed in to the
> >> max policy calculations in the same way that shadow kinda does.
> > So grant table version will basically clamp the amount of memory a
> > guest can use?
> >
> > What about guests that doesn't use grant tables at all, do we expect
> > those to set the future max_grant_version to 0 in order to avoid the
> > clamping without having to expose grant v2?
> >
> >>> diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h
> >>> index 51017b47bc..0ec57614bd 100644
> >>> --- a/xen/include/public/domctl.h
> >>> +++ b/xen/include/public/domctl.h
> >>> @@ -89,14 +89,20 @@ struct xen_domctl_createdomain {
> >>> /*
> >>> * Various domain limits, which impact the quantity of resources
> >>> * (global mapping space, xenheap, etc) a guest may consume. For
> >>> - * max_grant_frames and max_maptrack_frames, < 0 means "use the
> >>> - * default maximum value in the hypervisor".
> >>> + * max_grant_frames, max_maptrack_frames and max_gnttab_version < 0
> >>> + * means "use the default maximum value in the hypervisor".
> >>> */
> >>> uint32_t max_vcpus;
> >>> uint32_t max_evtchn_port;
> >>> int32_t max_grant_frames;
> >>> int32_t max_maptrack_frames;
> >>>
> >>> +/* Grant version, use low 4 bits. */
> >>> +#define XEN_DOMCTL_GRANT_version_mask 0xf
> >>> +#define XEN_DOMCTL_GRANT_version_default 0xf
> >> This needs to be a toolstack decision, not something in Xen. This
> >> doesn't fix the case where VMs can't cope with change underfoot.
> >>
> >> It is fine for the user say "use the default", but this must be turned
> >> into an explicit 1 or 2 by the toolstack, so that the version(s) visible
> >> to the guest remains invariant while it is booted.
> > Please bear with me, as I'm afraid I don't understand why this is
> > relevant. Allowed max grant version can only change as a result of a
> > migration
>
> No. Allowed max grant version is (well - needs to be) a fixed property
> of the VM, even across migration.
Right, but I think we agreed we where going to punt this to post 4.16,
as noted in:
https://lore.kernel.org/xen-devel/24954.44919.8320.63375@xxxxxxxxxxxxxxxxxxxxxxxx/
It's strictly no worse than the current code, where you can migrate
from a host with a default max grant version of 2 to one with a
default max grant version of 1 and migration will succeed.
> It was a fundamentally mistake to ever have gnttab v2 active by default,
> without an enumeration, and with no way of turning it off. Same too for
> evtchn, but we've already taken a patch to knobble fifo support.
>
>
> The toolstack needs to explicitly select v1 or v2. It's fine to pick a
> default on behalf a user which doesn't care, but what moves in the
> migrate stream must an explicit, unambiguous value, so the destination
> Xen and toolstack can reconstruct the VM exactly.
>
> "default" is ambiguous, and cannot be recovered after the fact. In
> particular, a vm with no explicit configuration, when booted on a Xen
> with gnttab limited to v1 on the command line, should not have v2 become
> accessible by migrating to a second Xen with no command line limit. It
> is fine, if that VM subsequently reboots, to find that v2 is now available.
There are other grant table options that have the defaults set in Xen
(ie: max_grant_frames and max_maptrack_frames), which will need to be
fetched on a per-domain basis already in order to be migrated, so I
was planning on doing something similar with the max grant version, so
that we could fetch all the grant table related parameters.
Or else we should also remove setting max_grant_frames and
max_maptrack_frames to -1 (default), and instead force the toolstack
to explicitly set those. In any case, I think we need to handle the
grant table version and max_{grant,maptrack}_frames in the same way,
and it's likely better to leave that for later.
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |