[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 01/10] vt-d: fix the IOMMU flush issue
On May 12, 2016 9:38 PM, Jan Beulich <JBeulich@xxxxxxxx> wrote: > >>> On 12.05.16 at 15:29, <quan.xu@xxxxxxxxx> wrote: > > On May 12, 2016 4:53 PM, Jan Beulich <JBeulich@xxxxxxxx> wrote: > >> >>> On 12.05.16 at 09:50, <quan.xu@xxxxxxxxx> wrote: > >> > On May 10, 2016 12:10 AM, Jan Beulich <JBeulich@xxxxxxxx> wrote: > >> >> >>> On 06.05.16 at 10:54, <quan.xu@xxxxxxxxx> wrote: > >> >> > @@ -1391,13 +1399,19 @@ int domain_context_mapping_one( > >> >> > spin_unlock(&iommu->lock); > >> >> > > >> >> > /* Context entry was previously non-present (with domid 0). */ > >> >> > - if ( iommu_flush_context_device(iommu, 0, (((u16)bus) << 8) | > devfn, > >> >> > - DMA_CCMD_MASK_NOBIT, 1) ) > >> >> > - iommu_flush_write_buffer(iommu); > >> >> > - else > >> >> > + rc = iommu_flush_context_device(iommu, 0, (((u16)bus) << 8) > >> >> > + | > >> devfn, > >> >> > + DMA_CCMD_MASK_NOBIT, 1); > >> >> > + > >> >> > + if ( !rc ) > >> >> > { > >> >> > int flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0; > >> >> > - iommu_flush_iotlb_dsi(iommu, 0, 1, flush_dev_iotlb); > >> >> > + rc = iommu_flush_iotlb_dsi(iommu, 0, 1, > >> >> > + flush_dev_iotlb); > >> >> > >> >> Please take the opportunity and add the missing blank line > >> >> (between > >> >> declaration(s) and statement(s) in cases like this. > >> >> > >> >> > + } > >> >> > + > >> >> > + if ( rc > 0 ) > >> >> > >> >> Can iommu_flush_context_device() return a positive value? If so, > >> >> the logic is now likely wrong. If not (which is what I assume) I'd > >> >> like to suggest adding a respective ASSERT() (even if only to > >> >> document the fact). Or alternatively this > >> >> if() could move into the immediately preceding one. > >> > > >> > Check it again. iommu_flush_context_device() can return a positive value. > >> > [...] > >> > Could you tell me why the logic is now likely wrong? I will fix it first. > >> > >> With > >> > >> rc = iommu_flush_context_device(iommu, 0, (((u16)bus) << 8) | devfn, > >> DMA_CCMD_MASK_NOBIT, 1); > >> > >> if ( !rc ) > >> { > >> int flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0; > >> rc = iommu_flush_iotlb_dsi(iommu, 0, 1, flush_dev_iotlb); > >> } > >> > >> if ( rc > 0 ) > >> { > >> iommu_flush_write_buffer(iommu); > >> rc = 0; > >> } > >> > >> it seems pretty clear that you won't call iommu_flush_iotlb_dsi() if > >> iommu_flush_context_device() returned 1, which doesn't look like what > >> is wanted at the first glance. But I may be wrong, hence the "likely" > >> in my > > earlier > >> reply. > >> > > > > Oh, this was on purpose. > > > > If iommu_flush_context_device() returned 1, the > > iommu_flush_iotlb_dsi() returned 1 too. > > As both flush_context_qi() and flush_iotlb_qi () are the same at the > > beginning of the functions. > > Such implications need to be commented on, so readers (like me) don't > assume brokenness. > ok, I will add a comment. > > One concern is if iommu_flush_context_device() is failed, then we > > won't call iommu_flush_iotlb_dsi(), which is not best effort to flush. > > Indeed. > I'll fix it as well. Quan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |