|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH V1 02/16] xen/ioreq: Make x86's IOREQ feature common
On 23.09.2020 14:28, Oleksandr wrote:
> On 22.09.20 18:52, Jan Beulich wrote:
>> On 22.09.2020 17:05, Oleksandr wrote:
>>> 3. *arch.hvm.hvm_io*: We could also use the following:
>>>
>>> #define ioreq_get_io_completion(v) ((v)->arch.hvm.hvm_io.io_completion)
>>> #define ioreq_get_io_req(v) ((v)->arch.hvm.hvm_io.io_req)
>>>
>>> This way struct hvm_vcpu_io won't be used in common code as well.
>> But if Arm needs similar field, why keep them in arch.hvm.hvm_io?
> Yes, Arm needs the "some" fields, but not "all of them" as x86 has.
> For example Arm needs only the following (at least in the context of
> this series):
>
> +struct hvm_vcpu_io {
> + /* I/O request in flight to device model. */
> + enum hvm_io_completion io_completion;
> + ioreq_t io_req;
> +
> + /*
> + * HVM emulation:
> + * Linear address @mmio_gla maps to MMIO physical frame @mmio_gpfn.
> + * The latter is known to be an MMIO frame (not RAM).
> + * This translation is only valid for accesses as per @mmio_access.
> + */
> + struct npfec mmio_access;
> + unsigned long mmio_gla;
> + unsigned long mmio_gpfn;
> +};
>
> But for x86 the number of fields is quite bigger. If they were in same
> way applicable for both archs (as what we have with ioreq_server struct)
> I would move it to the common domain. I didn't think of a better idea
> than just abstracting accesses to these (used in common ioreq.c) two
> fields by macro.
I'm surprised Arm would need all the three last fields that you
mention. Both here and ...
>>> @@ -247,7 +247,7 @@ static gfn_t hvm_alloc_legacy_ioreq_gfn(struct
>>> hvm_ioreq_server *s)
>>> for ( i = HVM_PARAM_IOREQ_PFN; i <= HVM_PARAM_BUFIOREQ_PFN; i++ )
>>> {
>>> if ( !test_and_clear_bit(i, &d->ioreq_gfn.legacy_mask) )
>>> - return _gfn(d->arch.hvm.params[i]);
>>> + return _gfn(ioreq_get_params(d, i));
>>> }
>>>
>>> return INVALID_GFN;
>>> @@ -279,7 +279,7 @@ static bool hvm_free_legacy_ioreq_gfn(struct
>>> hvm_ioreq_server *s,
>>>
>>> for ( i = HVM_PARAM_IOREQ_PFN; i <= HVM_PARAM_BUFIOREQ_PFN; i++ )
>>> {
>>> - if ( gfn_eq(gfn, _gfn(d->arch.hvm.params[i])) )
>>> + if ( gfn_eq(gfn, _gfn(ioreq_get_params(d, i))) )
>>> break;
>>> }
>>> if ( i > HVM_PARAM_BUFIOREQ_PFN )
>> And these two are needed by Arm? Shouldn't Arm exclusively use
>> the new model, via acquire_resource?
> I dropped HVMOP plumbing on Arm as it was requested. Only acquire
> interface should be used.
> This code is not supposed to be called on Arm, but it is a part of
> common code and we need to find a way how to abstract away *arch.hvm.params*
... here I wonder whether you aren't moving more pieces to common
code than are actually arch-independent. I think a prereq step
missing so far is to clearly identify which pieces of the code
are arch-independent, and work towards abstracting away all of the
arch-dependent ones.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |