From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id BA5FBC001E0 for ; Sat, 8 Jul 2023 01:12:20 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3FD9D6B0074; Fri, 7 Jul 2023 21:12:20 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 3897E8D0002; Fri, 7 Jul 2023 21:12:20 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1DAB18D0001; Fri, 7 Jul 2023 21:12:20 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id E78C56B0074 for ; Fri, 7 Jul 2023 21:12:19 -0400 (EDT) Received: from smtpin04.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 8D4CE140163 for ; Sat, 8 Jul 2023 01:12:19 +0000 (UTC) X-FDA: 80986668798.04.18E01B1 Received: from mail-oo1-f48.google.com (mail-oo1-f48.google.com [209.85.161.48]) by imf26.hostedemail.com (Postfix) with ESMTP id B636D140013 for ; Sat, 8 Jul 2023 01:12:17 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=rivosinc-com.20221208.gappssmtp.com header.s=20221208 header.b=HDgqAprx; spf=pass (imf26.hostedemail.com: domain of charlie@rivosinc.com designates 209.85.161.48 as permitted sender) smtp.mailfrom=charlie@rivosinc.com; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1688778737; a=rsa-sha256; cv=none; b=Ln8gP11vvWVGsX8Sj/OLdTR4F7A0zpgFuRdWGyDCUkzUJhMtnLW4ZIoHWJ5QSMBcR7FuIl ZGmcykzn7w9IrlhXZqREg5xzHjrYtJb1YzjabVMB/AYVMdt8EJlqn1/7HpLmjMwEB9rNCW WfpxxMZYwaMzkDyBQJTtYGtS+SGqbgY= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=rivosinc-com.20221208.gappssmtp.com header.s=20221208 header.b=HDgqAprx; spf=pass (imf26.hostedemail.com: domain of charlie@rivosinc.com designates 209.85.161.48 as permitted sender) smtp.mailfrom=charlie@rivosinc.com; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1688778737; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=fFZ0EGHA/E167mwLb87wWH3iE0UjDp5JHbGLXoRkRqA=; b=GB3LvzKzs6+63j4D37dBwQ3xNvju5PRJUvoi6deHYGkV/gMG3U0h0LJCVeM6KvYai8C84t 01IV1noL3iDEh6/Np1Qhf8ekAtdD97Xzl6RaARCeMSNa8/PAxJWmODnlM8EsdNcJevSxMx e1JLGYHBlhBLhBNJwoH6uVmeWICaxss= Received: by mail-oo1-f48.google.com with SMTP id 006d021491bc7-5634808e16eso1873151eaf.2 for ; Fri, 07 Jul 2023 18:12:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20221208.gappssmtp.com; s=20221208; t=1688778737; x=1691370737; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=fFZ0EGHA/E167mwLb87wWH3iE0UjDp5JHbGLXoRkRqA=; b=HDgqAprxKYm8kUAilt9ykmDFPdqSL5jzWa9ZQIg86N24hikrK7bFrh8lq9sOZNwcPJ GBQg/fc1ly4OcubeE4NEsYMV+rwcoEbtoO4YkEArdhelBYw40CmWE9tT0YBWLSZLRbZM gD5cyaZQ0gIgEIDaE0ITuDdSsIIq0Ee2cthIO0/netNj0Z7HlXRR6YyK2iGgI7N2H431 +ol/lZUst/dsO+/YYsrxFeJcj0Oq2FtOA4KrjdCgQs4R+RbL1D4MdTXNhdB8Airt2xTu 3hbyfC3E+ioskekFf0KRq4JRnYlVpHJVFc/tcZlogM0HGJuNlsfqFWcB4erEtn7CaCbA oRjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1688778737; x=1691370737; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=fFZ0EGHA/E167mwLb87wWH3iE0UjDp5JHbGLXoRkRqA=; b=PiSzTZNtGEjti/sakjdcrfegU+/EF73EVwJKMvkhVYAmrjigtQ01KKstnIClm6CSrc YSMaE+lDD6ey+NX/cA4yCFivSXphq+csCaBkNb+3bnHOzAcNw+4nJC9MD7Pe5KqAUJNz WIt3kunGglV+EMGb6rMHTXc+luoz4s6KpDdt/b/JnFiIDzpKgbMfGIXIIJP5sXS8le0l tQOO8aRkB9UeIsi4ZuzYDouzp06paKTVoz8LnbNuc2mG3QSC+nfg3VCN1N8IFPF9d+HA 7TB6Mm3Zq4+j52Ag2z4XQsi+W84Zda87wjwq3/ynJvEmaOAe9OKiPZk2G5+rMe0TOFXB XMDA== X-Gm-Message-State: ABy/qLaVrCNQkddKv7SitzCK7528G3SNygM5rWBu7wKbeg7KBev5kOqu pH7hDqJFVrMoTcBqYHvyWUmD7w== X-Google-Smtp-Source: APBJJlEFdNEztRYAagPRAz9QaNM7HMXGie5hZWVWxVe2fWa+vBsugeNU+m5ep6BeVbUuhpVIZAjDVw== X-Received: by 2002:a05:6358:2905:b0:134:ec26:b53 with SMTP id y5-20020a056358290500b00134ec260b53mr8012421rwb.16.1688778736790; Fri, 07 Jul 2023 18:12:16 -0700 (PDT) Received: from charlie.ba.rivosinc.com ([66.220.2.162]) by smtp.gmail.com with ESMTPSA id x24-20020a170902b41800b001b87d3e845bsm3830654plr.149.2023.07.07.18.12.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Jul 2023 18:12:16 -0700 (PDT) From: Charlie Jenkins To: linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org Cc: charlie@rivosinc.com, conor@kernel.org, paul.walmsley@sifive.com, palmer@rivosinc.com, aou@eecs.berkeley.edu, anup@brainfault.org, konstantin@linuxfoundation.org, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-mm@kvack.org, mick@ics.forth.gr, jrtc27@jrtc27.com, rdunlap@infradead.org Subject: [PATCH v4 2/4] RISC-V: mm: Add tests for RISC-V mm Date: Fri, 7 Jul 2023 18:11:33 -0700 Message-ID: <20230708011156.2697409-3-charlie@rivosinc.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230708011156.2697409-1-charlie@rivosinc.com> References: <20230708011156.2697409-1-charlie@rivosinc.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: B636D140013 X-Stat-Signature: bwgjghizopcrize9gn9w1efb9pfh93i7 X-Rspam-User: X-HE-Tag: 1688778737-937369 X-HE-Meta: U2FsdGVkX18+xq9WbR72sUArFkrTgF7/LcTAkfNEtamZFleq2Dj9mA9Yjnqi3OgxzqowGQHNYXvEYXFXGxymOX/abGpQciRPNs0wRxMPyNMurZLxrAwBVkW/FYi/Yk0itjZqVqeDnaNeSMiH4RLMAxbWNxOUEVh/R3dQH8pm8vFqLpyB1jP6IYd10n20gD7PrSM51eDtja+xZpzaW3N3OhwA2UxL3hIMRW9JISbwGtsVdAtNUBXntU8nJAEFAm+rakIVe6bn6hitP7GR2ea3SZRRcG7UZURw3lfp9zbfWaSm9V+PIqdVN1Oz6P+WoTFknbZnXTX0HvAQqyTIpCkKMMu7Vqib9gNUEfQuXcrISdlRvsVdt7wyDbke5ft48Q6zsVUsBW13u7uO9+ZeBKI6lL5tS0fod/f9oCmf3AHZywugFHajqFPZAcntRyAB+qTxpdZ1Vn4A8t9ZGUH0KVxhNYT5QiJA051sHVG7pR3kn8DH+guLgOJ1Tw6ZDuE7aQNVHQcZXLkHCeJC6FNsnc37AE7/Mf1shLSNdSNUoN5MHtaDHSJW7Cdoc1IKFUEGlVvhDRI2TPml8YwR53Dn1SykOzV/uEfUCMp194Yi2GiZq+tRrgnKPZ4HlZ6ONArSDKt1V+U6rTXdaEzOWExo8IJnYemKbrMeqLjYsSrQ44TPvK4OKBzaYO4mj7cA3zQrzKE/0osXzkXpkwCCR5NX9iYjrhtWlvbNb+zga0aFibAVfG4aVGY7TeDeP0K5Fn1yt3/jSO+qEGBAsBTl3ScR6oMn96Ek/2srrPMNEUQaCEHF/M0xVrpPYuqXvkmakHLJW1CDSG28EyhFE6UpDApeA+WotRarPOTMLYmarbGMj+a3bbCirjgYj9kWTcEo+heowAXwmWmb38ja0Aj3dRvdqE1XHvQHg4fZ4bwy/qn8YcaDc3M+fIHvxBVc+v7aQzBQ0Kroq8+Z/mjW4vj7krqjd/I H1qgJtZm FmN2swZuTP1G8Z3xvfvQTRqcNifiu+hPDGm9melarloMX1VeVZl57OpL8EV/URgu0u45tl3O90YX51bY9XG0ps+x70e/1x9lrfVee77dpdutGP45jh+0CrpORfb33QgT3kwstWhoQYMhym1c4+4b2cvu1Q4PmOKGnM2GQdqm9FHHFsStlP5yUDDGehu9DwBjTeJyCADqRpaHiMGPJKb+n3azBXP3b2ckGGlpAdu472cVZYdKyMpBQlACLiMJuf8vTZ2kWYollUL/vRgvFOlZKn/SbIwBo5jiUeq5vt0WHWDcYuU+UBI8Zh9DMNIr4GGWxhB9HmXVND+b4uPON3ogwjHEnFcF+sN3PGQhQctHg7BF5ERvVRiDYehcQcZD1PKOtIbcRDeWOaq91ivNF52Z2RoWn1lsR7W5JJQQ1XlD7h1T5LdBC+3ID2PkKsWXyPDr4e56H X-Bogosity: Ham, tests=bogofilter, spamicity=0.000565, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Add tests that enforce mmap hint address behavior. mmap should default to sv48. mmap will provide an address at the highest address space that can fit into the hint address, unless the hint address is less than sv39 and not 0, then it will return a sv39 address. In addition, ensure that rlimit changes do not cause mmap to fail. Signed-off-by: Charlie Jenkins --- tools/testing/selftests/riscv/Makefile | 2 +- tools/testing/selftests/riscv/mm/.gitignore | 1 + tools/testing/selftests/riscv/mm/Makefile | 21 +++ .../selftests/riscv/mm/testcases/mmap.c | 133 ++++++++++++++++++ 4 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/riscv/mm/.gitignore create mode 100644 tools/testing/selftests/riscv/mm/Makefile create mode 100644 tools/testing/selftests/riscv/mm/testcases/mmap.c diff --git a/tools/testing/selftests/riscv/Makefile b/tools/testing/selftests/riscv/Makefile index 9dd629cc86aa..1b79da90396e 100644 --- a/tools/testing/selftests/riscv/Makefile +++ b/tools/testing/selftests/riscv/Makefile @@ -5,7 +5,7 @@ ARCH ?= $(shell uname -m 2>/dev/null || echo not) ifneq (,$(filter $(ARCH),riscv)) -RISCV_SUBTARGETS ?= hwprobe vector +RISCV_SUBTARGETS ?= hwprobe vector mm else RISCV_SUBTARGETS := endif diff --git a/tools/testing/selftests/riscv/mm/.gitignore b/tools/testing/selftests/riscv/mm/.gitignore new file mode 100644 index 000000000000..9a6f303edcd3 --- /dev/null +++ b/tools/testing/selftests/riscv/mm/.gitignore @@ -0,0 +1 @@ +mmap diff --git a/tools/testing/selftests/riscv/mm/Makefile b/tools/testing/selftests/riscv/mm/Makefile new file mode 100644 index 000000000000..cf68e63e7495 --- /dev/null +++ b/tools/testing/selftests/riscv/mm/Makefile @@ -0,0 +1,21 @@ +# SPDX-License-Identifier: GPL-2.0 +# Originally tools/testing/selftests/arm64/signal + +# Additional include paths needed by kselftest.h and local headers +CFLAGS += -D_GNU_SOURCE -std=gnu99 -I. + +SRCS := $(filter-out testcases/testcases.c,$(wildcard testcases/*.c)) +PROGS := $(patsubst %.c,%,$(SRCS)) + +# Generated binaries to be installed by top KSFT script +TEST_GEN_PROGS := $(notdir $(PROGS)) + +# Get Kernel headers installed and use them. + +# Including KSFT lib.mk here will also mangle the TEST_GEN_PROGS list +# to account for any OUTPUT target-dirs optionally provided by +# the toplevel makefile +include ../../lib.mk + +$(TEST_GEN_PROGS): $(PROGS) + cp $(PROGS) $(OUTPUT)/ diff --git a/tools/testing/selftests/riscv/mm/testcases/mmap.c b/tools/testing/selftests/riscv/mm/testcases/mmap.c new file mode 100644 index 000000000000..d8e751f7b8c9 --- /dev/null +++ b/tools/testing/selftests/riscv/mm/testcases/mmap.c @@ -0,0 +1,133 @@ +// SPDX-License-Identifier: GPL-2.0-only +#include +#include +#include + +#include "../../kselftest_harness.h" +struct addresses { + int *no_hint; + int *on_37_addr; + int *on_38_addr; + int *on_46_addr; + int *on_47_addr; + int *on_55_addr; + int *on_56_addr; +}; + +void do_mmaps(struct addresses *mmap_addresses) +{ + // Place all of the hint addresses on the boundaries of mmap + // sv39, sv48, sv57 + // User addresses end at 1<<38, 1<<47, 1<<56 respectively + void *on_37_bits = (void *)(1UL << 37); + void *on_38_bits = (void *)(1UL << 38); + void *on_46_bits = (void *)(1UL << 46); + void *on_47_bits = (void *)(1UL << 47); + void *on_55_bits = (void *)(1UL << 55); + void *on_56_bits = (void *)(1UL << 56); + + int prot = PROT_READ | PROT_WRITE; + int flags = MAP_PRIVATE | MAP_ANONYMOUS; + + mmap_addresses->no_hint = + mmap(NULL, 5 * sizeof(int), prot, flags, 0, 0); + mmap_addresses->on_37_addr = + mmap(on_37_bits, 5 * sizeof(int), prot, flags, 0, 0); + mmap_addresses->on_38_addr = + mmap(on_38_bits, 5 * sizeof(int), prot, flags, 0, 0); + mmap_addresses->on_46_addr = + mmap(on_46_bits, 5 * sizeof(int), prot, flags, 0, 0); + mmap_addresses->on_47_addr = + mmap(on_47_bits, 5 * sizeof(int), prot, flags, 0, 0); + mmap_addresses->on_55_addr = + mmap(on_55_bits, 5 * sizeof(int), prot, flags, 0, 0); + mmap_addresses->on_56_addr = + mmap(on_56_bits, 5 * sizeof(int), prot, flags, 0, 0); +} + +TEST(default_rlimit) +{ +// Only works on 64 bit +#if __riscv_xlen == 64 + struct addresses mmap_addresses; + + do_mmaps(&mmap_addresses); + + EXPECT_NE(mmap_addresses.no_hint, MAP_FAILED); + EXPECT_NE(mmap_addresses.on_37_addr, MAP_FAILED); + EXPECT_NE(mmap_addresses.on_38_addr, MAP_FAILED); + EXPECT_NE(mmap_addresses.on_46_addr, MAP_FAILED); + EXPECT_NE(mmap_addresses.on_47_addr, MAP_FAILED); + EXPECT_NE(mmap_addresses.on_55_addr, MAP_FAILED); + EXPECT_NE(mmap_addresses.on_56_addr, MAP_FAILED); + + EXPECT_LT((unsigned long)mmap_addresses.no_hint, 1UL << 47); + EXPECT_LT((unsigned long)mmap_addresses.on_37_addr, 1UL << 38); + EXPECT_LT((unsigned long)mmap_addresses.on_38_addr, 1UL << 38); + EXPECT_LT((unsigned long)mmap_addresses.on_46_addr, 1UL << 38); + EXPECT_LT((unsigned long)mmap_addresses.on_47_addr, 1UL << 47); + EXPECT_LT((unsigned long)mmap_addresses.on_55_addr, 1UL << 47); + EXPECT_LT((unsigned long)mmap_addresses.on_56_addr, 1UL << 56); +#endif +} + +TEST(zero_rlimit) +{ +// Only works on 64 bit +#if __riscv_xlen == 64 + struct addresses mmap_addresses; + struct rlimit rlim_new = { .rlim_cur = 0, .rlim_max = RLIM_INFINITY }; + + setrlimit(RLIMIT_STACK, &rlim_new); + + do_mmaps(&mmap_addresses); + + EXPECT_NE(mmap_addresses.no_hint, MAP_FAILED); + EXPECT_NE(mmap_addresses.on_37_addr, MAP_FAILED); + EXPECT_NE(mmap_addresses.on_38_addr, MAP_FAILED); + EXPECT_NE(mmap_addresses.on_46_addr, MAP_FAILED); + EXPECT_NE(mmap_addresses.on_47_addr, MAP_FAILED); + EXPECT_NE(mmap_addresses.on_55_addr, MAP_FAILED); + EXPECT_NE(mmap_addresses.on_56_addr, MAP_FAILED); + + EXPECT_LT((unsigned long)mmap_addresses.no_hint, 1UL << 47); + EXPECT_LT((unsigned long)mmap_addresses.on_37_addr, 1UL << 38); + EXPECT_LT((unsigned long)mmap_addresses.on_38_addr, 1UL << 38); + EXPECT_LT((unsigned long)mmap_addresses.on_46_addr, 1UL << 38); + EXPECT_LT((unsigned long)mmap_addresses.on_47_addr, 1UL << 47); + EXPECT_LT((unsigned long)mmap_addresses.on_55_addr, 1UL << 47); + EXPECT_LT((unsigned long)mmap_addresses.on_56_addr, 1UL << 56); +#endif +} + +TEST(infinite_rlimit) +{ +// Only works on 64 bit +#if __riscv_xlen == 64 + struct addresses mmap_addresses; + struct rlimit rlim_new = { .rlim_cur = RLIM_INFINITY, + .rlim_max = RLIM_INFINITY }; + + setrlimit(RLIMIT_STACK, &rlim_new); + + do_mmaps(&mmap_addresses); + + EXPECT_NE(mmap_addresses.no_hint, MAP_FAILED); + EXPECT_NE(mmap_addresses.on_37_addr, MAP_FAILED); + EXPECT_NE(mmap_addresses.on_38_addr, MAP_FAILED); + EXPECT_NE(mmap_addresses.on_46_addr, MAP_FAILED); + EXPECT_NE(mmap_addresses.on_47_addr, MAP_FAILED); + EXPECT_NE(mmap_addresses.on_55_addr, MAP_FAILED); + EXPECT_NE(mmap_addresses.on_56_addr, MAP_FAILED); + + EXPECT_LT((unsigned long)mmap_addresses.no_hint, 1UL << 47); + EXPECT_LT((unsigned long)mmap_addresses.on_37_addr, 1UL << 38); + EXPECT_LT((unsigned long)mmap_addresses.on_38_addr, 1UL << 38); + EXPECT_LT((unsigned long)mmap_addresses.on_46_addr, 1UL << 38); + EXPECT_LT((unsigned long)mmap_addresses.on_47_addr, 1UL << 47); + EXPECT_LT((unsigned long)mmap_addresses.on_55_addr, 1UL << 47); + EXPECT_LT((unsigned long)mmap_addresses.on_56_addr, 1UL << 56); +#endif +} + +TEST_HARNESS_MAIN -- 2.41.0