Module: xenomai-2.6
Branch: master
Commit: f0a7b116faab75f732b611e0ba99b9b6ea7ce0ea
URL:    
http://git.xenomai.org/?p=xenomai-2.6.git;a=commit;h=f0a7b116faab75f732b611e0ba99b9b6ea7ce0ea

Author: Wolfgang Grandegger <w...@denx.de>
Date:   Tue Jan 15 16:22:02 2013 +0100

rtdm_iomap_to_user: fix caching and page fault issues

Pages mapped by rtdm_iomap_to_user() might be cached and may
page fault on the first write. At least that's the behaviour
we observed on an ARM mx6q system. This patch fixes these
issues.

Signed-off-by: Wolfgang Grandegger <w...@denx.de>

---

 include/asm-generic/wrappers.h |    2 +-
 ksrc/skins/rtdm/drvlib.c       |    8 +++++---
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/include/asm-generic/wrappers.h b/include/asm-generic/wrappers.h
index de1f0d7..e71bcc3 100644
--- a/include/asm-generic/wrappers.h
+++ b/include/asm-generic/wrappers.h
@@ -394,7 +394,7 @@ static inline void *kzalloc(size_t size, int flags)
 #define wrap_remap_io_page_range(vma,from,to,size,prot)  ({            \
     (vma)->vm_page_prot = pgprot_noncached((vma)->vm_page_prot);       \
     /* Sets VM_RESERVED | VM_IO | VM_PFNMAP on the vma. */             \
-    remap_pfn_range(vma,from,(to) >> PAGE_SHIFT,size,prot);            \
+    remap_pfn_range(vma,from,(to) >> PAGE_SHIFT,size,pgprot_noncached(prot));  
        \
     })
 #define wrap_remap_kmem_page_range(vma,from,to,size,prot)  ({          \
     /* Sets VM_RESERVED | VM_IO | VM_PFNMAP on the vma. */             \
diff --git a/ksrc/skins/rtdm/drvlib.c b/ksrc/skins/rtdm/drvlib.c
index e5c470c..391d45f 100644
--- a/ksrc/skins/rtdm/drvlib.c
+++ b/ksrc/skins/rtdm/drvlib.c
@@ -1858,10 +1858,12 @@ static int rtdm_mmap_buffer(struct file *filp, struct 
vm_area_struct *vma)
 #else
        vma->vm_pgoff = paddr >> PAGE_SHIFT;
 #endif /* CONFIG_MMU */
-       if (mmap_data->src_paddr)
-               ret = xnarch_remap_io_page_range(filp, vma, maddr, paddr,
+       if (mmap_data->src_paddr) {
+               ret = xnarch_remap_io_page_range(filp, vma, maddr, paddr,
                                                 size, PAGE_SHARED);
-       else {
+               if (!ret)
+                       xnarch_fault_range(vma);
+       } else {
                ret = xnarch_remap_kmem_page_range(vma, maddr, paddr,
                                                   size, PAGE_SHARED);
                if (!ret)


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai-git

Reply via email to