[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 2/2] x86/hvm/ioreq: allow ioreq servers to use HVM_PARAM_[BUF]IOREQ_PFN



>>> On 05.10.18 at 15:43, <paul.durrant@xxxxxxxxxx> wrote:
> Since commit 2c257bd6 "x86/hvm: remove default ioreq server (again)" the
> GFNs allocated by the toolstack and set in HVM_PARAM_IOREQ_PFN and
> HVM_PARAM_BUFIOREQ_PFN have been unused. This patch allows them to be used
> by (non-default) ioreq servers.
> 
> NOTE: This fixes a compatibility issue. A guest created on a version of
>       Xen that pre-dates the initial ioreq server implementation and then
>       migrated in will currently fail to resume because its migration
>       stream will lack values for HVM_PARAM_IOREQ_SERVER_PFN and
>       HVM_PARAM_NR_IOREQ_SERVER_PAGES *unless* the system has an
>       emulator domain that uses direct resource mapping (which depends
>       on the version of privcmd it happens to have) in which case it
>       will not require use of GFNs for the ioreq server shared
>       pages.

Meaning this wants to be backported till where?

> A similar compatibility issue with migrated-in VMs exists with Xen 4.11
> because the upstream QEMU fall-back to use legacy ioreq server was broken
> when direct resource mapping was introduced.
> This is because, prior to the resource mapping patches, it was the creation
> of the non-default ioreq server that failed if GFNs were not available
> whereas, as of 4.11, it is retrieval of the info that fails which does not
> trigger the fall-back.

Are you working on a fix or workaround for this, too, then?

> --- a/xen/arch/x86/hvm/ioreq.c
> +++ b/xen/arch/x86/hvm/ioreq.c
> @@ -237,6 +237,26 @@ bool handle_hvm_io_completion(struct vcpu *v)
>      return true;
>  }
>  
> +static gfn_t hvm_alloc_legacy_ioreq_gfn(struct hvm_ioreq_server *s)
> +{
> +    struct domain *d = s->target;
> +    unsigned int i;
> +
> +    BUILD_BUG_ON(HVM_PARAM_IOREQ_PFN >
> +                 sizeof(d->arch.hvm.ioreq_gfn.legacy_mask) * 8);
> +    BUILD_BUG_ON(HVM_PARAM_BUFIOREQ_PFN >
> +                 sizeof(d->arch.hvm.ioreq_gfn.legacy_mask) * 8);
> +    BUILD_BUG_ON(HVM_PARAM_BUFIOREQ_PFN != HVM_PARAM_IOREQ_PFN + 1);
> +
> +    for ( i = HVM_PARAM_IOREQ_PFN; i <= HVM_PARAM_BUFIOREQ_PFN; i++ )
> +    {
> +        if ( !test_and_set_bit(i, &d->arch.hvm.ioreq_gfn.legacy_mask) )
> +            return _gfn(d->arch.hvm.params[i]);

Aren't you risking to use GFN 0 here, if the param was never set?
Since in theory GFN 0 could be valid here, perhaps whether these
MFNs may be used should be tracked by starting out legacy_mask
such that allocations are impossible, while the setting of the
params would then make the slots available for allocating from?

Jan



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.