--- /dev/null
+From chenhuacai@loongson.cn Wed Nov 6 08:26:52 2024
+From: Huacai Chen <chenhuacai@loongson.cn>
+Date: Sat, 2 Nov 2024 11:36:16 +0800
+Subject: LoongArch: Fix build errors due to backported TIMENS
+To: Huacai Chen <chenhuacai@kernel.org>
+Cc: Xuerui Wang <kernel@xen0n.name>, loongarch@lists.linux.dev, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, Sasha Levin <sashal@kernel.org>, stable@vger.kernel.org, Jiaxun Yang <jiaxun.yang@flygoat.com>, linux-kernel@vger.kernel.org, Huacai Chen <chenhuacai@loongson.cn>
+Message-ID: <20241102033616.3517188-1-chenhuacai@loongson.cn>
+
+From: Huacai Chen <chenhuacai@loongson.cn>
+
+Commit eb3710efffce1dcff83761db4615f91d93aabfcb ("LoongArch: Add support
+to clone a time namespace") backports the TIMENS support for LoongArch
+(corresponding upstream commit aa5e65dc0818bbf676bf06927368ec46867778fd)
+but causes build errors:
+
+ CC arch/loongarch/kernel/vdso.o
+arch/loongarch/kernel/vdso.c: In function ‘vvar_fault’:
+arch/loongarch/kernel/vdso.c:54:36: error: implicit declaration of
+function ‘find_timens_vvar_page’ [-Werror=implicit-function-declaration]
+ 54 | struct page *timens_page = find_timens_vvar_page(vma);
+ | ^~~~~~~~~~~~~~~~~~~~~
+arch/loongarch/kernel/vdso.c:54:36: warning: initialization of ‘struct
+page *’ from ‘int’ makes pointer from integer without a cast
+[-Wint-conversion]
+arch/loongarch/kernel/vdso.c: In function ‘vdso_join_timens’:
+arch/loongarch/kernel/vdso.c:143:25: error: implicit declaration of
+function ‘zap_vma_pages’; did you mean ‘zap_vma_ptes’?
+[-Werror=implicit-function-declaration]
+ 143 | zap_vma_pages(vma);
+ | ^~~~~~~~~~~~~
+ | zap_vma_ptes
+cc1: some warnings being treated as errors
+
+Because in 6.1.y we should define find_timens_vvar_page() by ourselves
+and use zap_page_range() instead of zap_vma_pages(), so fix it.
+
+Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
+---
+ arch/loongarch/kernel/vdso.c | 28 +++++++++++++++++++++++++++-
+ 1 file changed, 27 insertions(+), 1 deletion(-)
+
+--- a/arch/loongarch/kernel/vdso.c
++++ b/arch/loongarch/kernel/vdso.c
+@@ -40,6 +40,8 @@ static struct page *vdso_pages[] = { NUL
+ struct vdso_data *vdso_data = generic_vdso_data.data;
+ struct vdso_pcpu_data *vdso_pdata = loongarch_vdso_data.vdata.pdata;
+
++static struct page *find_timens_vvar_page(struct vm_area_struct *vma);
++
+ static int vdso_mremap(const struct vm_special_mapping *sm, struct vm_area_struct *new_vma)
+ {
+ current->mm->context.vdso = (void *)(new_vma->vm_start);
+@@ -139,13 +141,37 @@ int vdso_join_timens(struct task_struct
+
+ mmap_read_lock(mm);
+ for_each_vma(vmi, vma) {
++ unsigned long size = vma->vm_end - vma->vm_start;
++
+ if (vma_is_special_mapping(vma, &vdso_info.data_mapping))
+- zap_vma_pages(vma);
++ zap_page_range(vma, vma->vm_start, size);
+ }
+ 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 unsigned long vdso_base(void)