From: Gunter Grau <[email protected]> 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 <[email protected]> --- 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) -- 2.25.1
