stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Michael Ellerman <mpe@ellerman.id.au>,
	Sasha Levin <sashal@kernel.org>,
	linuxppc-dev@lists.ozlabs.org, linux-kselftest@vger.kernel.org
Subject: [PATCH AUTOSEL 5.1 09/39] selftests/powerpc: Add test of fork with mapping above 512TB
Date: Tue,  2 Jul 2019 22:14:44 -0400	[thread overview]
Message-ID: <20190703021514.17727-9-sashal@kernel.org> (raw)
In-Reply-To: <20190703021514.17727-1-sashal@kernel.org>

From: Michael Ellerman <mpe@ellerman.id.au>

[ Upstream commit 16391bfc862342f285195013b73c1394fab28b97 ]

This tests that when a process with a mapping above 512TB forks we
correctly separate the parent and child address spaces. This exercises
the bug in the context id handling fixed in the previous commit.

Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 tools/testing/selftests/powerpc/mm/.gitignore |  3 +-
 tools/testing/selftests/powerpc/mm/Makefile   |  4 +-
 .../powerpc/mm/large_vm_fork_separation.c     | 87 +++++++++++++++++++
 3 files changed, 92 insertions(+), 2 deletions(-)
 create mode 100644 tools/testing/selftests/powerpc/mm/large_vm_fork_separation.c

diff --git a/tools/testing/selftests/powerpc/mm/.gitignore b/tools/testing/selftests/powerpc/mm/.gitignore
index ba919308fe30..d503b8764a8e 100644
--- a/tools/testing/selftests/powerpc/mm/.gitignore
+++ b/tools/testing/selftests/powerpc/mm/.gitignore
@@ -3,4 +3,5 @@ subpage_prot
 tempfile
 prot_sao
 segv_errors
-wild_bctr
\ No newline at end of file
+wild_bctr
+large_vm_fork_separation
\ No newline at end of file
diff --git a/tools/testing/selftests/powerpc/mm/Makefile b/tools/testing/selftests/powerpc/mm/Makefile
index 43d68420e363..f1fbc15800c4 100644
--- a/tools/testing/selftests/powerpc/mm/Makefile
+++ b/tools/testing/selftests/powerpc/mm/Makefile
@@ -2,7 +2,8 @@
 noarg:
 	$(MAKE) -C ../
 
-TEST_GEN_PROGS := hugetlb_vs_thp_test subpage_prot prot_sao segv_errors wild_bctr
+TEST_GEN_PROGS := hugetlb_vs_thp_test subpage_prot prot_sao segv_errors wild_bctr \
+		  large_vm_fork_separation
 TEST_GEN_FILES := tempfile
 
 top_srcdir = ../../../../..
@@ -13,6 +14,7 @@ $(TEST_GEN_PROGS): ../harness.c
 $(OUTPUT)/prot_sao: ../utils.c
 
 $(OUTPUT)/wild_bctr: CFLAGS += -m64
+$(OUTPUT)/large_vm_fork_separation: CFLAGS += -m64
 
 $(OUTPUT)/tempfile:
 	dd if=/dev/zero of=$@ bs=64k count=1
diff --git a/tools/testing/selftests/powerpc/mm/large_vm_fork_separation.c b/tools/testing/selftests/powerpc/mm/large_vm_fork_separation.c
new file mode 100644
index 000000000000..2363a7f3ab0d
--- /dev/null
+++ b/tools/testing/selftests/powerpc/mm/large_vm_fork_separation.c
@@ -0,0 +1,87 @@
+// SPDX-License-Identifier: GPL-2.0+
+//
+// Copyright 2019, Michael Ellerman, IBM Corp.
+//
+// Test that allocating memory beyond the memory limit and then forking is
+// handled correctly, ie. the child is able to access the mappings beyond the
+// memory limit and the child's writes are not visible to the parent.
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include "utils.h"
+
+
+#ifndef MAP_FIXED_NOREPLACE
+#define MAP_FIXED_NOREPLACE	MAP_FIXED	// "Should be safe" above 512TB
+#endif
+
+
+static int test(void)
+{
+	int p2c[2], c2p[2], rc, status, c, *p;
+	unsigned long page_size;
+	pid_t pid;
+
+	page_size = sysconf(_SC_PAGESIZE);
+	SKIP_IF(page_size != 65536);
+
+	// Create a mapping at 512TB to allocate an extended_id
+	p = mmap((void *)(512ul << 40), page_size, PROT_READ | PROT_WRITE,
+		MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED_NOREPLACE, -1, 0);
+	if (p == MAP_FAILED) {
+		perror("mmap");
+		printf("Error: couldn't mmap(), confirm kernel has 4TB support?\n");
+		return 1;
+	}
+
+	printf("parent writing %p = 1\n", p);
+	*p = 1;
+
+	FAIL_IF(pipe(p2c) == -1 || pipe(c2p) == -1);
+
+	pid = fork();
+	if (pid == 0) {
+		FAIL_IF(read(p2c[0], &c, 1) != 1);
+
+		pid = getpid();
+		printf("child writing  %p = %d\n", p, pid);
+		*p = pid;
+
+		FAIL_IF(write(c2p[1], &c, 1) != 1);
+		FAIL_IF(read(p2c[0], &c, 1) != 1);
+		exit(0);
+	}
+
+	c = 0;
+	FAIL_IF(write(p2c[1], &c, 1) != 1);
+	FAIL_IF(read(c2p[0], &c, 1) != 1);
+
+	// Prevent compiler optimisation
+	barrier();
+
+	rc = 0;
+	printf("parent reading %p = %d\n", p, *p);
+	if (*p != 1) {
+		printf("Error: BUG! parent saw child's write! *p = %d\n", *p);
+		rc = 1;
+	}
+
+	FAIL_IF(write(p2c[1], &c, 1) != 1);
+	FAIL_IF(waitpid(pid, &status, 0) == -1);
+	FAIL_IF(!WIFEXITED(status) || WEXITSTATUS(status));
+
+	if (rc == 0)
+		printf("success: test completed OK\n");
+
+	return rc;
+}
+
+int main(void)
+{
+	return test_harness(test, "large_vm_fork_separation");
+}
-- 
2.20.1


  parent reply	other threads:[~2019-07-03  2:22 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-03  2:14 [PATCH AUTOSEL 5.1 01/39] ARM: dts: meson8: fix GPU interrupts and drop an undocumented property Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 02/39] ARM: dts: meson8b: fix the operating voltage of the Mali GPU Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 03/39] idr: Fix idr_get_next race with idr_remove Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 04/39] irqchip/irq-csky-mpintc: Support auto irq deliver to all cpus Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 05/39] irqchip/gic-v3-its: Fix command queue pointer comparison bug Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 06/39] clk: ti: clkctrl: Fix returning uninitialized data Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 07/39] efi/bgrt: Drop BGRT status field reserved bits check Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 08/39] arm64: dts: ls1028a: Fix CPU idle fail Sasha Levin
