On 15.06.22 10:30, Philippe Gerum wrote:
> 
> Jan Kiszka <jan.kis...@siemens.com> writes:
> 
>> On 15.06.22 09:54, Philippe Gerum wrote:
>>>
>>> Jan Kiszka via Xenomai <xenomai@xenomai.org> writes:
>>>
>>>> On 23.05.22 16:04, Gunter Grau via Xenomai wrote:
>>>>> From: Gunter Grau <gunter.g...@philips.com>
>>>>>
>>>>> When mapping io memory into userspace an extra simulated pagefault for all
>>>>> pages is added to prevent later pagefaults because of copy on write
>>>>> mechanisms. This happens only on architectures that have defined the
>>>>> needed cobalt_machine.prefault function.
>>>>>
>>>>> Signed-off-by: Gunter Grau <gunter.g...@philips.com>
>>>>> ---
>>>>>  kernel/cobalt/rtdm/drvlib.c | 10 +++++++++-
>>>>>  1 file changed, 9 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/kernel/cobalt/rtdm/drvlib.c b/kernel/cobalt/rtdm/drvlib.c
>>>>> index 4eaf3a57c..db8431ee1 100644
>>>>> --- a/kernel/cobalt/rtdm/drvlib.c
>>>>> +++ b/kernel/cobalt/rtdm/drvlib.c
>>>>> @@ -1761,6 +1761,7 @@ static int mmap_iomem_helper(struct vm_area_struct 
>>>>> *vma, phys_addr_t pa)
>>>>>  {
>>>>>   pgprot_t prot = PAGE_SHARED;
>>>>>   unsigned long len;
>>>>> + int ret;
>>>>>  
>>>>>   len = vma->vm_end - vma->vm_start;
>>>>>  #ifndef CONFIG_MMU
>>>>> @@ -1774,8 +1775,15 @@ static int mmap_iomem_helper(struct vm_area_struct 
>>>>> *vma, phys_addr_t pa)
>>>>>  #endif
>>>>>   vma->vm_page_prot = pgprot_noncached(prot);
>>>>>  
>>>>> - return remap_pfn_range(vma, vma->vm_start, pa >> PAGE_SHIFT,
>>>>> + ret = remap_pfn_range(vma, vma->vm_start, pa >> PAGE_SHIFT,
>>>>>                          len, vma->vm_page_prot);
>>>>> + if (ret)
>>>>> +         return ret;
>>>>> +
>>>>> + if (cobalt_machine.prefault)
>>>>> +         cobalt_machine.prefault(vma);
>>>>> +
>>>>> + return ret;
>>>>>  }
>>>>>  
>>>>>  static int mmap_buffer_helper(struct rtdm_fd *fd, struct vm_area_struct 
>>>>> *vma)
>>>>
>>>> Wow, that was likely broken by the refactoring in c8e9e166, long ago.
>>>>
>>>> Applied to next
>>>>
>>>
>>> The prefault hook has always been specifically about COW-breaking, I/O
>>> memory has no business with this, so there is no point in having the
>>> iomem helper calling the prefaulting hook.
>>>
>>> I suspect that rtdm_mmap_to_user() should be called instead of
>>> rtdm_iomap_to_user() in the case at hand.
>>>
>>
>> If Gunter is mapping IO memory, rtdm_mmap_to_user is surely not the
>> right thing.
> 
> The xenomai2 implementation had a single helper dealing with I/O and
> kernel memory mappings (from virtual and linear memory) altogether. So I
> would not find impossible that wrong assumptions could be made from
> this implementation.
> 
>>
>> Could it be that the prefault callback also has the side effect of
>> setting all page table entries that would otherwise only be filled lazily?
> 
> Yes, this could prevent PTE misses, however I would expect minor faults
> to take place, those should be handled directly from the out-of-band
> stage.  Otherwise, this _might_ be an issue with the interrupt pipeline
> used. The prefault for ARM was kind of a hack to work around
> shortcomings from the generic COW-breaking mechanism implemented by the
> I-pipe on ARM (IIRC, this had to do with LPAE support).
> 

Gunter, could you take a function-trace of that very first fault without
your patch applied? Then we may see better what actually happens here,
specifically if your patch just happens to paper over a real issue.

BTW, you only tested it with I-pipe kernels so far, or did you also see
the issue with dovetail (5.10+)?

Jan

-- 
Siemens AG, Technology
Competence Center Embedded Linux

Reply via email to