arm64: hibernate: handle allocation failures
authorMark Rutland <mark.rutland@arm.com>
Thu, 11 Aug 2016 13:11:06 +0000 (14:11 +0100)
committerAlex Shi <alex.shi@linaro.org>
Fri, 24 Mar 2017 03:24:41 +0000 (11:24 +0800)
commit18fc694578719686df59e31ae32dd862eb5f0ba8
tree9ad8d06688d5a4153c13d4748c2f9e661e5d3768
parent1ff46aa097c9d407a905de365ecdfcb1fa27d0cc
arm64: hibernate: handle allocation failures

In create_safe_exec_page(), we create a copy of the hibernate exit text,
along with some page tables to map this via TTBR0. We then install the
new tables in TTBR0.

In swsusp_arch_resume() we call create_safe_exec_page() before trying a
number of operations which may fail (e.g. copying the linear map page
tables). If these fail, we bail out of swsusp_arch_resume() and return
an error code, but leave TTBR0 as-is. Subsequently, the core hibernate
code will call free_basic_memory_bitmaps(), which will free all of the
memory allocations we made, including the page tables installed in
TTBR0.

Thus, we may have TTBR0 pointing at dangling freed memory for some
period of time. If the hibernate attempt was triggered by a user
requesting a hibernate test via the reboot syscall, we may return to
userspace with the clobbered TTBR0 value.

Avoid these issues by reorganising swsusp_arch_resume() such that we
have no failure paths after create_safe_exec_page(). We also add a check
that the zero page allocation succeeded, matching what we have for other
allocations.

Fixes: 82869ac57b5d ("arm64: kernel: Add support for hibernate/suspend-to-disk")
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: James Morse <james.morse@arm.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: <stable@vger.kernel.org> # 4.7+
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
(cherry picked from commit dfbca61af0b654990b9af8297ac574a9986d8275)
Signed-off-by: Alex Shi <alex.shi@linaro.org>
arch/arm64/kernel/hibernate.c