From patchwork Fri Jul 14 00:14:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Charlie Jenkins X-Patchwork-Id: 13312799 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 5EB51C00528 for ; Fri, 14 Jul 2023 00:15:01 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 015B98E0007; Thu, 13 Jul 2023 20:15:01 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id F08488E0001; Thu, 13 Jul 2023 20:15:00 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id DA9298E0007; Thu, 13 Jul 2023 20:15:00 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id CB3678E0001 for ; Thu, 13 Jul 2023 20:15:00 -0400 (EDT) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 9BC6AB0561 for ; Fri, 14 Jul 2023 00:15:00 +0000 (UTC) X-FDA: 81008297160.14.6CBE26C Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) by imf16.hostedemail.com (Postfix) with ESMTP id C120318000B for ; Fri, 14 Jul 2023 00:14:58 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=pass header.d=rivosinc-com.20221208.gappssmtp.com header.s=20221208 header.b=haAaWBwo; dmarc=none; spf=pass (imf16.hostedemail.com: domain of charlie@rivosinc.com designates 209.85.210.169 as permitted sender) smtp.mailfrom=charlie@rivosinc.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689293698; 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=+0r7ylMNQwjmn0OPkYDCq51XOFGJFq+TLUQNF3+/r/M=; b=pr38TJciryv2v6wK7NPZB5TfQcexmsuOnin+sJtt121StV/B/t5Af2AsnMzionDWTVP6dB nHz6md9d2h1yDsyw6f+IV6IzwCFG2RpRyDjsQrjA8EnR6jX0+8dFa/jckkPbOXrQtBKkP5 1voVXEDhqRuX3GHTzHpkD5B/XuIjZLw= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=pass header.d=rivosinc-com.20221208.gappssmtp.com header.s=20221208 header.b=haAaWBwo; dmarc=none; spf=pass (imf16.hostedemail.com: domain of charlie@rivosinc.com designates 209.85.210.169 as permitted sender) smtp.mailfrom=charlie@rivosinc.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689293698; a=rsa-sha256; cv=none; b=r/jypiu8SApqoYCt80DnuhKpJpPvut26qAYlKOstRMzzz1dajBNX50k6dT6AFS0BZomboU dmSeJSD+C5cB94wVXfyfYfsXmOj5GtU8yCv4MRsCQLTvaRCQK2PyGTNK7+2uTWRmsR1vLi vO8Ux9E8v4VawWTvXanElVzWeTDAb6I= Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-666e6ecb52dso927560b3a.2 for ; Thu, 13 Jul 2023 17:14:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20221208.gappssmtp.com; s=20221208; t=1689293697; x=1689898497; 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=+0r7ylMNQwjmn0OPkYDCq51XOFGJFq+TLUQNF3+/r/M=; b=haAaWBwoChBxuD8Pfd0jAkJcxdJC/ed1uAjbiUoi8wxkZqPtdGIqgTjzZDWEVHfm6l 51cEMf6gM8C228ZG9wuUj6Ivc7tJZw7r0io2/ZPsqcgxBdqiLweiZCxWUsEngg2ecRtE GdBQfbZVKOt60zzCFPWEmKotw0jdgng6Qx/y4iuGm/c8FyNYyzvwro/ej/o8MrP66pVo AaPyvF5/o9oO5Z+Xy390UDeaPuXxxrG4RrL9h6v2D1lOKHKTsgTLmmiZzMi8pzjuvV3p +yscdkzgS0W2beD1gigIVK8DdAuNL41aOf8gFXxon6B6Ney5K6npBCUq592PqPNl4fIe fRHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689293697; x=1689898497; 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=+0r7ylMNQwjmn0OPkYDCq51XOFGJFq+TLUQNF3+/r/M=; b=i11aHdSaC43NMZMSP6NH3sKHYBr9611Fbyu3pxu7vABVoCT9bDaq0TxjrOF2zc0kBG lD7M8tVUsaaFuSlEmsbdHuCV0OYbUB6Ug+OgHo6BKjsYwcsyCAYqlZU9g6lIFmU8H0fy S0DufKCtuqfkGnKF54bAuRF026yXc713bPe3NYeMVyaUlrmWEgHDT81+KW5fkktDoQLx HAtgl3aobLI89WHksbneDMf2zjAof8Y/IHNZdhJzbVN9eUxd5obk//lFD+KsIum/d2BV RRVHbS7g9kmZuTRnTAj5hLkCfMgQ/o47Mmv0EaPacJzb4P8ttL/6lyE+2gkRLYg1BDyZ lbSg== X-Gm-Message-State: ABy/qLZht7R3zShePv/VVp6ZFp8W2iipQ+3L1LJOOEUw5i/Pe13PAgqp 5Y3hvze/4+G4z2tCajGZy6tPwQ== X-Google-Smtp-Source: APBJJlHthF/xOQY29h/SyVgVkdQb7LnbuS2bmKCUB6lATpARVerASAF4xQ0wVKCbGUja7e5kDLb32A== X-Received: by 2002:a05:6a20:3953:b0:12d:5b6:7b32 with SMTP id r19-20020a056a20395300b0012d05b67b32mr2817577pzg.3.1689293697603; Thu, 13 Jul 2023 17:14:57 -0700 (PDT) Received: from charlie.ba.rivosinc.com ([66.220.2.162]) by smtp.gmail.com with ESMTPSA id x25-20020aa793b9000000b00673e652985esm5938107pff.44.2023.07.13.17.14.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Jul 2023 17:14:57 -0700 (PDT) From: Charlie Jenkins To: linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.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, alexghiti@rivosinc.com Subject: [PATCH v5 2/4] RISC-V: mm: Add tests for RISC-V mm Date: Thu, 13 Jul 2023 17:14:01 -0700 Message-ID: <20230714001430.75798-3-charlie@rivosinc.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230714001430.75798-1-charlie@rivosinc.com> References: <20230714001430.75798-1-charlie@rivosinc.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: C120318000B X-Rspam-User: X-Rspamd-Server: rspam02 X-Stat-Signature: tjjb6ebby65dqetybzd1x995ayrr31ck X-HE-Tag: 1689293698-674152 X-HE-Meta: U2FsdGVkX1+KsI2F4sTNkUi2o3tZXFeNKk7ang/tY8CvJWDln+j2SKT66RKH+YICY6qdRzMDC70OWiTl/iU7g4s39Hr0mykoS2IInJ4zYN5kCAMdCAv/mELit/Rkup0o4nr+K/74tZ84UXPamZErlngRJ3Fdt4R1Y9xy+jYdUrrCWrbvh/tMVVMTa2WfkSyu/4bxEd5Of5+gVQ56xZ0x01qoMcYBFS+AuH3fR9opMfXbzGdLcb/aEkYu+ACpASUnDDwrekH+jSW/ZgRV0CD8ENYeipCmr7Mal+EhWMYL5LB4udjJFYIx9JRG0XVwf4jch05YWsudsHZl7uLvox0Nr+VodWmQJPgeWUAdfYlHI4goH+bLedZUkA3YGpVj6HFRoWFzylteeYYMBsffHOXTl35jp2V1tNEuXN2zgYu0Fl0OI5e4nRwee8/h+Z2P55zAXFMHucCsKt4yRuqy8fDKSJ/6ONMI9yOFQP1Hl5bUTSd/Xh3KTftrHb4lZtXGETQhoHp1mO6UDR7fh2eNniQmnnqYW0iwrP76o3T25bZP6jgR//y5OUV1lwWvEg7qYSfImALQz/FQdw91GCSqtJTLB/HF/zJwzf23n/AT7o0bbGskrAIxpWZsXESf9FQLUsgS8bKCuOXnQ/MM/DkOI4tilea1bHt3b4WM3wi77Cy5PoQIsQwOh2wNxnFjM23LFi+eZcV32yrs4fNVcCDI8fBnrMS3bxDowol1WFWuQBgxCFX2Pytc3qDs8KEbWpkyrVAsyN1uArccSNMPlY8EI6pA2gvLv7jul4c9NhsX92o/eSDkxScNCDRtN1WlGIr6z2aJA2b1EpH9h26W/CsFtBxkYvk1cPRDDNeyJKp5tP5OXnkMLvuK687IeM5/y/AAHmYscZwkEfpQL4V2spS8FGUzk255qPESK3W5RM8jkyt/RsuI9uiY1CWX7+QqWYlIGMgne/4U7ZItb6x1V3gnGcm 1PaU/J+S OcQukXxCu/dmrACof0STpxVCTGD0T1tx04fp6BQNTBbLlc585K1C+Cn84Qm0EbYIJqgUmgpmx9qDR86eJVEAiQMu3o+46XNXJt0NhTB/TzrASs7OUFEo8vL1KH0+KOCZjv3Y26Z6U2BHY2/xIvmknxAdtA7V5UFVRjNYf3TBeYjjslnsg7kyZTaOWRMnFM3G+XhaV/7LQ+MHjm2k4z+0flyoGU9nyN37jylyd0B99JFTACQ5KFY8caZOlLhUZ7K7ETcIHogNRPS3TwJL7qC4fsa54BFpnxq1q1f51Y1b++UTsEPYbyE9HFRrtnGLVS/fObz2V2sLw9e1WgPcRuB6Pdn5kwhbSb0MsxCJ7/TQJ3T+y1UTncHp3pFEO8s0YubTNONPB8l0fLdnqJnIlCMN74t0ZFKDFH6f35Y2ZIP/7LVjwoaTQizMT56IA5ukqvvgyIWGh X-Bogosity: Ham, tests=bogofilter, spamicity=0.002020, 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 32a72902d045..0fee58f990ae 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 +RISCV_SUBTARGETS ?= hwprobe 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