Message ID | 1387220505-9799-2-git-send-email-lauraa@codeaurora.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Dec 16, 2013 at 07:01:45PM +0000, Laura Abbott wrote: > diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h > index 3776217..b8ec776 100644 > --- a/arch/arm64/include/asm/memory.h > +++ b/arch/arm64/include/asm/memory.h > @@ -146,8 +146,9 @@ static inline void *phys_to_virt(phys_addr_t x) > #define ARCH_PFN_OFFSET PHYS_PFN_OFFSET > > #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) > -#define virt_addr_valid(kaddr) (((void *)(kaddr) >= (void *)PAGE_OFFSET) && \ > - ((void *)(kaddr) < (void *)high_memory)) > +#define virt_addr_valid(kaddr) (pfn_valid(__pa(kaddr) >> PAGE_SHIFT) && \ > + ((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory)) > + I still think the original patch was fine for arm64, no need for additional checks since we don't have highmem and __pa() is always linear.
On 12/17/2013 4:00 AM, Catalin Marinas wrote: > On Mon, Dec 16, 2013 at 07:01:45PM +0000, Laura Abbott wrote: >> diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h >> index 3776217..b8ec776 100644 >> --- a/arch/arm64/include/asm/memory.h >> +++ b/arch/arm64/include/asm/memory.h >> @@ -146,8 +146,9 @@ static inline void *phys_to_virt(phys_addr_t x) >> #define ARCH_PFN_OFFSET PHYS_PFN_OFFSET >> >> #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) >> -#define virt_addr_valid(kaddr) (((void *)(kaddr) >= (void *)PAGE_OFFSET) && \ >> - ((void *)(kaddr) < (void *)high_memory)) >> +#define virt_addr_valid(kaddr) (pfn_valid(__pa(kaddr) >> PAGE_SHIFT) && \ >> + ((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory)) >> + > > I still think the original patch was fine for arm64, no need for > additional checks since we don't have highmem and __pa() is always > linear. > Okay, do you want to go ahead and just take the previous version then? Laura
On Wed, Dec 18, 2013 at 06:20:32PM +0000, Laura Abbott wrote: > On 12/17/2013 4:00 AM, Catalin Marinas wrote: > > On Mon, Dec 16, 2013 at 07:01:45PM +0000, Laura Abbott wrote: > >> diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h > >> index 3776217..b8ec776 100644 > >> --- a/arch/arm64/include/asm/memory.h > >> +++ b/arch/arm64/include/asm/memory.h > >> @@ -146,8 +146,9 @@ static inline void *phys_to_virt(phys_addr_t x) > >> #define ARCH_PFN_OFFSET PHYS_PFN_OFFSET > >> > >> #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) > >> -#define virt_addr_valid(kaddr) (((void *)(kaddr) >= (void *)PAGE_OFFSET) && \ > >> - ((void *)(kaddr) < (void *)high_memory)) > >> +#define virt_addr_valid(kaddr) (pfn_valid(__pa(kaddr) >> PAGE_SHIFT) && \ > >> + ((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory)) > >> + > > > > I still think the original patch was fine for arm64, no need for > > additional checks since we don't have highmem and __pa() is always > > linear. > > Okay, do you want to go ahead and just take the previous version then? I already did (while Will is away ;)). Thanks.
diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h index 3776217..b8ec776 100644 --- a/arch/arm64/include/asm/memory.h +++ b/arch/arm64/include/asm/memory.h @@ -146,8 +146,9 @@ static inline void *phys_to_virt(phys_addr_t x) #define ARCH_PFN_OFFSET PHYS_PFN_OFFSET #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) -#define virt_addr_valid(kaddr) (((void *)(kaddr) >= (void *)PAGE_OFFSET) && \ - ((void *)(kaddr) < (void *)high_memory)) +#define virt_addr_valid(kaddr) (pfn_valid(__pa(kaddr) >> PAGE_SHIFT) && \ + ((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory)) + #endif
The definition of virt_addr_valid is that virt_addr_valid should return true if and only if virt_to_page returns a valid pointer. The current definition of virt_addr_valid only checks against the virtual address range. There's no guarantee that just because a virtual address falls bewteen PAGE_OFFSET and high_memory the associated physical memory has a valid backing struct page. Follow the example of other architectures and convert to pfn_valid to verify that the virtual address is actually valid. Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will.deacon@arm.com> Cc: Nicolas Pitre <nico@linaro.org> Signed-off-by: Laura Abbott <lauraa@codeaurora.org> --- arch/arm64/include/asm/memory.h | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-)