|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/3] xen/vt-d: mask interrupt message generation
Chen, Tiejun wrote on 2015-05-04:
> Yang,
>
> Thanks for your review.
>
> On 2015/5/4 12:07, Zhang, Yang Z wrote:
>> Chen, Tiejun wrote on 2015-05-04:
>>> While initializing VT-D we should mask interrupt message generation
>>> to avoid receiving any interrupt as pending before enable DMA
>>> translation, and also mask that before disable DMA engine.
>>>
>>> Signed-off-by: Tiejun Chen <tiejun.chen@xxxxxxxxx>
>>> ---
>>> xen/drivers/passthrough/vtd/iommu.c | 31
>>> +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8
>>> deletions(-)
>>> diff --git a/xen/drivers/passthrough/vtd/iommu.c
>>> b/xen/drivers/passthrough/vtd/iommu.c index c7bda73..72cd854 100644 ---
>>> a/xen/drivers/passthrough/vtd/iommu.c +++
>>> b/xen/drivers/passthrough/vtd/iommu.c @@ -1000,15 +1000,21 @@ static
>>> void dma_msi_unmask(struct irq_desc *desc)
>>> iommu->msi.msi_attrib.masked = 0;
>>> }
>>> -static void dma_msi_mask(struct irq_desc *desc)
>>> +static void mask_dma_interrupt(struct iommu *iommu)
>>> {
>>> unsigned long flags;
>>> - struct iommu *iommu = desc->action->dev_id;
>>>
>>> - /* mask it */
>>> spin_lock_irqsave(&iommu->register_lock, flags);
>>> dmar_writel(iommu->reg, DMAR_FECTL_REG, DMA_FECTL_IM);
>>> spin_unlock_irqrestore(&iommu->register_lock, flags);
>>> +}
>>> +
>>> +static void dma_msi_mask(struct irq_desc *desc)
>>> +{
>>> + struct iommu *iommu = desc->action->dev_id;
>>> +
>>> + /* mask it */
>>> + mask_dma_interrupt(iommu);
>>> iommu->msi.msi_attrib.masked = 1;
>>> }
>>> @@ -1997,7 +2003,6 @@ static int init_vtd_hw(void)
>>> struct iommu *iommu;
>>> struct iommu_flush *flush = NULL;
>>> int ret;
>>> - unsigned long flags;
>>>
>>> /*
>>> * Basic VT-d HW init: set VT-d interrupt, clear VT-d faults.
>>> @@ -2008,11 +2013,16 @@ static int init_vtd_hw(void)
>>>
>>> iommu = drhd->iommu;
>>> - clear_fault_bits(iommu);
>>> + /*
>>> + * We shouldn't receive any VT-d interrupt while initializing
>>> + * VT-d so just mask interrupt message generation.
>>> + */
>>> + mask_dma_interrupt(iommu);
>>>
>>> - spin_lock_irqsave(&iommu->register_lock, flags);
>>> - dmar_writel(iommu->reg, DMAR_FECTL_REG, 0);
>>> - spin_unlock_irqrestore(&iommu->register_lock, flags);
>>> + /*
>>> + * And then clear all previous faults.
>>> + */
>>> + clear_fault_bits(iommu);
>>> }
>>>
>>> /*
>>> @@ -2350,6 +2360,11 @@ static void vtd_suspend(void)
>>> if ( force_iommu )
>>> continue;
>>> + /*
>>> + * Mask interrupt message generation.
>>> + */
>>> + mask_dma_interrupt(iommu);
>>> +
>>> iommu_disable_translation(iommu);
>>>
>>> /* If interrupt remapping is enabled, queued invalidation
>>
>> Just curious that do you observe a real issue or just catch it through
>> reading code?
>>
>
> Yes, we observed this problem on BDW. And actually one HP customer also
> had this same issue.
>
> Once we enable IOMMU translation, an IOMMU fault, 'Present bit in root
> entry is clear', is triggered like this,
>
> (XEN) [VT-D]iommu.c:731: iommu_enable_translation: iommu->reg =
> ffff82c000201000 (XEN) [VT-D]iommu.c:875: iommu_fault_status: Fault
> Overflow (XEN) [VT-D]iommu.c:877: iommu_fault_status: Primary Pending
> Fault (XEN) [VT-D]DMAR:[DMA Write] Request device [0000:00:02.0] fault
> addr 0, iommu reg = ffff82c000201000 (XEN) [VT-D]d32767v0 DMAR: reason
> 01 - Present bit in root entry is clear (XEN) print_vtd_entries: iommu
> ffff83012aa88600 dev 0000:00:02.0 gmfn 0 (XEN) root_entry =
> ffff83012aa85000 (XEN) root_entry[0] = 80f5001 (XEN) context =
> ffff8300080f5000 (XEN) context[10] = 2_8b75001 (XEN) l4 =
> ffff830008b75000 (XEN) l4_index = 0 (XEN) l4[0] = 8b74003 (XEN)
> l3 = ffff830008b74000 (XEN) l3_index = 0 (XEN) l3[0] =
> 8b73003 (XEN) l2 = ffff830008b73000 (XEN) l2_index = 0 (XEN)
> l2[0] = 8b72003 (XEN) l1 = ffff830008b72000 (XEN) l1_index = 0
> (XEN) l1[0] = 3
>
> At first I doubted this is issued by some improper cache behaviors.
> Because as you see, "root_entry[0] = 80f5001" indicates we already set
> that present bit. But Caching Mode bit is zero in BDW so this means
> remapping hardware doesn't own contest cache. And I also check xen
> always calls clflush to write back memory on CPU side. (Even I also
> tried to use wbinvd to replace clflush). And plus, you can see this
> guest fault address is a weird zero, so I turned to concern if this is
> just an unexpected fault which is pending because of some BIOS cleanup,
> or undefined hardware behaviors. Here I mean clear_fault_bits() is
> already not enough to clear this kind of pending interrupt before we
> complete all VT-D initializations.
So this patch helps nothing in this case?
>
> And anyway, I also think we should disable interrupt generation during
> VT-D setup until VT-D device enable interrupt explicitly.
The question is why there will be a fault interrupt generated during VT-D setup?
>
> Thanks
> Tiejun
Best regards,
Yang
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |