Re: [PATCH 1/3] csky: Fixup arch_get_unmapped_area() implementation

2019-08-20 Thread Guo Ren
Thx Christoph,

On Wed, Aug 21, 2019 at 10:16 AM Christoph Hellwig  wrote:
>
> > +/*
> > + * We need to ensure that shared mappings are correctly aligned to
> > + * avoid aliasing issues with VIPT caches.  We need to ensure that
> > + * a specific page of an object is always mapped at a multiple of
> > + * SHMLBA bytes.
> > + *
> > + * We unconditionally provide this function for all cases.
> > + */
>
> On something unrelated: If csky has virtually indexed caches you also
> need to implement the flush_kernel_vmap_range and
> invalidate_kernel_vmap_range functions to avoid data corruption when
> doing I/O on vmalloc/vmap ranges.

I'll give another patch for this issue

-- 
Best Regards
 Guo Ren

ML: https://lore.kernel.org/linux-csky/


Re: [PATCH 1/3] csky: Fixup arch_get_unmapped_area() implementation

2019-08-20 Thread Christoph Hellwig
> +/*
> + * We need to ensure that shared mappings are correctly aligned to
> + * avoid aliasing issues with VIPT caches.  We need to ensure that
> + * a specific page of an object is always mapped at a multiple of
> + * SHMLBA bytes.
> + *
> + * We unconditionally provide this function for all cases.
> + */

On something unrelated: If csky has virtually indexed caches you also
need to implement the flush_kernel_vmap_range and
invalidate_kernel_vmap_range functions to avoid data corruption when
doing I/O on vmalloc/vmap ranges.


[PATCH 1/3] csky: Fixup arch_get_unmapped_area() implementation

2019-08-20 Thread guoren
From: Guo Ren 

Current arch_get_unmapped_area() of abiv1 doesn't use standard kernel
api. After referring to the implementation of arch/arm, we implement
it with vm_unmapped_area() from linux/mm.h.

Signed-off-by: Guo Ren 
Cc: Arnd Bergmann 
---
 arch/csky/abiv1/inc/abi/page.h |  5 +--
 arch/csky/abiv1/mmap.c | 75 ++
 2 files changed, 43 insertions(+), 37 deletions(-)

diff --git a/arch/csky/abiv1/inc/abi/page.h b/arch/csky/abiv1/inc/abi/page.h
index 6336e92..c864519 100644
--- a/arch/csky/abiv1/inc/abi/page.h
+++ b/arch/csky/abiv1/inc/abi/page.h
@@ -1,13 +1,14 @@
 /* SPDX-License-Identifier: GPL-2.0 */
 // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
 
-extern unsigned long shm_align_mask;
+#include 
+
 extern void flush_dcache_page(struct page *page);
 
 static inline unsigned long pages_do_alias(unsigned long addr1,
   unsigned long addr2)
 {
-   return (addr1 ^ addr2) & shm_align_mask;
+   return (addr1 ^ addr2) & (SHMLBA-1);
 }
 
 static inline void clear_user_page(void *addr, unsigned long vaddr,
diff --git a/arch/csky/abiv1/mmap.c b/arch/csky/abiv1/mmap.c
index b462fd5..6792aca 100644
--- a/arch/csky/abiv1/mmap.c
+++ b/arch/csky/abiv1/mmap.c
@@ -9,58 +9,63 @@
 #include 
 #include 
 
-unsigned long shm_align_mask = (0x4000 >> 1) - 1;   /* Sane caches */
+#define COLOUR_ALIGN(addr,pgoff)   \
+   addr)+SHMLBA-1)&~(SHMLBA-1)) +  \
+(((pgoff) TASK_SIZE)
return -ENOMEM;
-   do_color_align = 0;
-   if (filp || (flags & MAP_SHARED))
-   do_color_align = 1;
+
if (addr) {
-   if (do_color_align)
+   if (do_align)
addr = COLOUR_ALIGN(addr, pgoff);
else
addr = PAGE_ALIGN(addr);
-   vmm = find_vma(current->mm, addr);
+
+   vma = find_vma(mm, addr);
if (TASK_SIZE - len >= addr &&
-   (!vmm || addr + len <= vmm->vm_start))
+   (!vma || addr + len <= vm_start_gap(vma)))
return addr;
}
-   addr = TASK_UNMAPPED_BASE;
-   if (do_color_align)
-   addr = COLOUR_ALIGN(addr, pgoff);
-   else
-   addr = PAGE_ALIGN(addr);
 
-   for (vmm = find_vma(current->mm, addr); ; vmm = vmm->vm_next) {
-   /* At this point: (!vmm || addr < vmm->vm_end). */
-   if (TASK_SIZE - len < addr)
-   return -ENOMEM;
-   if (!vmm || addr + len <= vmm->vm_start)
-   return addr;
-   addr = vmm->vm_end;
-   if (do_color_align)
-   addr = COLOUR_ALIGN(addr, pgoff);
-   }
+   info.flags = 0;
+   info.length = len;
+   info.low_limit = mm->mmap_base;
+   info.high_limit = TASK_SIZE;
+   info.align_mask = do_align ? (PAGE_MASK & (SHMLBA - 1)) : 0;
+   info.align_offset = pgoff << PAGE_SHIFT;
+   return vm_unmapped_area();
 }
-- 
2.7.4