|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v9 5/5] x86/ioreq server: Synchronously reset outstanding p2m_ioreq_server entries when an ioreq server unmaps.
>>> On 23.03.17 at 04:23, <yu.c.zhang@xxxxxxxxxxxxxxx> wrote:
>
> On 3/22/2017 10:39 PM, Jan Beulich wrote:
>>>>> On 21.03.17 at 03:52, <yu.c.zhang@xxxxxxxxxxxxxxx> wrote:
>>> --- a/xen/arch/x86/hvm/dm.c
>>> +++ b/xen/arch/x86/hvm/dm.c
>>> @@ -385,16 +385,51 @@ static int dm_op(domid_t domid,
>>>
>>> case XEN_DMOP_map_mem_type_to_ioreq_server:
>>> {
>>> - const struct xen_dm_op_map_mem_type_to_ioreq_server *data =
>>> + struct xen_dm_op_map_mem_type_to_ioreq_server *data =
>>> &op.u.map_mem_type_to_ioreq_server;
>>> + unsigned long first_gfn = data->opaque;
>>> + unsigned long last_gfn;
>>> +
>>> + const_op = false;
>>>
>>> rc = -EOPNOTSUPP;
>>> /* Only support for HAP enabled hvm. */
>>> if ( !hap_enabled(d) )
>>> break;
>>>
>>> - rc = hvm_map_mem_type_to_ioreq_server(d, data->id,
>>> - data->type, data->flags);
>>> + if ( first_gfn == 0 )
>>> + rc = hvm_map_mem_type_to_ioreq_server(d, data->id,
>>> + data->type, data->flags);
>>> + /*
>>> + * Iterate p2m table when an ioreq server unmaps from
> p2m_ioreq_server,
>>> + * and reset the remaining p2m_ioreq_server entries back to
> p2m_ram_rw.
>>> + */
>>> + if ( (first_gfn > 0) || (data->flags == 0 && rc == 0) )
>> Instead of putting the rc check on the right side, please do
>>
>> if ( rc == 0 && (first_gfn > 0) || data->flags == 0) )
>>
>> That'll require setting rc to zero in an else to the previous if(),
>> but that's needed anyway afaics in order to not return
>> -EOPNOTSUPP once no further continuation is necessary.
>>
>> I further wonder why the if() here needs to look at first_gfn at
>> all - data->flags is supposed to remain at zero for continuations
>> (unless we have a misbehaving caller, in which case it'll harm
>> the guest only afaict). It seems to me, however, that this may
>> have been discussed once already, a long time ago. I'm sorry
>> for not remembering the outcome, if so.
>
> We have not discussed this. Our previous discussion is about the if
> condition before
> calling hvm_map_mem_type_to_ioreq_server(). :-)
>
> Maybe above code should be changed to:
> @@ -400,11 +400,14 @@ static int dm_op(domid_t domid,
> if ( first_gfn == 0 )
> rc = hvm_map_mem_type_to_ioreq_server(d, data->id,
> data->type,
> data->flags);
> + else
> + rc = 0;
> +
> /*
> * Iterate p2m table when an ioreq server unmaps from
> p2m_ioreq_server,
> * and reset the remaining p2m_ioreq_server entries back to
> p2m_ram_rw.
> */
> - if ( (first_gfn > 0) || (data->flags == 0 && rc == 0) )
> + if ( data->flags == 0 && rc == 0 )
> {
> struct p2m_domain *p2m = p2m_get_hostp2m(d);
Yes, that's what I was trying to hint at.
>>> --- a/xen/arch/x86/mm/p2m.c
>>> +++ b/xen/arch/x86/mm/p2m.c
>>> @@ -1038,6 +1038,35 @@ void p2m_change_type_range(struct domain *d,
>>> p2m_unlock(p2m);
>>> }
>>>
>>> +/* Synchronously modify the p2m type for a range of gfns from ot to nt. */
>>> +void p2m_finish_type_change(struct domain *d,
>>> + unsigned long first_gfn, unsigned long
>>> last_gfn,
>> I think we'd prefer new functions to properly use gfn_t.
> Sorry? I do not get it.
> Paul suggested we replace last_gfn with max_nr, which sounds reasonable
> to me. Guess you mean
> something else?
Indeed - even with Paul's suggestion, first_gfn would remain as a
parameter, and it should be of type gfn_t.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |