Message ID | 20200624083321.144975-3-avagin@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | arm64: add the time namespace support | expand |
On Wed, Jun 24, 2020 at 01:33:17AM -0700, Andrei Vagin wrote: > The order of vvar pages depends on whether a task belongs to the root > time namespace or not. In the root time namespace, a task doesn't have a > per-namespace page. In a non-root namespace, the VVAR page which contains > the system-wide VDSO data is replaced with a namespace specific page > that contains clock offsets. > > Whenever a task changes its namespace, the VVAR page tables are cleared > and then they will be re-faulted with a corresponding layout. > > A task can switch its time namespace only if its ->mm isn't shared with > another task. > > Reviewed-by: Vincenzo Frascino <vincenzo.frascino@arm.com> > Reviewed-by: Dmitry Safonov <dima@arista.com> > Signed-off-by: Andrei Vagin <avagin@gmail.com> > --- > arch/arm64/kernel/vdso.c | 31 +++++++++++++++++++++++++++++++ > 1 file changed, 31 insertions(+) > > diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c > index 7c4620451fa5..bdf492a17dff 100644 > --- a/arch/arm64/kernel/vdso.c > +++ b/arch/arm64/kernel/vdso.c > @@ -124,6 +124,37 @@ static int __vdso_init(enum vdso_abi abi) > return 0; > } > > +#ifdef CONFIG_TIME_NS > +/* > + * The vvar mapping contains data for a specific time namespace, so when a task > + * changes namespace we must unmap its vvar data for the old namespace. > + * Subsequent faults will map in data for the new namespace. > + * > + * For more details see timens_setup_vdso_data(). > + */ > +int vdso_join_timens(struct task_struct *task, struct time_namespace *ns) > +{ > + struct mm_struct *mm = task->mm; > + struct vm_area_struct *vma; > + > + mmap_read_lock(mm); Perfect, thanks! I'll adapt my patches so that my change and this change don't conflict and can go in together. Once they're landed we can simply turn int vdso_join_timens() into void vdso_join_timens() everywhere. Reviewed-by: Christian Brauner <christian.brauner@ubuntu.com> Thanks! Christian
On Wed, Jun 24, 2020 at 05:18:01PM +0200, Christian Brauner wrote: > On Wed, Jun 24, 2020 at 01:33:17AM -0700, Andrei Vagin wrote: > > The order of vvar pages depends on whether a task belongs to the root > > time namespace or not. In the root time namespace, a task doesn't have a > > per-namespace page. In a non-root namespace, the VVAR page which contains > > the system-wide VDSO data is replaced with a namespace specific page > > that contains clock offsets. > > > > Whenever a task changes its namespace, the VVAR page tables are cleared > > and then they will be re-faulted with a corresponding layout. > > > > A task can switch its time namespace only if its ->mm isn't shared with > > another task. > > > > Reviewed-by: Vincenzo Frascino <vincenzo.frascino@arm.com> > > Reviewed-by: Dmitry Safonov <dima@arista.com> > > Signed-off-by: Andrei Vagin <avagin@gmail.com> > > --- > > arch/arm64/kernel/vdso.c | 31 +++++++++++++++++++++++++++++++ > > 1 file changed, 31 insertions(+) > > > > diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c > > index 7c4620451fa5..bdf492a17dff 100644 > > --- a/arch/arm64/kernel/vdso.c > > +++ b/arch/arm64/kernel/vdso.c > > @@ -124,6 +124,37 @@ static int __vdso_init(enum vdso_abi abi) > > return 0; > > } > > > > +#ifdef CONFIG_TIME_NS > > +/* > > + * The vvar mapping contains data for a specific time namespace, so when a task > > + * changes namespace we must unmap its vvar data for the old namespace. > > + * Subsequent faults will map in data for the new namespace. > > + * > > + * For more details see timens_setup_vdso_data(). > > + */ > > +int vdso_join_timens(struct task_struct *task, struct time_namespace *ns) > > +{ > > + struct mm_struct *mm = task->mm; > > + struct vm_area_struct *vma; > > + > > + mmap_read_lock(mm); > > Perfect, thanks! I'll adapt my patches so that my change and this change > don't conflict and can go in together. Once they're landed we can simply > turn int vdso_join_timens() into void vdso_join_timens() everywhere. Yep. Let's do it this way. Thanks! > > Reviewed-by: Christian Brauner <christian.brauner@ubuntu.com> > > Thanks! > Christian
diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c index 7c4620451fa5..bdf492a17dff 100644 --- a/arch/arm64/kernel/vdso.c +++ b/arch/arm64/kernel/vdso.c @@ -124,6 +124,37 @@ static int __vdso_init(enum vdso_abi abi) return 0; } +#ifdef CONFIG_TIME_NS +/* + * The vvar mapping contains data for a specific time namespace, so when a task + * changes namespace we must unmap its vvar data for the old namespace. + * Subsequent faults will map in data for the new namespace. + * + * For more details see timens_setup_vdso_data(). + */ +int vdso_join_timens(struct task_struct *task, struct time_namespace *ns) +{ + struct mm_struct *mm = task->mm; + struct vm_area_struct *vma; + + mmap_read_lock(mm); + + for (vma = mm->mmap; vma; vma = vma->vm_next) { + unsigned long size = vma->vm_end - vma->vm_start; + + if (vma_is_special_mapping(vma, vdso_info[VDSO_ABI_AA64].dm)) + zap_page_range(vma, vma->vm_start, size); +#ifdef CONFIG_COMPAT_VDSO + if (vma_is_special_mapping(vma, vdso_info[VDSO_ABI_AA32].dm)) + zap_page_range(vma, vma->vm_start, size); +#endif + } + + mmap_read_unlock(mm); + return 0; +} +#endif + static vm_fault_t vvar_fault(const struct vm_special_mapping *sm, struct vm_area_struct *vma, struct vm_fault *vmf) {