fault mmaped area upon rtdm_mmap_to_user.
PATCH 1/1 fault mmaped area upon rtdm_mmap_to_user.
Hi Jan,
I have just commited a modification of the nucleus heap which allows faulting newly mapped pages. However, I noticed that we should modify rtdm_mmap_to_user as in the attached patch.
At this chance, I also noticed that there is no way to ask for uncached memory to rtdm_mmap_to_user, how do you think we should change rtdm_mmap_to_user to allow this?
Regards.
skins/rtdm/drvlib.c +17 -6
@@ -1781,6 +1781,7 @@ static int rtdm_mmap_buffer(struct file {struct rtdm_mmap_data *mmap_data = filp->private_data;unsigned long vaddr, paddr, maddr, size; +int ret; vma->vm_ops = mmap_data->vm_ops; vma->vm_private_data = mmap_data->vm_private_data;
@@ -1810,15 +1811,25 @@ static int rtdm_mmap_buffer(struct file vaddr +=PAGE_SIZE ; mapped_size += PAGE_SIZE; } -return 0 ; +#ifdef xnarch_fault_range +xnarch_fault_range (vma); +#endif /* xnarch_fault_range */ + ret =0 ; } else#endif /* CONFIG_MMU */ if (mmap_data->src_paddr) -return xnarch_remap_io_page_range (filp, vma, maddr, paddr, - size,PAGE_SHARED ); -else -return xnarch_remap_kmem_page_range (vma, maddr, paddr, - size,PAGE_SHARED ); + ret =xnarch_remap_io_page_range (filp, vma, maddr, paddr, + size,PAGE_SHARED ); +else { + ret =xnarch_remap_kmem_page_range (vma, maddr, paddr, + size,PAGE_SHARED ); +#ifdef xnarch_fault_range +if (!ret) +xnarch_fault_range (vma); +#endif /* xnarch_fault_range */ + } + +return ret; }static struct file_operations rtdm_mmap_fops = {
Signature · 1 line
Gilles.
Quoted 5 lines · Gilles Chanteperdrix
Hi Jan,
I have just commited a modification of the nucleus heap which allows faulting newly mapped pages. However, I noticed that we should modify
rtdm_mmap_to_useras in the attached patch.
No general concerns, please just provide an empty xnarch_fault_range as default to avoid the #ifdefs. Is this an ARM-only issue?
Quoted 4 lines
At this chance, I also noticed that there is no way to ask for uncached memory to
rtdm_mmap_to_user, how do you think we should changertdm_mmap_to_userto allow this?
Look like we would have to introduce a 'flags' argument to rtdm_mmap_to_user. That's 2.5 material, where we'll change a few RTDM APIs anyway.
Jan
Quoted 49 lines
Regards.
Index:
ksrc/skins/rtdm/drvlib.c
===================================================================skins/rtdm/drvlib.c +17
-6@@ -1781,6 +1781,7 @@ static int rtdm_mmap_buffer(struct file {struct rtdm_mmap_data *mmap_data = filp->private_data;unsigned long vaddr, paddr, maddr, size; +int ret; vma->vm_ops = mmap_data->vm_ops; vma->vm_private_data = mmap_data->vm_private_data;@@ -1810,15 +1811,25 @@ static int rtdm_mmap_buffer(struct file vaddr +=PAGE_SIZE ; mapped_size += PAGE_SIZE; } -return 0 ; +#ifdef xnarch_fault_range +xnarch_fault_range (vma); +#endif /* xnarch_fault_range */ + ret =0 ; } else#endif /* CONFIG_MMU */ if (mmap_data->src_paddr) -return xnarch_remap_io_page_range (filp, vma, maddr, paddr, - size,PAGE_SHARED ); -else -return xnarch_remap_kmem_page_range (vma, maddr, paddr, - size,PAGE_SHARED ); + ret =xnarch_remap_io_page_range (filp, vma, maddr, paddr, + size,PAGE_SHARED ); +else { + ret =xnarch_remap_kmem_page_range (vma, maddr, paddr, + size,PAGE_SHARED ); +#ifdef xnarch_fault_range +if (!ret) +xnarch_fault_range (vma); +#endif /* xnarch_fault_range */ + } + +return ret; }static struct file_operations rtdm_mmap_fops = {