All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai] rtdm_iomap_to_user: fix caching and page fault issues
@ 2013-01-15 15:22 Wolfgang Grandegger
  2013-01-15 19:46 ` Gilles Chanteperdrix
  0 siblings, 1 reply; 5+ messages in thread
From: Wolfgang Grandegger @ 2013-01-15 15:22 UTC (permalink / raw)
  To: Xenomai@xenomai.org

From: Wolfgang Grandegger <wg@denx.de>

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 <wg@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)
-- 
1.7.11.7



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [Xenomai] rtdm_iomap_to_user: fix caching and page fault issues
  2013-01-15 15:22 [Xenomai] rtdm_iomap_to_user: fix caching and page fault issues Wolfgang Grandegger
@ 2013-01-15 19:46 ` Gilles Chanteperdrix
  2013-01-16  7:37   ` Wolfgang Grandegger
  0 siblings, 1 reply; 5+ messages in thread
From: Gilles Chanteperdrix @ 2013-01-15 19:46 UTC (permalink / raw)
  To: Wolfgang Grandegger; +Cc: Xenomai@xenomai.org

On 01/15/2013 04:22 PM, Wolfgang Grandegger wrote:

> From: Wolfgang Grandegger <wg@denx.de>
> 
> 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 <wg@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));		\


Should not this be decided in the upper layers?

-- 
                                                                Gilles.


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Xenomai] rtdm_iomap_to_user: fix caching and page fault issues
  2013-01-15 19:46 ` Gilles Chanteperdrix
@ 2013-01-16  7:37   ` Wolfgang Grandegger
  2013-01-16  8:22     ` Gilles Chanteperdrix
  0 siblings, 1 reply; 5+ messages in thread
From: Wolfgang Grandegger @ 2013-01-16  7:37 UTC (permalink / raw)
  To: Gilles Chanteperdrix; +Cc: Xenomai@xenomai.org

On 01/15/2013 08:46 PM, Gilles Chanteperdrix wrote:
> On 01/15/2013 04:22 PM, Wolfgang Grandegger wrote:
> 
>> From: Wolfgang Grandegger <wg@denx.de>
>>
>> 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 <wg@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);	\

Hm, here pgprot_noncached() is already used.

>>      /* 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));		\
> 
> 
> Should not this be decided in the upper layers?

Upper layers? You mean calling xnarch_remap_io_page_range() with the
protection argument "pgprot_noncached(PAGE_SHARED)" in rtdm_mmap_buffer()?

Wolfgang.



> 



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Xenomai] rtdm_iomap_to_user: fix caching and page fault issues
  2013-01-16  7:37   ` Wolfgang Grandegger
@ 2013-01-16  8:22     ` Gilles Chanteperdrix
  2013-09-27  9:25       ` Henri Roosen
  0 siblings, 1 reply; 5+ messages in thread
From: Gilles Chanteperdrix @ 2013-01-16  8:22 UTC (permalink / raw)
  To: Wolfgang Grandegger; +Cc: Xenomai@xenomai.org

On 01/16/2013 08:37 AM, Wolfgang Grandegger wrote:

> On 01/15/2013 08:46 PM, Gilles Chanteperdrix wrote:
>> On 01/15/2013 04:22 PM, Wolfgang Grandegger wrote:
>>
>>> From: Wolfgang Grandegger <wg@denx.de>
>>>
>>> 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 <wg@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);	\
> 
> Hm, here pgprot_noncached() is already used.
> 
>>>      /* 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));		\
>>
>>
>> Should not this be decided in the upper layers?
> 
> Upper layers? You mean calling xnarch_remap_io_page_range() with the
> protection argument "pgprot_noncached(PAGE_SHARED)" in rtdm_mmap_buffer()?


I mean users could want to map i/o regions cacheable, but as you say,
the pgprot_noncached is already hardcoded in the vma, so, I will merge
your patch.

-- 
                                                                Gilles.


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Xenomai] rtdm_iomap_to_user: fix caching and page fault issues
  2013-01-16  8:22     ` Gilles Chanteperdrix
@ 2013-09-27  9:25       ` Henri Roosen
  0 siblings, 0 replies; 5+ messages in thread
From: Henri Roosen @ 2013-09-27  9:25 UTC (permalink / raw)
  To: Gilles Chanteperdrix; +Cc: Xenomai@xenomai.org

On Wed, Jan 16, 2013 at 9:22 AM, Gilles Chanteperdrix <
gilles.chanteperdrix@xenomai.org> wrote:

> On 01/16/2013 08:37 AM, Wolfgang Grandegger wrote:
>
> > On 01/15/2013 08:46 PM, Gilles Chanteperdrix wrote:
> >> On 01/15/2013 04:22 PM, Wolfgang Grandegger wrote:
> >>
> >>> From: Wolfgang Grandegger <wg@denx.de>
> >>>
> >>> 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 <wg@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);   \
> >
> > Hm, here pgprot_noncached() is already used.
> >
> >>>      /* 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));              \
> >>
> >>
> >> Should not this be decided in the upper layers?
> >
> > Upper layers? You mean calling xnarch_remap_io_page_range() with the
> > protection argument "pgprot_noncached(PAGE_SHARED)" in
> rtdm_mmap_buffer()?
>
>
> I mean users could want to map i/o regions cacheable, but as you say,
> the pgprot_noncached is already hardcoded in the vma, so, I will merge
> your patch.
>

I used rtdm_iomap_to_user() to map the iMX6 EIM device into user space and
still see caching behavior.

Wolfgang, your patch didn't apply the pgprot_noncached(prot) to the #if
LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15) && defined(CONFIG_MMU) case.
Was that intended? Were you using a non-mmu configuration or an old kernel?

Anyway, when I apply that change to the >v2.6.15&mmu case, then the caching
behavior is gone. I think that is correct, because my assumption is the
>v2.6.15&mmu check should only switch the use of vm_insert_page(). Please
comment on this assumption.

If the assumption is correct, then select one of the attached patches. The
first one just adds the pgprot_noncached(prot) to the >v2.6.15&mmu case,
while version 2 removes removes the duplicate code
for wrap_remap_io_page_range() and wrap_remap_kmem_page_range(). So NOTE to
only select one of the patches.

Thanks,
Henri

>
> --
>                                                                 Gilles.
>
> _______________________________________________
> Xenomai mailing list
> Xenomai@xenomai.org
> http://www.xenomai.org/mailman/listinfo/xenomai
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: fix_wrap_remap_io_page_range_cached_mapping_v1.patch
Type: application/octet-stream
Size: 729 bytes
Desc: not available
URL: <http://www.xenomai.org/pipermail/xenomai/attachments/20130927/03f29aad/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: fix_wrap_remap_io_page_range_cached_mapping_v2.patch
Type: application/octet-stream
Size: 2085 bytes
Desc: not available
URL: <http://www.xenomai.org/pipermail/xenomai/attachments/20130927/03f29aad/attachment-0001.obj>

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2013-09-27  9:25 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-15 15:22 [Xenomai] rtdm_iomap_to_user: fix caching and page fault issues Wolfgang Grandegger
2013-01-15 19:46 ` Gilles Chanteperdrix
2013-01-16  7:37   ` Wolfgang Grandegger
2013-01-16  8:22     ` Gilles Chanteperdrix
2013-09-27  9:25       ` Henri Roosen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.