2020-01-15 03:37:47

by Guoyun Sun

[permalink] [raw]
Subject: [PATCH V2] mips/vdso: Support mremap() for vDSO

vDSO VMA address is saved in mm_context for the purpose of using
restorer from vDSO page to return to userspace after signal handling.

In Checkpoint Restore in Userspace (CRIU) project we place vDSO VMA
on restore back to the place where it was on the dump.

Make vDSO code track the VMA address by supplying .mremap() fops
the same way it's done for x86 and arm by:
commit b059a453b1cf ("x86/vdso: Add mremap hook to vm_special_mapping")
commit 739586951b8a ("arm64/vdso: Support mremap() for vDSO").

Signed-off-by: Guoyun Sun <[email protected]>
---
arch/mips/vdso/genvdso.c | 13 +++++++++++++
1 file changed, 13 insertions(+)

diff --git a/arch/mips/vdso/genvdso.c b/arch/mips/vdso/genvdso.c
index b66b6b1..be57b83 100644
--- a/arch/mips/vdso/genvdso.c
+++ b/arch/mips/vdso/genvdso.c
@@ -251,6 +251,18 @@ int main(int argc, char **argv)
fprintf(out_file, "#include <linux/linkage.h>\n");
fprintf(out_file, "#include <linux/mm.h>\n");
fprintf(out_file, "#include <asm/vdso.h>\n");
+ fprintf(out_file, "static int vdso_mremap(\n");
+ fprintf(out_file, " const struct vm_special_mapping *sm,\n");
+ fprintf(out_file, " struct vm_area_struct *new_vma)\n");
+ fprintf(out_file, "{\n");
+ fprintf(out_file, " unsigned long new_size =\n");
+ fprintf(out_file, " new_vma->vm_end - new_vma->vm_start;\n");
+ fprintf(out_file, " if (vdso_image.size != new_size)\n");
+ fprintf(out_file, " return -EINVAL;\n");
+ fprintf(out_file, " current->mm->context.vdso =\n");
+ fprintf(out_file, " (void __user *)(new_vma->vm_start);\n");
+ fprintf(out_file, " return 0;\n");
+ fprintf(out_file, "}\n");

/* Write out the stripped VDSO data. */
fprintf(out_file,
@@ -275,6 +287,7 @@ int main(int argc, char **argv)
fprintf(out_file, "\t.mapping = {\n");
fprintf(out_file, "\t\t.name = \"[vdso]\",\n");
fprintf(out_file, "\t\t.pages = vdso_pages,\n");
+ fprintf(out_file, "\t\t.mremap = vdso_mremap,\n");
fprintf(out_file, "\t},\n");

/* Calculate and write symbol offsets to <output file> */
--
2.1.0


2020-01-15 19:00:39

by Paul Burton

[permalink] [raw]
Subject: Re: [PATCH V2] mips/vdso: Support mremap() for vDSO

Hello,

Guoyun Sun wrote:
> vDSO VMA address is saved in mm_context for the purpose of using
> restorer from vDSO page to return to userspace after signal handling.
>
> In Checkpoint Restore in Userspace (CRIU) project we place vDSO VMA
> on restore back to the place where it was on the dump.
>
> Make vDSO code track the VMA address by supplying .mremap() fops
> the same way it's done for x86 and arm by:
> commit b059a453b1cf ("x86/vdso: Add mremap hook to vm_special_mapping")
> commit 739586951b8a ("arm64/vdso: Support mremap() for vDSO").

Applied to mips-next.

> commit ad1df95419cc
> https://git.kernel.org/mips/c/ad1df95419cc
>
> Signed-off-by: Guoyun Sun <[email protected]>
> Signed-off-by: Paul Burton <[email protected]>

Thanks,
Paul

[ This message was auto-generated; if you believe anything is incorrect
then please email [email protected] to report it. ]