[PATCH v2 10/11] PM / Hibernate: clean cached pages on architectures that require it
james.morse at arm.com
Mon Nov 16 04:27:07 PST 2015
On 14/11/15 20:26, Pavel Machek wrote:
> On Tue 2015-10-27 17:29:19, James Morse wrote:
>> Some architectures require code written to memory as if it were data to be
>> 'cleaned' from any data caches so that the processor can fetch them as new
>> During resume from hibernate, the snapshot code copies some pages directly,
>> meaning these architectures do not get a chance to perform their cache
>> maintenance. Add a call to flush_icache_range(), which is provided by
>> architectures that require it, to perform the maintenance.
>> This mirrors the kernel's behaviour when loading kernel modules and when
>> mapping executable pages to user space.
>> Signed-off-by: James Morse <james.morse at arm.com>
> Looks reasonable.
> Acked-by: Pavel Machek <pavel at ucw.cz>
>> kernel/power/snapshot.c | 4 ++++
>> 1 file changed, 4 insertions(+)
>> diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c
>> index 5235dd4e1e2f..139fc449ad75 100644
>> --- a/kernel/power/snapshot.c
>> +++ b/kernel/power/snapshot.c
>> @@ -1196,9 +1197,12 @@ static unsigned int count_data_pages(void)
>> static inline void do_copy_page(long *dst, long *src)
>> int n;
>> + unsigned long __maybe_unused start = (unsigned long)dst;
> Why the "maybe unused"?
To avoid a build warning on x86_64, and any other architectures that don't
use the arguments in their flush_icache_range() implementation.
Without __maybe_unused, gcc 4.9.2, building for x86_64:
> ../kernel/power/snapshot.c: In function ‘do_copy_page’:
> ../kernel/power/snapshot.c:1200:16: warning: unused variable ‘start’
> unsigned long start = (unsigned long)dst;
>> for (n = PAGE_SIZE / sizeof(long); n; n--)
>> *dst++ = *src++;
>> + flush_icache_range(start, start+PAGE_SIZE);
More information about the linux-arm-kernel