From mboxrd@z Thu Jan 1 00:00:00 1970 References: <20220523140444.2632658-1-guntgrau@bbl.ma.philips.com> <59e12ca2-6c6f-09ff-5365-985586dc4e4e@siemens.com> From: Philippe Gerum Subject: Re: [PATCH] rtdm/drvlib: Prevent pagefaults on arm on io mapping Date: Wed, 15 Jun 2022 09:54:23 +0200 In-reply-to: <59e12ca2-6c6f-09ff-5365-985586dc4e4e@siemens.com> Message-ID: <87fsk6pddt.fsf@xenomai.org> MIME-Version: 1.0 Content-Type: text/plain List-Id: Discussions about the Xenomai project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jan Kiszka Cc: Gunter Grau , Gunter Grau , xenomai@xenomai.org Jan Kiszka via Xenomai writes: > On 23.05.22 16:04, Gunter Grau via Xenomai wrote: >> From: Gunter Grau >> >> 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 >> --- >> 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. -- Philippe.