@@ -229,6 +229,7 @@ xpmem_pin_page(struct xpmem_thread_group *tg, struct task_struct *src_task,
229229 struct page * page ;
230230 struct vm_area_struct * vma ;
231231 cpumask_t saved_mask = CPU_MASK_NONE ;
232+ int foll_write ;
232233
233234 vma = find_vma (src_mm , vaddr );
234235 if (!vma || vma -> vm_start > vaddr )
@@ -257,20 +258,25 @@ xpmem_pin_page(struct xpmem_thread_group *tg, struct task_struct *src_task,
257258 set_cpus_allowed_ptr (current , cpumask_of (task_cpu (src_task )));
258259 }
259260
261+ /* Map with write permissions only if source VMA is writeable */
262+ foll_write = (vma -> vm_flags & VM_WRITE ) ? FOLL_WRITE : 0 ;
263+
260264 /* get_user_pages()/get_user_pages_remote() faults and pins the page */
261265#if LINUX_VERSION_CODE >= KERNEL_VERSION (5 , 9 , 0 )
262- ret = get_user_pages_remote (src_mm , vaddr , 1 , FOLL_WRITE | FOLL_FORCE ,
263- & page , NULL , NULL );
266+ ret = get_user_pages_remote (src_mm , vaddr , 1 , foll_write , & page , NULL ,
267+ NULL );
264268#elif LINUX_VERSION_CODE >= KERNEL_VERSION (4 , 10 , 0 )
265- ret = get_user_pages_remote (src_task , src_mm , vaddr , 1 , FOLL_WRITE | FOLL_FORCE ,
266- & page , NULL , NULL );
269+ ret = get_user_pages_remote (src_task , src_mm , vaddr , 1 , foll_write ,
270+ & page , NULL , NULL );
267271#elif LINUX_VERSION_CODE >= KERNEL_VERSION (4 , 9 , 0 )
268- ret = get_user_pages_remote (src_task , src_mm , vaddr , 1 , FOLL_WRITE | FOLL_FORCE ,
272+ ret = get_user_pages_remote (src_task , src_mm , vaddr , 1 , foll_write ,
269273 & page , NULL );
270274#elif LINUX_VERSION_CODE >= KERNEL_VERSION (4 , 8 , 0 )
271- ret = get_user_pages_remote (src_task , src_mm , vaddr , 1 , 1 , 1 , & page , NULL );
275+ ret = get_user_pages_remote (src_task , src_mm , vaddr , 1 , foll_write , 0 ,
276+ & page , NULL );
272277#else
273- ret = get_user_pages (src_task , src_mm , vaddr , 1 , 1 , 1 , & page , NULL );
278+ ret = get_user_pages (src_task , src_mm , vaddr , 1 , foll_write , 0 , & page ,
279+ NULL );
274280#endif
275281 if (!cpumask_empty (& saved_mask ))
276282 set_cpus_allowed_ptr (current , & saved_mask );
0 commit comments