Will be used for pinning during mprotect as well. Signed-off-by: Jan Kiszka <jan.kis...@siemens.com> --- include/linux/ipipe.h | 1 + mm/memory.c | 38 +++++++++++++++++++++++--------------- 2 files changed, 24 insertions(+), 15 deletions(-)
Changes in v2: - Refactored __ipipe_disable_ondemand_mappings according to request diff --git a/include/linux/ipipe.h b/include/linux/ipipe.h index 9f07346..29051c7 100644 --- a/include/linux/ipipe.h +++ b/include/linux/ipipe.h @@ -68,6 +68,7 @@ int __ipipe_migrate_head(void); void __ipipe_reenter_root(void); int __ipipe_disable_ondemand_mappings(struct task_struct *p); +int __ipipe_pin_vma(struct mm_struct *mm, struct vm_area_struct *vma); #ifdef CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH diff --git a/mm/memory.c b/mm/memory.c index ef04820..58b7f38 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -4092,13 +4092,31 @@ static inline int ipipe_pin_pud_range(struct mm_struct *mm, pgd_t *pgd, return 0; } -int __ipipe_disable_ondemand_mappings(struct task_struct *tsk) +int __ipipe_pin_vma(struct mm_struct *mm, struct vm_area_struct *vma) { unsigned long addr, next, end; + pgd_t *pgd; + + addr = vma->vm_start; + end = vma->vm_end; + + pgd = pgd_offset(mm, addr); + do { + next = pgd_addr_end(addr, end); + if (pgd_none_or_clear_bad(pgd)) + continue; + if (ipipe_pin_pud_range(mm, pgd, vma, addr, next)) + return -ENOMEM; + } while (pgd++, addr = next, addr != end); + + return 0; +} + +int __ipipe_disable_ondemand_mappings(struct task_struct *tsk) +{ struct vm_area_struct *vma; struct mm_struct *mm; int result = 0; - pgd_t *pgd; mm = get_task_mm(tsk); if (!mm) @@ -4113,19 +4131,9 @@ int __ipipe_disable_ondemand_mappings(struct task_struct *tsk) || !(vma->vm_flags & VM_WRITE)) continue; - addr = vma->vm_start; - end = vma->vm_end; - - pgd = pgd_offset(mm, addr); - do { - next = pgd_addr_end(addr, end); - if (pgd_none_or_clear_bad(pgd)) - continue; - if (ipipe_pin_pud_range(mm, pgd, vma, addr, next)) { - result = -ENOMEM; - goto done_mm; - } - } while (pgd++, addr = next, addr != end); + result = __ipipe_pin_vma(mm, vma); + if (result < 0) + goto done_mm; } set_bit(MMF_VM_PINNED, &mm->flags); -- 1.7.3.4 _______________________________________________ Adeos-main mailing list Adeos-main@gna.org https://mail.gna.org/listinfo/adeos-main