Skip to content

Commit 87fecea

Browse files
authored
Merge pull request #5 from yosefe/topic/fix-soft-lockup-readonly-mem
Fix soft lockup while trying to attach read-only transparent huge page
2 parents 32564de + f0963a6 commit 87fecea

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

kernel/xpmem_pfn.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)