powerpc/pseries/hibernation: perform post-suspend fixups later
authorNathan Lynch <nathanl@linux.ibm.com>
Mon, 7 Dec 2020 21:51:57 +0000 (15:51 -0600)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 8 Dec 2020 10:41:02 +0000 (21:41 +1100)
The pseries hibernate code calls post_mobility_fixup() which is sort
of a dumping ground of fixups that need to run after resuming from
suspend regardless of whether suspend was a hibernation or a
migration. Calling post_mobility_fixup() from
pseries_suspend_enable_irqs() runs this code early in resume with
devices suspended and only one CPU up, while the much more commonly
used migration case runs these fixups in a more typical process
context.

Call post_mobility_fixup() after the suspend core returns a success
status to the hibernate sysfs store method and remove
pseries_suspend_enable_irqs().

Signed-off-by: Nathan Lynch <nathanl@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20201207215200.1785968-26-nathanl@linux.ibm.com
arch/powerpc/platforms/pseries/suspend.c

index 6a94cc0deb8838a3ab3ed07d419bd22a5ab09579..589a91730db809c584eaae2824b8b023b72eee28 100644 (file)
@@ -50,21 +50,6 @@ static int pseries_suspend_begin(u64 stream_id)
        return 0;
 }
 
-/**
- * pseries_suspend_enable_irqs
- *
- * Post suspend configuration updates
- *
- **/
-static void pseries_suspend_enable_irqs(void)
-{
-       /*
-        * Update configuration which can be modified based on device tree
-        * changes during resume.
-        */
-       post_mobility_fixup();
-}
-
 /**
  * pseries_suspend_enter - Final phase of hibernation
  *
@@ -127,8 +112,11 @@ static ssize_t store_hibernate(struct device *dev,
        if (!rc)
                rc = pm_suspend(PM_SUSPEND_MEM);
 
-       if (!rc)
+       if (!rc) {
                rc = count;
+               post_mobility_fixup();
+       }
+
 
        return rc;
 }
@@ -214,7 +202,6 @@ static int __init pseries_suspend_init(void)
        if ((rc = pseries_suspend_sysfs_register(&suspend_dev)))
                return rc;
 
-       ppc_md.suspend_enable_irqs = pseries_suspend_enable_irqs;
        suspend_set_ops(&pseries_suspend_ops);
        return 0;
 }