On Fri, May 16, 2014 at 1:28 AM, Nicolas Pitre <nicolas.pi...@linaro.org> wrote: > On Thu, 15 May 2014, Richard Lee wrote: > >> Static vm area boundary check: >> >> paddr1 --->| | >> | | >> |-------| <-\--- svm->vm->addr(is page aligned) >> paddr2 --->| | | >> | --| <--|-- svm->vm->phys_addr >> | | | >> paddr3 --->| | | >> | | | >> |-------| <--|-- next page boundary >> | | | >> paddr4 --->| | | <----- svm->vm->size(including guard page) >> | | | >> | | | >> max paddr_end -->|-------| <--|-- svm->vm's phys_addr_end >> | ///// | | >> paddr5 --->| guard | | >> | page | | >> | ///// | | >> ------- <-/--- svm->vm->addr + svm->vm_size >> >> <1> If the paddr == paddr1, then continue; >> <2> If the paddr == paddr2~paddr4 and paddr_end > phys_addr_end, >> then continue; >> <3> if the paddr >= paddr5 then continue; >> >> Signed-off-by: Richard Lee <superlibj8...@gmail.com> > > instead of doing this repeatedly, why not simply ensure the recorded > static vm information is already page aligned in the first place? >
Sorry, I'm not very sure what vm information you meant here. And the 'svm->vm->addr' and 'svm->vm->size' are all page aligned already, but we cannot make sure that the 'paddr' and 'svm->vm->phys_addr' are page aligned. Thanks, BRs Richard Lee > > >> --- >> >> >> Change in V2: >> - PAGE_SIZE --> PAGE_MASK >> - remove the 'size' page size align operation. >> >> >> >> >> >> >> arch/arm/mm/ioremap.c | 40 ++++++++++++++++++++++++++++++++++++++-- >> 1 file changed, 38 insertions(+), 2 deletions(-) >> >> diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c >> index be69333..f235ab7 100644 >> --- a/arch/arm/mm/ioremap.c >> +++ b/arch/arm/mm/ioremap.c >> @@ -47,16 +47,52 @@ static struct static_vm >> *find_static_vm_paddr(phys_addr_t paddr, >> { >> struct static_vm *svm; >> struct vm_struct *vm; >> + size_t offset; >> + >> + offset = paddr & ~PAGE_MASK; >> >> list_for_each_entry(svm, &static_vmlist, list) { >> + phys_addr_t paddr_end, phys_addr_end; >> + size_t vmoff; >> + >> vm = &svm->vm; >> if (!(vm->flags & VM_ARM_STATIC_MAPPING)) >> continue; >> if ((vm->flags & VM_ARM_MTYPE_MASK) != VM_ARM_MTYPE(mtype)) >> continue; >> >> - if (vm->phys_addr > paddr || >> - paddr + size - 1 > vm->phys_addr + vm->size - 1) >> + /* Static vm area boundary check: >> + * >> + * paddr1 --->| | >> + * | | >> + * |-------| <-\--- svm->vm->addr(page >> aligned) >> + * paddr2 --->| | | >> + * | --| <--|-- svm->vm->phys_addr >> + * | | | >> + * paddr3 --->| | | >> + * | | | >> + * |-------| <--|-- next page boundary >> + * | | | >> + * paddr4 --->| | | <----- svm->vm->size, >> + * | | | including guard page >> + * | | | >> + * max paddr_end -->|-------| <--|-- svm->vm's phys_addr_end >> + * | ///// | | >> + * paddr5 --->| guard | | >> + * | page | | >> + * | ///// | | >> + * ------- <-/-- svm->vm->addr + >> svm->vm_size >> + * >> + * <1> If paddr == paddr1, then continue; >> + * <2> If paddr == paddr2~paddr4 and paddr_end > phys_addr_end, >> + * then continue; >> + * <3> if paddr >= paddr5 then continue; >> + */ >> + vmoff = vm->phys_addr & ~PAGE_MASK; >> + phys_addr_end = vm->phys_addr + vm->size - PAGE_SIZE - vmoff; >> + paddr_end = paddr + size - offset; >> + if (__phys_to_pfn(vm->phys_addr) > __phys_to_pfn(paddr) || >> + paddr_end - 1 > phys_addr_end - 1) >> continue; >> >> return svm; >> -- >> 1.8.4 >> -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/