|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v9 23/28] ARM: vITS: handle DISCARD command
Hi,
On 18/05/17 15:23, Julien Grall wrote:
> Hi Andre,
>
> On 11/05/17 18:53, Andre Przywara wrote:
>> The DISCARD command drops the connection between a DeviceID/EventID
>> and an LPI/collection pair.
>> We mark the respective structure entries as not allocated and make
>> sure that any queued IRQs are removed.
>>
>> Signed-off-by: Andre Przywara <andre.przywara@xxxxxxx>
>> ---
>> xen/arch/arm/vgic-v3-its.c | 24 ++++++++++++++++++++++++
>> 1 file changed, 24 insertions(+)
>>
>> diff --git a/xen/arch/arm/vgic-v3-its.c b/xen/arch/arm/vgic-v3-its.c
>> index ef7c78f..f7a8d77 100644
>> --- a/xen/arch/arm/vgic-v3-its.c
>> +++ b/xen/arch/arm/vgic-v3-its.c
>> @@ -723,6 +723,27 @@ out_unlock:
>> return ret;
>> }
>>
>> +static int its_handle_discard(struct virt_its *its, uint64_t *cmdptr)
>> +{
>> + uint32_t devid = its_cmd_get_deviceid(cmdptr);
>> + uint32_t eventid = its_cmd_get_id(cmdptr);
>> + int ret;
>> +
>> + spin_lock(&its->its_lock);
>> +
>> + /* Remove from the radix tree and remove the host entry. */
>> + ret = its_discard_event(its, devid, eventid);
>> +
>> + /* Remove from the guest's ITTE. */
>> + if ( ret || write_itte_locked(its, devid, eventid,
>> + UNMAPPED_COLLECTION, INVALID_LPI,
>> NULL) )
>
> I am not sure to fully understand this if. If ret is not NULL you
> override it and never call write_itte_locked.
If its_discard_event() succeeded above, then ret will be 0, in which
case we call write_itte_locked(). If that returns non-zero, this is an
error and we set ret to -1, otherwise (no error) it stays at zero.
> Is it what you wanted? If so, then probably a bit more documentation
> would be useful to explain why writte_itte_locked is skipped.
I admit this is a bit convoluted. I will either document this or
simplify the algorithm.
Cheers,
Andre.
>
>> + ret = -1;
>> +
>> + spin_unlock(&its->its_lock);
>> +
>> + return ret;
>> +}
>> +
>> #define ITS_CMD_BUFFER_SIZE(baser) ((((baser) & 0xff) + 1) << 12)
>> #define ITS_CMD_OFFSET(reg) ((reg) & GENMASK(19, 5))
>>
>> @@ -755,6 +776,9 @@ static int vgic_its_handle_cmds(struct domain *d,
>> struct virt_its *its)
>> case GITS_CMD_CLEAR:
>> ret = its_handle_clear(its, command);
>> break;
>> + case GITS_CMD_DISCARD:
>> + ret = its_handle_discard(its, command);
>> + break;
>> case GITS_CMD_INT:
>> ret = its_handle_int(its, command);
>> break;
>>
>
> Cheers,
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |