[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 1/7] VT-d: Check VT-d Device-TLB flush error(IOMMU part).
>>> On 16.02.16 at 11:50, <quan.xu@xxxxxxxxx> wrote: >> On February 11, 2016 at 1:01am, <JBeulich@xxxxxxxx> wrote: >> >>> On 05.02.16 at 11:18, <quan.xu@xxxxxxxxx> wrote: >> > This patch checks all kinds of error and all the way up the call trees >> > of VT-d Device-TLB flush(IOMMU part). > >> Please be sure to Cc all maintainers of code you modify. >> > OK, also CCed Dario Faggioli. > Jan, could I re-send out the V5 and cc all maintainers of code I modify? I'd say rather make sure you Cc the right people on v6, to avoid spamming everyone's mailboxes. >> > @@ -2737,8 +2739,9 @@ static int arm_smmu_iommu_domain_init(struct >> domain *d) >> > return 0; >> > } >> > >> > -static void __hwdom_init arm_smmu_iommu_hwdom_init(struct domain *d) >> > +static int __hwdom_init arm_smmu_iommu_hwdom_init(struct domain *d) >> > { >> > + return 0; >> > } >> >> Bad indentation. >> > > I will modify it in next version. I tried to align with the coding style, as > > There was similar indentation nearby arm_smmu_iommu_hwdom_init() in that > file. Then I'm afraid you didn't check enough of the properties of the file: It appears to use Linux style, and hence indentation is by tabs instead of spaces. >> > @@ -171,7 +172,10 @@ void __hwdom_init iommu_hwdom_init(struct >> domain *d) >> > ((page->u.inuse.type_info & PGT_type_mask) >> > == PGT_writable_page) ) >> > mapping |= IOMMUF_writable; >> > - hd->platform_ops->map_page(d, gfn, mfn, mapping); >> > + rc = hd->platform_ops->map_page(d, gfn, mfn, mapping); >> > + if ( rc ) >> > + return rc; >> >> So in this patch I can't find error checking getting introduced for the > caller of >> this function. And if you were to add it - what would your intentions be? > Panic? >> IOW I'm not sure bailing here is a good idea. Logging an error message (but > only >> once in this loop) would be a possibility. (This pattern repeats further > down.) >> > > Could I log an error message and break in this loop? Logging an error message - yes. Breaking the loop - no; this should continue to be a best effort attempt at getting things set up for Dom0. >> > @@ -369,12 +376,16 @@ void iommu_share_p2m_table(struct domain* d) >> > ops->share_p2m(d); >> > } >> > >> > -void iommu_crash_shutdown(void) >> > +int iommu_crash_shutdown(void) >> > { >> > const struct iommu_ops *ops = iommu_get_ops(); >> > + >> > if ( iommu_enabled ) >> > - ops->crash_shutdown(); >> > + return ops->crash_shutdown(); >> > + >> > iommu_enabled = iommu_intremap = 0; >> > + >> > + return 0; >> > } >> >> Here again the question is - what is the error value going to be used for? >> We're >> trying to shut down a crashed system when coming here. >> > I tried to clean up in error handling path chained up. It logs an error > message, > When it calls iommu_crash_shutdown() and returns a non-zero value [in patch > 2/7]. That sounds okay than (I didn't get around to look at patches 2-7 yet), but is somewhat contrary to me request of adding __must_check as far as possible, which - if done here - would break the build without also adjusting the caller(s). >> > @@ -584,37 +587,37 @@ static void __intel_iommu_iotlb_flush(struct >> domain *d, unsigned long gfn, >> > continue; >> > >> > if ( page_count > 1 || gfn == -1 ) >> > - { >> > - if ( iommu_flush_iotlb_dsi(iommu, iommu_domid, >> > - 0, flush_dev_iotlb) ) >> > - iommu_flush_write_buffer(iommu); >> > - } >> > + rc = iommu_flush_iotlb_dsi(iommu, iommu_domid, >> > + 0, flush_dev_iotlb); >> > else >> > - { >> > - if ( iommu_flush_iotlb_psi(iommu, iommu_domid, >> > + rc = iommu_flush_iotlb_psi(iommu, iommu_domid, >> > (paddr_t)gfn << PAGE_SHIFT_4K, 0, >> > - !dma_old_pte_present, flush_dev_iotlb) ) >> > - iommu_flush_write_buffer(iommu); >> > - } >> > + !dma_old_pte_present, flush_dev_iotlb); >> > + >> > + if ( rc ) >> > + iommu_flush_write_buffer(iommu); >> > } >> > + >> > + return rc; >> > } >> >> rc may be positive here (and afaict that's the indication to do the flush, > not one >> of failure). Quite likely this code didn't mean to flush >> iommu_flush_iotlb_{d,p}si() returning a negative value... >> >> > IIUC, you refer to the follow: > flush_iotlb_qi( > { > ... > if ( !cap_caching_mode(iommu->cap) ) > return 1; > ... > } > > > As Kevin mentioned, originally 0/1 is used to indicate whether caller needs > to flush cache. > But I try to return ZERO in [PATCH v5 1/7]. Because: > 1) if It returns _1_, device passthrough doesn't work when I tried to clean > up in error handling path chained up. > 2) as VT-d spec said, Caching Mode is 0: invalidations are not required for > modifications to individual not present > or invalid entries. > > That is tricky for this point. Correct me if I am wrong. I'm not sure I see the trickiness: All you need is - call iommu_flush_write_buffer() only when rc > 0 (if I remember the polarity right, else it might be rc == 0) - return zero from this function when rc is positive. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |