diff mbox

[1/3] arm64: Don't use is_module_addr in setting page attributes

Message ID 1424902497-32141-2-git-send-email-lauraa@codeaurora.org (mailing list archive)
State New, archived
Headers show

Commit Message

Laura Abbott Feb. 25, 2015, 10:14 p.m. UTC
The set_memory_* functions currently only support module
addresses. The addresses are validated using is_module_addr.
That function is special though and relies on internal state
in the module subsystem to work properly. At the time of
module initialization and calling set_memory_*, it's too early
for is_module_addr to work properly so it always returns
false. Rather than be subject to the whims of the module state,
just bounds check against the module virtual address range.

Signed-off-by: Laura Abbott <lauraa@codeaurora.org>
---
 arch/arm64/mm/pageattr.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

Comments

Catalin Marinas March 4, 2015, 4:47 p.m. UTC | #1
On Wed, Feb 25, 2015 at 02:14:55PM -0800, Laura Abbott wrote:
> 
> The set_memory_* functions currently only support module
> addresses. The addresses are validated using is_module_addr.
> That function is special though and relies on internal state
> in the module subsystem to work properly. At the time of
> module initialization and calling set_memory_*, it's too early
> for is_module_addr to work properly so it always returns
> false. Rather than be subject to the whims of the module state,
> just bounds check against the module virtual address range.
> 
> Signed-off-by: Laura Abbott <lauraa@codeaurora.org>

Not sure which tree this would be merged through, so:

Acked-by: Catalin Marinas <catalin.marinas@arm.com>

I can pick up the arm64 patch and the module.c one with Rusty's ack (as
for the arm one, I think it could go in via rmk's patch system).
diff mbox

Patch

diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c
index bb0ea94..1d3ec3d 100644
--- a/arch/arm64/mm/pageattr.c
+++ b/arch/arm64/mm/pageattr.c
@@ -51,7 +51,10 @@  static int change_memory_common(unsigned long addr, int numpages,
 		WARN_ON_ONCE(1);
 	}
 
-	if (!is_module_address(start) || !is_module_address(end - 1))
+	if (start < MODULES_VADDR || start >= MODULES_END)
+		return -EINVAL;
+
+	if (end < MODULES_VADDR || end >= MODULES_END)
 		return -EINVAL;
 
 	data.set_mask = set_mask;