[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 09/10] IOMMU: propagate IOMMU Device-TLB flush error up to IOMMU suspending
>>> On 18.05.16 at 10:08, <quan.xu@xxxxxxxxx> wrote: > --- a/xen/arch/x86/acpi/power.c > +++ b/xen/arch/x86/acpi/power.c > @@ -43,36 +43,68 @@ struct acpi_sleep_info acpi_sinfo; > > void do_suspend_lowlevel(void); > > +enum dev_power_saved > +{ > + SAVED_NONE, /* None of device power saved */ > + SAVED_CONSOLE, /* Device power of console saved */ > + SAVED_TIME, /* Device power of time saved */ > + SAVED_I8259A, /* Device power of I8259A saved */ > + SAVED_IOAPIC, /* Device power of IOAPIC saved */ > + SAVED_IOMMU, /* Device power of IOMMU saved */ > + SAVED_LAPIC, /* Device power of LAPIC saved */ > +}; Please avoid comments saying nothing substantially different than the code they accompany, and also not helping the reader to understand the commented code. > static int device_power_down(void) > { > - console_suspend(); > + if ( console_suspend() ) > + return SAVED_CONSOLE; I said so on the previous round, and I need to repeat it now: If console_suspend() fails, you saved _nothing_. > - time_suspend(); > + if ( time_suspend() ) > + return SAVED_TIME; > > - i8259A_suspend(); > + if ( i8259A_suspend() ) > + return SAVED_I8259A; > > + /* ioapic_suspend cannot fail */ > ioapic_suspend(); > > - iommu_suspend(); > + if ( iommu_suspend() ) > + return SAVED_IOMMU; > > - lapic_suspend(); > + if ( lapic_suspend() ) > + return SAVED_LAPIC; > > return 0; And this silently means SAVED_NONE, whereas here you saved everything. Yielding clearly bogus code ... > -static void device_power_up(void) > +static void device_power_up(enum dev_power_saved saved) > { > - lapic_resume(); > - > - iommu_resume(); > - > - ioapic_resume(); > - > - i8259A_resume(); > - > - time_resume(); > - > - console_resume(); > + switch ( saved ) > + { > + case SAVED_NONE: > + lapic_resume(); ... here and ... > @@ -196,7 +232,7 @@ static int enter_state(u32 state) > write_cr4(cr4 & ~X86_CR4_MCE); > write_efer(read_efer()); > > - device_power_up(); > + device_power_up(SAVED_NONE); ... here. > --- a/xen/drivers/passthrough/vtd/iommu.c > +++ b/xen/drivers/passthrough/vtd/iommu.c > @@ -541,20 +541,28 @@ static int iommu_flush_iotlb_psi( > return status; > } > > -static void iommu_flush_all(void) > +static int __must_check iommu_flush_all(void) > { > struct acpi_drhd_unit *drhd; > struct iommu *iommu; > int flush_dev_iotlb; > + int rc = 0; > > flush_all_cache(); > for_each_drhd_unit ( drhd ) > { > + int ret; > + > iommu = drhd->iommu; > iommu_flush_context_global(iommu, 0); > flush_dev_iotlb = find_ats_dev_drhd(iommu) ? 1 : 0; > - iommu_flush_iotlb_global(iommu, 0, flush_dev_iotlb); > + ret = iommu_flush_iotlb_global(iommu, 0, flush_dev_iotlb); > + > + if ( unlikely(ret) ) > + rc = ret; Same as for earlier patches - "if ( unlikely(!rc) )" please. Also, having come here - did I miss iommu_flush_iotlb_global() gaining a __must_check annotation somewhere? And the struct iommu_flush pointers and handlers? And, by analogy, iommu_flush_context_*()? Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |