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 B013EFA373E for ; Fri, 21 Oct 2022 16:38:06 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6B07D8E002B; Fri, 21 Oct 2022 12:37:59 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 61E298E0001; Fri, 21 Oct 2022 12:37:59 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 37A128E002B; Fri, 21 Oct 2022 12:37:59 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 26C8A8E0001 for ; Fri, 21 Oct 2022 12:37:59 -0400 (EDT) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id E9DF4AAEB7 for ; Fri, 21 Oct 2022 16:37:58 +0000 (UTC) X-FDA: 80045513436.14.0FA9D61 Received: from mail-vs1-f74.google.com (mail-vs1-f74.google.com [209.85.217.74]) by imf13.hostedemail.com (Postfix) with ESMTP id 574CD2002C for ; Fri, 21 Oct 2022 16:37:58 +0000 (UTC) Received: by mail-vs1-f74.google.com with SMTP id b68-20020a676747000000b003a780247edcso1062448vsc.14 for ; Fri, 21 Oct 2022 09:37:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=9y9Kps0uMUxaUviUQmHpRsZg2wkh8g+3BdgpOUsdpD0=; b=l/7qHlTlqK2+odgNL+qqaWtZd95RSQmfjj2EnMNPwPzYUopC/nQW9oknGDwJAIzM/V toI7WNbfT5WjVMs9srJI2QLMSDhRHFgSpdvMACL3z+IizihCksdhhkBJ5mEioYTHCvo0 FmIcUxXZMiWS/ZIIxOqSMSBxAewQGqIH5uUcc6n9Dwa4sD9nRkufaMXxSFItUN7lDgfT 9USzcKP2HR68osgtg5cJtSMN3cXJ4Jhqhm/TxBcpRTG1sKA8CwhRmqo/CkU6R16k9yiZ DFjIvC7I9+PQFY+MIk1rCSd9HJjdGzJoKWKELko+HJE1P98O26BCJKJPZ6KXbv/ZPUig 8qww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=9y9Kps0uMUxaUviUQmHpRsZg2wkh8g+3BdgpOUsdpD0=; b=K7MCGcsmH+liHmCSkZgHBr+zXqvCFC5QqPPSjpajbMtYVUdugFB+iRpG5AacNg4Tvk u0mRrVRIunV+bjurzp1bTtArj7zMoDSfWngrWB1dNrYkeKiZZgn54gPXRBUxDhMDjmb7 qYtzcemRdUV32dpSs/e3n2PpTV9OsnqlGIMxwo//WemO20KuPTi4yqzwKyXmLRpDIRQH 6YiSX6jEM02+pMBefW1NQCd3Jq4nQ1rTgH51LUwQSrnTbYzRBv+s+KVMRu3K+vXRkqRg iPsyixV3RD9ixY7TBlIg19VNX9OD0byCzHy1YJ37lfLv12DF2tSH/9OXUp7ldmKnJnIS oVyw== X-Gm-Message-State: ACrzQf0cbkf1Tww/g9pW6q1kZKj2ijKevQ2wJOYHFOdMs5KH8RpT3Jzg nOS7h2BymCLRyKurj+/G0CvKjdILGh3CHOhp X-Google-Smtp-Source: AMsMyM4nbZOrU1c/6hMqiMfGOpW3jUqhlLxnmrA187TxhDh2sp8xpyGXRT14XguSYLO8M1Ws1W5QM12ugy8JoJHf X-Received: from jthoughton.c.googlers.com ([fda3:e722:ac3:cc00:14:4d90:c0a8:2a4f]) (user=jthoughton job=sendgmr) by 2002:a67:c80d:0:b0:3aa:895:9630 with SMTP id u13-20020a67c80d000000b003aa08959630mr2609998vsk.15.1666370277616; Fri, 21 Oct 2022 09:37:57 -0700 (PDT) Date: Fri, 21 Oct 2022 16:37:00 +0000 In-Reply-To: <20221021163703.3218176-1-jthoughton@google.com> Mime-Version: 1.0 References: <20221021163703.3218176-1-jthoughton@google.com> X-Mailer: git-send-email 2.38.0.135.g90850a2211-goog Message-ID: <20221021163703.3218176-45-jthoughton@google.com> Subject: [RFC PATCH v2 44/47] selftests/kvm: add HugeTLB HGM to KVM demand paging selftest From: James Houghton To: Mike Kravetz , Muchun Song , Peter Xu Cc: David Hildenbrand , David Rientjes , Axel Rasmussen , Mina Almasry , "Zach O'Keefe" , Manish Mishra , Naoya Horiguchi , "Dr . David Alan Gilbert" , "Matthew Wilcox (Oracle)" , Vlastimil Babka , Baolin Wang , Miaohe Lin , Yang Shi , Andrew Morton , linux-mm@kvack.org, linux-kernel@vger.kernel.org, James Houghton Content-Type: text/plain; charset="UTF-8" ARC-Authentication-Results: i=1; imf13.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b="l/7qHlTl"; spf=pass (imf13.hostedemail.com: domain of 35cpSYwoKCOYRbPWcOPbWVOWWOTM.KWUTQVcf-UUSdIKS.WZO@flex--jthoughton.bounces.google.com designates 209.85.217.74 as permitted sender) smtp.mailfrom=35cpSYwoKCOYRbPWcOPbWVOWWOTM.KWUTQVcf-UUSdIKS.WZO@flex--jthoughton.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1666370278; a=rsa-sha256; cv=none; b=fnMADfnwegZNevZ9FKrG5BnSPiKTITeewvAGYCndB0X+kP6eXJlD5BhcDLUTA4rmVQ1+F8 NXFC5iE9DvEQzh4LEZuLHsG7OFUma6a3eB7fbUZw3orJu0JKGC49a7HtBg6BZ3WLJ1n1Tp 8QvrtG7iiVI6kgIcquC12w0R65vQxY8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1666370278; 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-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=9y9Kps0uMUxaUviUQmHpRsZg2wkh8g+3BdgpOUsdpD0=; b=Ae1q00GQkXpi5uZrGVLzVaxILzwfJV/yuutMd3D/k2NVZ3+W2P5K+dolxt0v+nB622u+1I hVnE1HPDbmxsDbgLRQhe0UrG7ZkNM4V8WIKnaoILfTNTUe00WbOVjvTNkkPC9pEAkBdtn0 /BFOVmM3jNBF9sTF1iW0rokZLvBwQSg= Authentication-Results: imf13.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b="l/7qHlTl"; spf=pass (imf13.hostedemail.com: domain of 35cpSYwoKCOYRbPWcOPbWVOWWOTM.KWUTQVcf-UUSdIKS.WZO@flex--jthoughton.bounces.google.com designates 209.85.217.74 as permitted sender) smtp.mailfrom=35cpSYwoKCOYRbPWcOPbWVOWWOTM.KWUTQVcf-UUSdIKS.WZO@flex--jthoughton.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com X-Rspam-User: X-Rspamd-Server: rspam10 X-Stat-Signature: cqjnf6o3i3ukrtey4co8g3seuzo4ppwm X-Rspamd-Queue-Id: 574CD2002C X-HE-Tag: 1666370278-857343 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: This test exercises the GUP paths for HGM. MADV_COLLAPSE is not tested. Signed-off-by: James Houghton --- .../selftests/kvm/demand_paging_test.c | 20 ++++++++++++++++--- .../testing/selftests/kvm/include/test_util.h | 2 ++ tools/testing/selftests/kvm/lib/kvm_util.c | 2 +- tools/testing/selftests/kvm/lib/test_util.c | 14 +++++++++++++ 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/kvm/demand_paging_test.c b/tools/testing/selftests/kvm/demand_paging_test.c index 779ae54f89c4..67ca8703c6b7 100644 --- a/tools/testing/selftests/kvm/demand_paging_test.c +++ b/tools/testing/selftests/kvm/demand_paging_test.c @@ -76,6 +76,12 @@ static int handle_uffd_page_request(int uffd_mode, int uffd, uint64_t addr) clock_gettime(CLOCK_MONOTONIC, &start); + /* + * We're using UFFD_FEATURE_EXACT_ADDRESS, so round down the address. + * This is needed to support HugeTLB high-granularity mapping. + */ + addr &= ~(demand_paging_size - 1); + if (uffd_mode == UFFDIO_REGISTER_MODE_MISSING) { struct uffdio_copy copy; @@ -214,7 +220,8 @@ static void setup_demand_paging(struct kvm_vm *vm, pthread_t *uffd_handler_thread, int pipefd, int uffd_mode, useconds_t uffd_delay, struct uffd_handler_args *uffd_args, - void *hva, void *alias, uint64_t len) + void *hva, void *alias, uint64_t len, + enum vm_mem_backing_src_type src_type) { bool is_minor = (uffd_mode == UFFDIO_REGISTER_MODE_MINOR); int uffd; @@ -244,9 +251,15 @@ static void setup_demand_paging(struct kvm_vm *vm, TEST_ASSERT(uffd >= 0, __KVM_SYSCALL_ERROR("userfaultfd()", uffd)); uffdio_api.api = UFFD_API; - uffdio_api.features = 0; + uffdio_api.features = is_minor + ? UFFD_FEATURE_EXACT_ADDRESS | UFFD_FEATURE_MINOR_HUGETLBFS_HGM + : 0; ret = ioctl(uffd, UFFDIO_API, &uffdio_api); TEST_ASSERT(ret != -1, __KVM_SYSCALL_ERROR("UFFDIO_API", ret)); + if (src_type == VM_MEM_SRC_SHARED_HUGETLB_HGM) + TEST_ASSERT(uffdio_api.features & + UFFD_FEATURE_MINOR_HUGETLBFS_HGM, + "UFFD_FEATURE_MINOR_HUGETLBFS_HGM not present"); uffdio_register.range.start = (uint64_t)hva; uffdio_register.range.len = len; @@ -329,7 +342,8 @@ static void run_test(enum vm_guest_mode mode, void *arg) pipefds[i * 2], p->uffd_mode, p->uffd_delay, &uffd_args[i], vcpu_hva, vcpu_alias, - vcpu_args->pages * perf_test_args.guest_page_size); + vcpu_args->pages * perf_test_args.guest_page_size, + p->src_type); } } diff --git a/tools/testing/selftests/kvm/include/test_util.h b/tools/testing/selftests/kvm/include/test_util.h index befc754ce9b3..0410326dbc18 100644 --- a/tools/testing/selftests/kvm/include/test_util.h +++ b/tools/testing/selftests/kvm/include/test_util.h @@ -96,6 +96,7 @@ enum vm_mem_backing_src_type { VM_MEM_SRC_ANONYMOUS_HUGETLB_16GB, VM_MEM_SRC_SHMEM, VM_MEM_SRC_SHARED_HUGETLB, + VM_MEM_SRC_SHARED_HUGETLB_HGM, NUM_SRC_TYPES, }; @@ -114,6 +115,7 @@ size_t get_def_hugetlb_pagesz(void); const struct vm_mem_backing_src_alias *vm_mem_backing_src_alias(uint32_t i); size_t get_backing_src_pagesz(uint32_t i); bool is_backing_src_hugetlb(uint32_t i); +bool is_backing_src_shared_hugetlb(enum vm_mem_backing_src_type src_type); void backing_src_help(const char *flag); enum vm_mem_backing_src_type parse_backing_src_type(const char *type_name); long get_run_delay(void); diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index f1cb1627161f..7d769a117e14 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -896,7 +896,7 @@ void vm_userspace_mem_region_add(struct kvm_vm *vm, region->fd = -1; if (backing_src_is_shared(src_type)) region->fd = kvm_memfd_alloc(region->mmap_size, - src_type == VM_MEM_SRC_SHARED_HUGETLB); + is_backing_src_shared_hugetlb(src_type)); region->mmap_start = mmap(NULL, region->mmap_size, PROT_READ | PROT_WRITE, diff --git a/tools/testing/selftests/kvm/lib/test_util.c b/tools/testing/selftests/kvm/lib/test_util.c index 6d23878bbfe1..710dc42077fe 100644 --- a/tools/testing/selftests/kvm/lib/test_util.c +++ b/tools/testing/selftests/kvm/lib/test_util.c @@ -254,6 +254,13 @@ const struct vm_mem_backing_src_alias *vm_mem_backing_src_alias(uint32_t i) */ .flag = MAP_SHARED, }, + [VM_MEM_SRC_SHARED_HUGETLB_HGM] = { + /* + * Identical to shared_hugetlb except for the name. + */ + .name = "shared_hugetlb_hgm", + .flag = MAP_SHARED, + }, }; _Static_assert(ARRAY_SIZE(aliases) == NUM_SRC_TYPES, "Missing new backing src types?"); @@ -272,6 +279,7 @@ size_t get_backing_src_pagesz(uint32_t i) switch (i) { case VM_MEM_SRC_ANONYMOUS: case VM_MEM_SRC_SHMEM: + case VM_MEM_SRC_SHARED_HUGETLB_HGM: return getpagesize(); case VM_MEM_SRC_ANONYMOUS_THP: return get_trans_hugepagesz(); @@ -288,6 +296,12 @@ bool is_backing_src_hugetlb(uint32_t i) return !!(vm_mem_backing_src_alias(i)->flag & MAP_HUGETLB); } +bool is_backing_src_shared_hugetlb(enum vm_mem_backing_src_type src_type) +{ + return src_type == VM_MEM_SRC_SHARED_HUGETLB || + src_type == VM_MEM_SRC_SHARED_HUGETLB_HGM; +} + static void print_available_backing_src_types(const char *prefix) { int i; -- 2.38.0.135.g90850a2211-goog