|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 09/10] IOMMU: propagate IOMMU Device-TLB flush error up to IOMMU suspending
On May 04, 2016 4:43 PM, Jan Beulich <JBeulich@xxxxxxxx> wrote:
> >>> On 04.05.16 at 04:14, <quan.xu@xxxxxxxxx> wrote:
> > On May 04, 2016 10:00 AM, Tian, Kevin <kevin.tian@xxxxxxxxx> wrote:
> >> > From: Xu, Quan
> >> > Sent: Friday, April 29, 2016 5:25 PM diff --git
> >> > a/xen/arch/x86/acpi/power.c b/xen/arch/x86/acpi/power.c index
> >> > 2885e31..9097333 100644
> >> > --- a/xen/arch/x86/acpi/power.c
> >> > +++ b/xen/arch/x86/acpi/power.c
> >> > @@ -45,6 +45,8 @@ void do_suspend_lowlevel(void);
> >> >
> >> > static int device_power_down(void) {
> >> > + int err;
> >> > +
> >> > console_suspend();
> >> >
> >> > time_suspend();
> >> > @@ -53,11 +55,22 @@ static int device_power_down(void)
> >> >
> >> > ioapic_suspend();
> >> >
> >> > - iommu_suspend();
> >> > + err = iommu_suspend();
> >> > +
> >> > + if ( err )
> >> > + goto iommu_suspend_error;
> >> >
> >> > lapic_suspend();
> >> >
> >> > return 0;
> >> > +
> >> > + iommu_suspend_error:
> >> > + ioapic_resume();
> >> > + i8259A_resume();
> >> > + time_resume();
> >> > + console_resume();
> >> > +
> >> > + return err;
> >> > }
> >>
> >> Jan had comment to better reuse device_power_up... looks no change in
> >> this version.
> >
> > Yes, __iiuc__, this may be an optimization, but not a must.
> > We can discuss this in detail In this version.
>
> As an optimization it would indeed be quite pointless here. My request was
> more for maintainability: By re-using the function future changes don't need
> to go to two places, and hence there's no risk of one of them getting
> forgotten.
>
Jan,
What about this one as below:
--- a/xen/arch/x86/acpi/power.c
+++ b/xen/arch/x86/acpi/power.c
@@ -43,6 +43,17 @@ struct acpi_sleep_info acpi_sinfo;
void do_suspend_lowlevel(void);
+enum dev_power_type {
+ TYPE_ALL,
+ TYPE_CONSOLE,
+ TYPE_TIME,
+ TYPE_I8259A,
+ TYPE_IOAPIC,
+ TYPE_IOMMU,
+ TYPE_LAPIC,
+ TYPE_UNKNOWN
+};
+
static int device_power_down(void)
{
console_suspend();
@@ -53,26 +64,35 @@ static int device_power_down(void)
ioapic_suspend();
- iommu_suspend();
+ if ( iommu_suspend() )
+ return TYPE_IOMMU;
lapic_suspend();
return 0;
}
-static void device_power_up(void)
+static void device_power_up(enum dev_power_type type)
{
- lapic_resume();
-
- iommu_resume();
-
- ioapic_resume();
-
- i8259A_resume();
-
- time_resume();
-
- console_resume();
+ switch ( type ) {
+ case TYPE_ALL:
+ case TYPE_LAPIC:
+ lapic_resume();
+ case TYPE_IOMMU:
+ iommu_resume();
+ case TYPE_IOAPIC:
+ ioapic_resume();
+ case TYPE_I8259A:
+ i8259A_resume();
+ case TYPE_TIME:
+ time_resume();
+ case TYPE_CONSOLE:
+ console_resume();
+ break;
+ default:
+ BUG();
+ break;
+ }
}
static void freeze_domains(void)
@@ -169,6 +189,7 @@ static int enter_state(u32 state)
{
printk(XENLOG_ERR "Some devices failed to power down.");
system_state = SYS_STATE_resume;
+ device_power_up(error);
goto done;
}
@@ -196,7 +217,7 @@ static int enter_state(u32 state)
write_cr4(cr4 & ~X86_CR4_MCE);
write_efer(read_efer());
- device_power_up();
+ device_power_up(TYPE_ALL);
mcheck_init(&boot_cpu_data, 0);
write_cr4(cr4);
--
Quan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |