|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v8 5/7] VT-d: No need to set irq affinity for posted format IRTE
On Tue, Nov 22, 2016 at 06:03:51PM +0800, Jan Beulich wrote:
>>>> On 18.11.16 at 02:58, <feng.wu@xxxxxxxxx> wrote:
>> --- a/xen/drivers/passthrough/vtd/intremap.c
>> +++ b/xen/drivers/passthrough/vtd/intremap.c
>> @@ -600,27 +600,41 @@ static int msi_msg_to_remap_entry(
>>
>> if ( !pi_desc )
>> {
>> - /* Set interrupt remapping table entry */
>> - new_ire.remap.fpd = 0;
>> - new_ire.remap.dm = (msg->address_lo >> MSI_ADDR_DESTMODE_SHIFT) &
>> 0x1;
>> - new_ire.remap.tm = (msg->data >> MSI_DATA_TRIGGER_SHIFT) & 0x1;
>> - new_ire.remap.dlm = (msg->data >> MSI_DATA_DELIVERY_MODE_SHIFT) &
>> 0x1;
>> - /* Hardware require RH = 1 for LPR delivery mode */
>> - new_ire.remap.rh = (new_ire.remap.dlm == dest_LowestPrio);
>> - new_ire.remap.avail = 0;
>> - new_ire.remap.res_1 = 0;
>> - new_ire.remap.vector = (msg->data >> MSI_DATA_VECTOR_SHIFT) &
>> - MSI_DATA_VECTOR_MASK;
>> - new_ire.remap.res_2 = 0;
>> - if ( x2apic_enabled )
>> - new_ire.remap.dst = msg->dest32;
>> - else
>> - new_ire.remap.dst = ((msg->address_lo >> MSI_ADDR_DEST_ID_SHIFT)
>> - & 0xff) << 8;
>> + /*
>> + * We are here because we are trying to update the IRTE to remapped
>> mode,
>> + * we only need to update the remapped specific fields for the
>> following
>> + * two cases:
>> + * 1. When we create a new IRTE. A new IRTE is created when we
>> create a
>> + * new irq, so a new IRTE is always initialized with remapped
>> format.
>> + * 2. When the old IRTE is present and in remapped mode. Since if
>> the old
>> + * IRTE is in posted mode, we cannot update it to remapped mode
>> and
>> + * this is what we need to suppress. So we don't update the
>> remapped
>> + * specific fields here, we only update the commom field.
>> + */
>> + if ( !iremap_entry->remap.p || !iremap_entry->remap.im )
>> + {
>> + /* Set interrupt remapping table entry */
>> + new_ire.remap.fpd = 0;
>> + new_ire.remap.dm = (msg->address_lo >> MSI_ADDR_DESTMODE_SHIFT)
>> & 0x1;
>> + new_ire.remap.tm = (msg->data >> MSI_DATA_TRIGGER_SHIFT) & 0x1;
>> + new_ire.remap.dlm = (msg->data >> MSI_DATA_DELIVERY_MODE_SHIFT)
>> & 0x1;
>> + /* Hardware require RH = 1 for LPR delivery mode */
>> + new_ire.remap.rh = (new_ire.remap.dlm == dest_LowestPrio);
>> + new_ire.remap.avail = 0;
>> + new_ire.remap.res_1 = 0;
>> + new_ire.remap.vector = (msg->data >> MSI_DATA_VECTOR_SHIFT) &
>> + MSI_DATA_VECTOR_MASK;
>> + new_ire.remap.res_2 = 0;
>> + if ( x2apic_enabled )
>> + new_ire.remap.dst = msg->dest32;
>> + else
>> + new_ire.remap.dst = ((msg->address_lo >>
>> MSI_ADDR_DEST_ID_SHIFT)
>> + & 0xff) << 8;
>>
>> - new_ire.remap.res_3 = 0;
>> - new_ire.remap.res_4 = 0;
>> - new_ire.remap.p = 1; /* finally, set present bit */
>> + new_ire.remap.res_3 = 0;
>> + new_ire.remap.res_4 = 0;
>> + new_ire.remap.p = 1; /* finally, set present bit */
>> + }
>
>I disagree with this entire change, including namely point 2 of the
>comment. There should be no special casing of either transition
>here - the caller should provide you with input correctly identifying
>which of the two formats is to be generated. This certainly is
>connected to one of the comments I've just made on patch 4.
>
If we reach an agreement on patch 4, the logic will be more general and the
problem
will disappear.
>> @@ -657,25 +671,28 @@ static int msi_msg_to_remap_entry(
>> remap_rte->address_hi = 0;
>> remap_rte->data = index - i;
>>
>> - if ( !pi_desc )
>> - memcpy(iremap_entry, &new_ire, sizeof(struct iremap_entry));
>> - else
>> + if ( iremap_entry->val != new_ire.val )
>> {
>> - __uint128_t ret;
>> + if ( !pi_desc )
>> + memcpy(iremap_entry, &new_ire, sizeof(struct iremap_entry));
>> + else
>> + {
>> + __uint128_t ret;
>>
>> - old_ire = *iremap_entry;
>> - ret = cmpxchg16b(iremap_entry, &old_ire, &new_ire);
>> + old_ire = *iremap_entry;
>> + ret = cmpxchg16b(iremap_entry, &old_ire, &new_ire);
>>
>> - /*
>> - * In the above, we use cmpxchg16 to atomically update the 128-bit
>> IRTE,
>> - * and the hardware cannot update the IRTE behind us, so the return
>> value
>> - * of cmpxchg16 should be the same as old_ire. This ASSERT validate
>> it.
>> - */
>> - ASSERT(ret == old_ire.val);
>> - }
>> + /*
>> + * In the above, we use cmpxchg16 to atomically update the
>> 128-bit IRTE,
>> + * and the hardware cannot update the IRTE behind us, so the
>> return value
>> + * of cmpxchg16 should be the same as old_ire. This ASSERT
>> validate it.
>> + */
>> + ASSERT(ret == old_ire.val);
>> + }
>>
>> - iommu_flush_cache_entry(iremap_entry, sizeof(struct iremap_entry));
>> - iommu_flush_iec_index(iommu, 0, index);
>> + iommu_flush_cache_entry(iremap_entry, sizeof(struct iremap_entry));
>> + iommu_flush_iec_index(iommu, 0, index);
>> + }
>>
>> unmap_vtd_domain_page(iremap_entries);
>> spin_unlock_irqrestore(&ir_ctrl->iremap_lock, flags);
>
>This second hunk is imo all this patch should consist of.
>
>Jan
>
>_______________________________________________
>Xen-devel mailing list
>Xen-devel@xxxxxxxxxxxxx
>https://lists.xen.org/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |