vdso/timens: Refactor copy-pasted find_timens_vvar_page() helper into one copy
authorJann Horn <jannh@google.com>
Wed, 30 Nov 2022 11:53:20 +0000 (12:53 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 1 Dec 2022 10:35:40 +0000 (11:35 +0100)
find_timens_vvar_page() is not architecture-specific, as can be seen from
how all five per-architecture versions of it are the same.

(arm64, powerpc and riscv are exactly the same; x86 and s390 have two
characters difference inside a comment, less blank lines, and mark the
!CONFIG_TIME_NS version as inline.)

Refactor the five copies into a central copy in kernel/time/namespace.c.

Signed-off-by: Jann Horn <jannh@google.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20221130115320.2918447-1-jannh@google.com
arch/arm64/kernel/vdso.c
arch/powerpc/kernel/vdso.c
arch/riscv/kernel/vdso.c
arch/s390/kernel/vdso.c
arch/x86/entry/vdso/vma.c
include/linux/time_namespace.h
kernel/time/namespace.c

index 99ae81ab91a749e5a9ee37f546425ea96e9df70e..e59a32aa0c49d45cedbc51793559e45d3bd4d50d 100644 (file)
@@ -151,28 +151,6 @@ int vdso_join_timens(struct task_struct *task, struct time_namespace *ns)
        mmap_read_unlock(mm);
        return 0;
 }
-
-static struct page *find_timens_vvar_page(struct vm_area_struct *vma)
-{
-       if (likely(vma->vm_mm == current->mm))
-               return current->nsproxy->time_ns->vvar_page;
-
-       /*
-        * VM_PFNMAP | VM_IO protect .fault() handler from being called
-        * through interfaces like /proc/$pid/mem or
-        * process_vm_{readv,writev}() as long as there's no .access()
-        * in special_mapping_vmops.
-        * For more details check_vma_flags() and __access_remote_vm()
-        */
-       WARN(1, "vvar_page accessed remotely");
-
-       return NULL;
-}
-#else
-static struct page *find_timens_vvar_page(struct vm_area_struct *vma)
-{
-       return NULL;
-}
 #endif
 
 static vm_fault_t vvar_fault(const struct vm_special_mapping *sm,
index 4abc0194970208713f428ec0eb4545d8016ea481..507f8228f983b9e48a1a096ccfa9d52469070b06 100644 (file)
@@ -129,28 +129,6 @@ int vdso_join_timens(struct task_struct *task, struct time_namespace *ns)
 
        return 0;
 }
-
-static struct page *find_timens_vvar_page(struct vm_area_struct *vma)
-{
-       if (likely(vma->vm_mm == current->mm))
-               return current->nsproxy->time_ns->vvar_page;
-
-       /*
-        * VM_PFNMAP | VM_IO protect .fault() handler from being called
-        * through interfaces like /proc/$pid/mem or
-        * process_vm_{readv,writev}() as long as there's no .access()
-        * in special_mapping_vmops.
-        * For more details check_vma_flags() and __access_remote_vm()
-        */
-       WARN(1, "vvar_page accessed remotely");
-
-       return NULL;
-}
-#else
-static struct page *find_timens_vvar_page(struct vm_area_struct *vma)
-{
-       return NULL;
-}
 #endif
 
 static vm_fault_t vvar_fault(const struct vm_special_mapping *sm,
index 123d05255fcfa63b4ff418e51383d54391e5d7f8..e410275918ac4524649552c1f6e683a7129600b2 100644 (file)
@@ -137,28 +137,6 @@ int vdso_join_timens(struct task_struct *task, struct time_namespace *ns)
        mmap_read_unlock(mm);
        return 0;
 }
-
-static struct page *find_timens_vvar_page(struct vm_area_struct *vma)
-{
-       if (likely(vma->vm_mm == current->mm))
-               return current->nsproxy->time_ns->vvar_page;
-
-       /*
-        * VM_PFNMAP | VM_IO protect .fault() handler from being called
-        * through interfaces like /proc/$pid/mem or
-        * process_vm_{readv,writev}() as long as there's no .access()
-        * in special_mapping_vmops.
-        * For more details check_vma_flags() and __access_remote_vm()
-        */
-       WARN(1, "vvar_page accessed remotely");
-
-       return NULL;
-}
-#else
-static struct page *find_timens_vvar_page(struct vm_area_struct *vma)
-{
-       return NULL;
-}
 #endif
 
 static vm_fault_t vvar_fault(const struct vm_special_mapping *sm,
index 3105ca5bd4701d14831078559431aaed0f70d1d1..d6df7169c01f2d072b4e5c0d4fcd7e3316c14b32 100644 (file)
@@ -44,21 +44,6 @@ struct vdso_data *arch_get_vdso_data(void *vvar_page)
        return (struct vdso_data *)(vvar_page);
 }
 
-static struct page *find_timens_vvar_page(struct vm_area_struct *vma)
-{
-       if (likely(vma->vm_mm == current->mm))
-               return current->nsproxy->time_ns->vvar_page;
-       /*
-        * VM_PFNMAP | VM_IO protect .fault() handler from being called
-        * through interfaces like /proc/$pid/mem or
-        * process_vm_{readv,writev}() as long as there's no .access()
-        * in special_mapping_vmops().
-        * For more details check_vma_flags() and __access_remote_vm()
-        */
-       WARN(1, "vvar_page accessed remotely");
-       return NULL;
-}
-
 /*
  * The VVAR page layout depends on whether a task belongs to the root or
  * non-root time namespace. Whenever a task changes its namespace, the VVAR
@@ -84,11 +69,6 @@ int vdso_join_timens(struct task_struct *task, struct time_namespace *ns)
        mmap_read_unlock(mm);
        return 0;
 }
-#else
-static inline struct page *find_timens_vvar_page(struct vm_area_struct *vma)
-{
-       return NULL;
-}
 #endif
 
 static vm_fault_t vvar_fault(const struct vm_special_mapping *sm,
index 311eae30e08944c767995572bce85965038cb145..6b36485054e8a02bdfb294615dad3c96e00b6157 100644 (file)
@@ -98,24 +98,6 @@ static int vdso_mremap(const struct vm_special_mapping *sm,
 }
 
 #ifdef CONFIG_TIME_NS
-static struct page *find_timens_vvar_page(struct vm_area_struct *vma)
-{
-       if (likely(vma->vm_mm == current->mm))
-               return current->nsproxy->time_ns->vvar_page;
-
-       /*
-        * VM_PFNMAP | VM_IO protect .fault() handler from being called
-        * through interfaces like /proc/$pid/mem or
-        * process_vm_{readv,writev}() as long as there's no .access()
-        * in special_mapping_vmops().
-        * For more details check_vma_flags() and __access_remote_vm()
-        */
-
-       WARN(1, "vvar_page accessed remotely");
-
-       return NULL;
-}
-
 /*
  * The vvar page layout depends on whether a task belongs to the root or
  * non-root time namespace. Whenever a task changes its namespace, the VVAR
@@ -140,11 +122,6 @@ int vdso_join_timens(struct task_struct *task, struct time_namespace *ns)
 
        return 0;
 }
-#else
-static inline struct page *find_timens_vvar_page(struct vm_area_struct *vma)
-{
-       return NULL;
-}
 #endif
 
 static vm_fault_t vvar_fault(const struct vm_special_mapping *sm,
index 3146f1c056c9895a45d14f75d3b3c49f730b4dd5..bb9d3f5542f8ea2088ef7e7a1dfe3a89127e1d7f 100644 (file)
@@ -45,6 +45,7 @@ struct time_namespace *copy_time_ns(unsigned long flags,
 void free_time_ns(struct time_namespace *ns);
 void timens_on_fork(struct nsproxy *nsproxy, struct task_struct *tsk);
 struct vdso_data *arch_get_vdso_data(void *vvar_page);
+struct page *find_timens_vvar_page(struct vm_area_struct *vma);
 
 static inline void put_time_ns(struct time_namespace *ns)
 {
@@ -141,6 +142,11 @@ static inline void timens_on_fork(struct nsproxy *nsproxy,
        return;
 }
 
+static inline struct page *find_timens_vvar_page(struct vm_area_struct *vma)
+{
+       return NULL;
+}
+
 static inline void timens_add_monotonic(struct timespec64 *ts) { }
 static inline void timens_add_boottime(struct timespec64 *ts) { }
 
index aec832801c26ca111eaa1d7675b6bfc7c3e4b850..0775b9ec952af9639480db9480d06d12293d1ceb 100644 (file)
@@ -192,6 +192,24 @@ static void timens_setup_vdso_data(struct vdso_data *vdata,
        offset[CLOCK_BOOTTIME_ALARM]    = boottime;
 }
 
+struct page *find_timens_vvar_page(struct vm_area_struct *vma)
+{
+       if (likely(vma->vm_mm == current->mm))
+               return current->nsproxy->time_ns->vvar_page;
+
+       /*
+        * VM_PFNMAP | VM_IO protect .fault() handler from being called
+        * through interfaces like /proc/$pid/mem or
+        * process_vm_{readv,writev}() as long as there's no .access()
+        * in special_mapping_vmops().
+        * For more details check_vma_flags() and __access_remote_vm()
+        */
+
+       WARN(1, "vvar_page accessed remotely");
+
+       return NULL;
+}
+
 /*
  * Protects possibly multiple offsets writers racing each other
  * and tasks entering the namespace.