2019-07-11  5:04   ` Ran Wang
2019-07-11  6:43     ` Greg KH
2019-07-03  2:14 ` Sasha Levin [this message]
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 10/39] perf/core: Fix perf_sample_regs_user() mm check Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 11/39] ARM: dts: gemini Fix up DNS-313 compatible string Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 12/39] ARM: omap2: remove incorrect __init annotation Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 13/39] afs: Fix uninitialised spinlock afs_volume::cb_break_lock Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 14/39] x86/efi: fix a -Wtype-limits compilation warning Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 15/39] x86/apic: Fix integer overflow on 10 bit left shift of cpu_khz Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 16/39] be2net: fix link failure after ethtool offline test Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 17/39] ppp: mppe: Add softdep to arc4 Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 18/39] net: stmmac: fixed new system time seconds value calculation Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 19/39] net: stmmac: set IC bit when transmitting frames with HW timestamp Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 20/39] sis900: fix TX completion Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 21/39] ARM: dts: imx6ul: fix PWM[1-4] interrupts Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 22/39] qmi_wwan: Fix out-of-bounds read Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 23/39] pinctrl: mcp23s08: Fix add_data and irqchip_add_nested call order Sasha Levin
2019-07-03  2:14 ` [PATCH AUTOSEL 5.1 24/39] pinctrl: ocelot: fix gpio direction for pins after 31 Sasha Levin
2019-07-03  2:15 ` [PATCH AUTOSEL 5.1 25/39] pinctrl: ocelot: fix pinmuxing " Sasha Levin
2019-07-03  2:15 ` [PATCH AUTOSEL 5.1 26/39] dm table: don't copy from a NULL pointer in realloc_argv() Sasha Levin
2019-07-03  2:15 ` [PATCH AUTOSEL 5.1 27/39] dm verity: use message limit for data block corruption message Sasha Levin
2019-07-03  2:15 ` [PATCH AUTOSEL 5.1 28/39] x86/boot/64: Fix crash if kernel image crosses page table boundary Sasha Levin
2019-07-03  2:15 ` [PATCH AUTOSEL 5.1 29/39] x86/boot/64: Add missing fixup_pointer() for next_early_pgt access Sasha Levin
2019-07-03  2:15 ` [PATCH AUTOSEL 5.1 30/39] HID: chicony: add another quirk for PixArt mouse Sasha Levin
2019-07-03  2:15 ` [PATCH AUTOSEL 5.1 31/39] HID: uclogic: Add support for Huion HS64 tablet Sasha Levin
2019-07-03  2:15 ` [PATCH AUTOSEL 5.1 32/39] HID: multitouch: Add pointstick support for ALPS Touchpad Sasha Levin
2019-07-03  2:15 ` [PATCH AUTOSEL 5.1 33/39] pinctrl: mediatek: Ignore interrupts that are wake only during resume Sasha Levin
2019-07-03  2:15 ` [PATCH AUTOSEL 5.1 34/39] net: aquantia: fix vlans not working over bridged network Sasha Levin
2019-07-03  2:15 ` [PATCH AUTOSEL 5.1 35/39] cpu/hotplug: Fix out-of-bounds read when setting fail state Sasha Levin
2019-07-03  2:15 ` [PATCH AUTOSEL 5.1 36/39] pinctrl: mediatek: Update cur_mask in mask/mask ops Sasha Levin
2019-07-03  2:15 ` [PATCH AUTOSEL 5.1 37/39] mm/oom_kill.c: fix uninitialized oc->constraint Sasha Levin
2019-07-03  2:15 ` [PATCH AUTOSEL 5.1 38/39] fork,memcg: alloc_thread_stack_node needs to set tsk->stack Sasha Levin
2019-07-03  2:15 ` [PATCH AUTOSEL 5.1 39/39] linux/kernel.h: fix overflow for DIV_ROUND_UP_ULL Sasha Levin

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=20190703021514.17727-9-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=mpe@ellerman.id.au \
    --cc=stable@vger.kernel.org \
    /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).