[ARM] S3C: Do not kmalloc/kfree during inner suspend code.
The PM CRC checking code kmallocs an area to save a set of CRC values during suspend. This triggers a warning due to the call of a function that might sleep whilst the system is not in a valid state to do so. Move the allocation and free to points in the suspend and resume process where they can call a function that might-sleep. Signed-off-by: Ben Dooks <ben-linux@fluff.org>
This commit is contained in:
parent
663a83048c
commit
aa8aba6944
@ -129,10 +129,12 @@ extern void s3c_pm_dbg(const char *msg, ...);
|
|||||||
#ifdef CONFIG_S3C2410_PM_CHECK
|
#ifdef CONFIG_S3C2410_PM_CHECK
|
||||||
extern void s3c_pm_check_prepare(void);
|
extern void s3c_pm_check_prepare(void);
|
||||||
extern void s3c_pm_check_restore(void);
|
extern void s3c_pm_check_restore(void);
|
||||||
|
extern void s3c_pm_check_cleanup(void);
|
||||||
extern void s3c_pm_check_store(void);
|
extern void s3c_pm_check_store(void);
|
||||||
#else
|
#else
|
||||||
#define s3c_pm_check_prepare() do { } while(0)
|
#define s3c_pm_check_prepare() do { } while(0)
|
||||||
#define s3c_pm_check_restore() do { } while(0)
|
#define s3c_pm_check_restore() do { } while(0)
|
||||||
|
#define s3c_pm_check_cleanup() do { } while(0)
|
||||||
#define s3c_pm_check_store() do { } while(0)
|
#define s3c_pm_check_store() do { } while(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -222,9 +222,21 @@ static u32 *s3c_pm_runcheck(struct resource *res, u32 *val)
|
|||||||
*/
|
*/
|
||||||
void s3c_pm_check_restore(void)
|
void s3c_pm_check_restore(void)
|
||||||
{
|
{
|
||||||
if (crcs != NULL) {
|
if (crcs != NULL)
|
||||||
s3c_pm_run_sysram(s3c_pm_runcheck, crcs);
|
s3c_pm_run_sysram(s3c_pm_runcheck, crcs);
|
||||||
kfree(crcs);
|
|
||||||
crcs = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* s3c_pm_check_cleanup() - free memory resources
|
||||||
|
*
|
||||||
|
* Free the resources that where allocated by the suspend
|
||||||
|
* memory check code. We do this separately from the
|
||||||
|
* s3c_pm_check_restore() function as we cannot call any
|
||||||
|
* functions that might sleep during that resume.
|
||||||
|
*/
|
||||||
|
void s3c_pm_check_cleanup(void)
|
||||||
|
{
|
||||||
|
kfree(crcs);
|
||||||
|
crcs = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -254,10 +254,6 @@ static int s3c_pm_enter(suspend_state_t state)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* prepare check area if configured */
|
|
||||||
|
|
||||||
s3c_pm_check_prepare();
|
|
||||||
|
|
||||||
/* store the physical address of the register recovery block */
|
/* store the physical address of the register recovery block */
|
||||||
|
|
||||||
s3c_sleep_save_phys = virt_to_phys(regs_save);
|
s3c_sleep_save_phys = virt_to_phys(regs_save);
|
||||||
@ -329,8 +325,23 @@ static int s3c_pm_enter(suspend_state_t state)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int s3c_pm_prepare(void)
|
||||||
|
{
|
||||||
|
/* prepare check area if configured */
|
||||||
|
|
||||||
|
s3c_pm_check_prepare();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void s3c_pm_finish(void)
|
||||||
|
{
|
||||||
|
s3c_pm_check_cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
static struct platform_suspend_ops s3c_pm_ops = {
|
static struct platform_suspend_ops s3c_pm_ops = {
|
||||||
.enter = s3c_pm_enter,
|
.enter = s3c_pm_enter,
|
||||||
|
.prepare = s3c_pm_prepare,
|
||||||
|
.finish = s3c_pm_finish,
|
||||||
.valid = suspend_valid_only_mem,
|
.valid = suspend_valid_only_mem,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user