Received: by 2002:ab2:7041:0:b0:1f4:bcc8:f211 with SMTP id x1csp17981lql; Fri, 12 Apr 2024 02:07:16 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCVT+3ab/dEgB1iTQSiaHndSuoWmGornVVwF5TAghQ1K6zm9aQdcMeZd1NtEn/AGfUsWX2gJSAn7FSaUD4ChjgVJwhHvMK+UsbWmfXPlQA== X-Google-Smtp-Source: AGHT+IFbzJfTcqFHLBEc3NZk54900d9BI/eJKhmvHC05OjD4L5XjjIfXFXAcopXuS5FhCjgerVVj X-Received: by 2002:a17:902:d2c1:b0:1e5:c131:ca0e with SMTP id n1-20020a170902d2c100b001e5c131ca0emr421707plc.6.1712912836148; Fri, 12 Apr 2024 02:07:16 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1712912836; cv=pass; d=google.com; s=arc-20160816; b=aUBn4LKXhiZQr2jO05Ehi8znost61X7uRJJtF/7sa3pW1f8MMGySOXF4XyDtrBqxKa jFPESgoibKNqt9oMmXz0AyQBRhsOVhv2//7259fjvJBs5VGHU8gKTPea4UzgJolhxOAT aKL4TLvlCykO6AmBieWWnmczdq8fmrjEAVWPdS2c4ivS/LboI5zha3TnyNrh0rBqQQRS w0pYOj7E4ndHMCguJih5VIJ1eg91NYs/F0wLERVUQsbD9uf+GLKRvW5cFB8dxp/hmqWj vXS+o3sU/WKKeT8Zs5ObxkikiuIECj4AQWDKOw+wqJj2AL3qXy0KI7pWjsDAqhmI+VF/ +Ybw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:message-id:date:subject:cc:to :from:dkim-signature; bh=WhIdLWivIqIvKp3FSm9AKW2RcexApWfnR7lW4YKH3gc=; fh=0kqso7drgVEs3QTapDU3q4w9kbcHsn4Ux5rSDS3jRKQ=; b=fwWEsqLJx5rxFoeGm0YXoE9vIUTxX9gUJSaB90yF0tDjR+L7q96kWFchmVdUNH/kYP zX1EoK33TFgfRQRtDWiHVBQhnToTFPA5H/PH36tJ0mLK+d8q/RrYkJeLGY2TJGaUJC25 XbJBQZif5YnJJ/bq4oBfP6KMUOZA4OxTzgouTRjJWVV9ne70p68xlhwzxgnyY3rt9wIr /PaZyNsXvN7ATcLsRks1CwRryZzK82O8qmLtNn3KWoofTJzfDe3qjR6AH9lIM5pUEub1 XfeCItn0yxvt8zrAqMm30XZdjNZj0bZCC2ZY7Cm9Es7WpTlMLGRjFkfjPyHXI7wzIIkD vBcw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=XBkbwxeD; arc=pass (i=1 spf=pass spfdomain=redhat.com dkim=pass dkdomain=redhat.com dmarc=pass fromdomain=redhat.com); spf=pass (google.com: domain of linux-kernel+bounces-142280-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-142280-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [147.75.48.161]) by mx.google.com with ESMTPS id bq21-20020a056a02045500b005ceef3c53a1si3022394pgb.635.2024.04.12.02.07.15 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Apr 2024 02:07:16 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-142280-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) client-ip=147.75.48.161; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=XBkbwxeD; arc=pass (i=1 spf=pass spfdomain=redhat.com dkim=pass dkdomain=redhat.com dmarc=pass fromdomain=redhat.com); spf=pass (google.com: domain of linux-kernel+bounces-142280-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-142280-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id 8A42FB25355 for ; Fri, 12 Apr 2024 08:51:31 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id C179075815; Fri, 12 Apr 2024 08:43:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="XBkbwxeD" Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E8E646CDB4 for ; Fri, 12 Apr 2024 08:43:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712911424; cv=none; b=S57bguoXIbmcB6vxBz07kVacjldVmWGtW0aXXpAobE6uEP5OPZvvhFBFsXl1IwlJycaYS1Fp9G23s0LQWTmazOYlnQq2o0ouErOk2qtZPU1FCs+IGGeGGn9X2pdpyb4eH7XvtEahsoZunYQrajmQiwDHb6W6h6Ii49DOeQich/g= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712911424; c=relaxed/simple; bh=j7Y4ZpRE0Th2mRGXrMufOMFA5pgpOzLmfPeNzLiOs4E=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=dIKdKemm9r5xENt7PiDPupp8CIY9htMXEhzu16+32PpoOZ6auKGHJ3YmV4pEBf2NZKanm86uFDQLH9v3pv9X8mCDuVGzXBU0HJtlNIUeB0L2tqnx/iT9WklVUuUP9O4wTMeHFzuHyPWIa6V11DZuNhKgy+aKELxPlOIO9ure8qk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=XBkbwxeD; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1712911422; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=WhIdLWivIqIvKp3FSm9AKW2RcexApWfnR7lW4YKH3gc=; b=XBkbwxeDPSiyjyudeIz2aT1e/kknGLHpY+mIdG0+MCuyaKL9akmvqF1yZsKpcyfgupjPry Da9/5FRT+tAGozKMRPJ7VT3TIfYVIv8apZkdiI2xO3CiHu9HcN9paXY92Xd+4v/seAGHs5 8U6ltEt34S0HH6KOiFJqVy+8Aq3LaM0= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-463-nKXeVBXSP6uT3Uv1kyZYYA-1; Fri, 12 Apr 2024 04:43:37 -0400 X-MC-Unique: nKXeVBXSP6uT3Uv1kyZYYA-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 34CAE1C05AAC; Fri, 12 Apr 2024 08:43:37 +0000 (UTC) Received: from t14s.redhat.com (unknown [10.39.193.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id 616F2C13FA0; Fri, 12 Apr 2024 08:43:34 +0000 (UTC) From: David Hildenbrand To: linux-kernel@vger.kernel.org Cc: kvm@vger.kernel.org, linux-kselftest@vger.kernel.org, David Hildenbrand , Christian Borntraeger , Janosch Frank , Claudio Imbrenda , Thomas Huth , Alexander Gordeev , Paolo Bonzini , Shuah Khan Subject: [PATCH v1] KVM: s390x: selftests: Add shared zeropage test Date: Fri, 12 Apr 2024 10:43:29 +0200 Message-ID: <20240412084329.30315-1-david@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.8 Let's test that we can have shared zeropages in our process as long as storage keys are not getting used, that shared zeropages are properly unshared (replaced by anonymous pages) once storage keys are enabled, and that no new shared zeropages are populated after storage keys were enabled. We require the new pagemap interface to detect the shared zeropage. On an old kernel (zeropages always disabled): # ./s390x/shared_zeropage_test TAP version 13 1..3 not ok 1 Shared zeropages should be enabled ok 2 Shared zeropage should be gone ok 3 Shared zeropages should be disabled # Totals: pass:2 fail:1 xfail:0 xpass:0 skip:0 error:0 On a fixed kernel: # ./s390x/shared_zeropage_test TAP version 13 1..3 ok 1 Shared zeropages should be enabled ok 2 Shared zeropage should be gone ok 3 Shared zeropages should be disabled # Totals: pass:3 fail:0 xfail:0 xpass:0 skip:0 error:0 Testing of UFFDIO_ZEROPAGE can be added later. Cc: Christian Borntraeger Cc: Janosch Frank Cc: Claudio Imbrenda Cc: Thomas Huth Cc: Alexander Gordeev Cc: Paolo Bonzini Cc: Shuah Khan Signed-off-by: David Hildenbrand --- To get it right this time, test the relevant cases. v3 of fixes are at: https://lore.kernel.org/all/20240411161441.910170-1-david@redhat.com/T/#u --- tools/testing/selftests/kvm/Makefile | 1 + .../kvm/s390x/shared_zeropage_test.c | 110 ++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 tools/testing/selftests/kvm/s390x/shared_zeropage_test.c diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile index 741c7dc16afc..ed4ad591f193 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -180,6 +180,7 @@ TEST_GEN_PROGS_s390x += s390x/sync_regs_test TEST_GEN_PROGS_s390x += s390x/tprot TEST_GEN_PROGS_s390x += s390x/cmma_test TEST_GEN_PROGS_s390x += s390x/debug_test +TEST_GEN_PROGS_s390x += s390x/shared_zeropage_test TEST_GEN_PROGS_s390x += demand_paging_test TEST_GEN_PROGS_s390x += dirty_log_test TEST_GEN_PROGS_s390x += guest_print_test diff --git a/tools/testing/selftests/kvm/s390x/shared_zeropage_test.c b/tools/testing/selftests/kvm/s390x/shared_zeropage_test.c new file mode 100644 index 000000000000..74e829748fb1 --- /dev/null +++ b/tools/testing/selftests/kvm/s390x/shared_zeropage_test.c @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Test shared zeropage handling (with/without storage keys) + * + * Copyright (C) 2024, Red Hat, Inc. + */ +#include + +#include + +#include "test_util.h" +#include "kvm_util.h" +#include "kselftest.h" + +static void set_storage_key(void *addr, uint8_t skey) +{ + asm volatile("sske %0,%1" : : "d" (skey), "a" (addr)); +} + +static void guest_code(void) +{ + /* Issue some storage key instruction. */ + set_storage_key((void *)0, 0x98); + GUEST_DONE(); +} + +/* + * Returns 1 if the shared zeropage is mapped, 0 if something else is mapped. + * Returns < 0 on error or if nothing is mapped. + */ +static int maps_shared_zeropage(int pagemap_fd, void *addr) +{ + struct page_region region; + struct pm_scan_arg arg = { + .start = (uintptr_t)addr, + .end = (uintptr_t)addr + 4096, + .vec = (uintptr_t)®ion, + .vec_len = 1, + .size = sizeof(struct pm_scan_arg), + .category_mask = PAGE_IS_PFNZERO, + .category_anyof_mask = PAGE_IS_PRESENT, + .return_mask = PAGE_IS_PFNZERO, + }; + return ioctl(pagemap_fd, PAGEMAP_SCAN, &arg); +} + +int main(int argc, char *argv[]) +{ + char *mem, *page0, *page1, *page2, tmp; + const size_t pagesize = getpagesize(); + struct kvm_vcpu *vcpu; + struct kvm_vm *vm; + struct ucall uc; + int pagemap_fd; + + ksft_print_header(); + ksft_set_plan(3); + + /* + * We'll use memory that is not mapped into the VM for simplicity. + * Shared zeropages are enabled/disabled per-process. + */ + mem = mmap(0, 3 * pagesize, PROT_READ, MAP_PRIVATE|MAP_ANON, -1, 0); + TEST_ASSERT(mem != MAP_FAILED, "mmap() failed"); + + /* Disable THP. Ignore errors on older kernels. */ + madvise(mem, 3 * pagesize, MADV_NOHUGEPAGE); + + page0 = mem; + page1 = page0 + pagesize; + page2 = page1 + pagesize; + + /* Can we even detect shared zeropages? */ + pagemap_fd = open("/proc/self/pagemap", O_RDONLY); + TEST_REQUIRE(pagemap_fd >= 0); + + tmp = *page0; + asm volatile("" : "+r" (tmp)); + TEST_REQUIRE(maps_shared_zeropage(pagemap_fd, page0) == 1); + + vm = vm_create_with_one_vcpu(&vcpu, guest_code); + + /* Verify that we get the shared zeropage after VM creation. */ + tmp = *page1; + asm volatile("" : "+r" (tmp)); + ksft_test_result(maps_shared_zeropage(pagemap_fd, page1) == 1, + "Shared zeropages should be enabled\n"); + + /* + * Let our VM execute a storage key instruction that should + * unshare all shared zeropages. + */ + vcpu_run(vcpu); + get_ucall(vcpu, &uc); + TEST_ASSERT_EQ(uc.cmd, UCALL_DONE); + + /* Verify that we don't have a shared zeropage anymore. */ + ksft_test_result(!maps_shared_zeropage(pagemap_fd, page1), + "Shared zeropage should be gone\n"); + + /* Verify that we don't get any new shared zeropages. */ + tmp = *page2; + asm volatile("" : "+r" (tmp)); + ksft_test_result(!maps_shared_zeropage(pagemap_fd, page2), + "Shared zeropages should be disabled\n"); + + kvm_vm_free(vm); + + ksft_finished(); +} -- 2.44.0