linux-mips.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Guoyun Sun <sunguoyun@loongson.cn>
To: Paul Burton <paulburton@kernel.org>,
	Ralf Baechle <ralf@linux-mips.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Vincenzo Frascino <vincenzo.frascino@arm.com>,
	Allison Randal <allison@lohutok.net>
Cc: linux-mips@vger.kernel.org, linux-kernel@vger.kernel.org,
	Guoyun Sun <sunguoyun@loongson.cn>
Subject: [PATCH]  mips/vdso: Support mremap() for vDSO
Date: Tue, 14 Jan 2020 13:13:28 +0800	[thread overview]
Message-ID: <1578978808-18633-1-git-send-email-sunguoyun@loongson.cn> (raw)

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 <sunguoyun@loongson.cn>
---
 arch/mips/kernel/vdso.c  | 22 ++++++++++++++++++++++
 arch/mips/vdso/genvdso.c |  5 +++++
 2 files changed, 27 insertions(+)

diff --git a/arch/mips/kernel/vdso.c b/arch/mips/kernel/vdso.c
index bc35f84..eac3982 100644
--- a/arch/mips/kernel/vdso.c
+++ b/arch/mips/kernel/vdso.c
@@ -38,6 +38,28 @@ static struct vm_special_mapping vdso_vvar_mapping = {
 	.pages = no_pages,
 };
 
+int vdso_mremap(const struct vm_special_mapping *sm,
+		       struct vm_area_struct *new_vma)
+{
+	unsigned long new_size = new_vma->vm_end - new_vma->vm_start;
+
+#ifdef CONFIG_MIPS32_O32
+	if (vdso_image_o32.size != new_size)
+		return -EINVAL;
+#endif
+
+#ifdef CONFIG_MIPS32_N32
+	if (vdso_image_n32.size != new_size)
+		return -EINVAL;
+#endif
+
+	if (vdso_image.size != new_size)
+		return -EINVAL;
+
+	current->mm->context.vdso = (void __user *)(new_vma->vm_start);
+	return 0;
+}
+
 static void __init init_vdso_image(struct mips_vdso_image *image)
 {
 	unsigned long num_pages, i;
diff --git a/arch/mips/vdso/genvdso.c b/arch/mips/vdso/genvdso.c
index b66b6b1..50ea516 100644
--- a/arch/mips/vdso/genvdso.c
+++ b/arch/mips/vdso/genvdso.c
@@ -251,6 +251,10 @@ 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, "\n");
+	fprintf(out_file, "extern int vdso_mremap(\n");
+	fprintf(out_file, "	const struct vm_special_mapping *sm,\n");
+	fprintf(out_file, "	struct vm_area_struct *new_vma);\n\n");
 
 	/* Write out the stripped VDSO data. */
 	fprintf(out_file,
@@ -275,6 +279,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


             reply	other threads:[~2020-01-14  5:13 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-14  5:13 Guoyun Sun [this message]
2020-01-15  0:08 ` [PATCH] mips/vdso: Support mremap() for vDSO Paul Burton

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1578978808-18633-1-git-send-email-sunguoyun@loongson.cn \
    --to=sunguoyun@loongson.cn \
    --cc=allison@lohutok.net \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mips@vger.kernel.org \
    --cc=paulburton@kernel.org \
    --cc=ralf@linux-mips.org \
    --cc=tglx@linutronix.de \
    --cc=vincenzo.frascino@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).