From patchwork Tue Feb 25 17:25:38 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicolin Chen X-Patchwork-Id: 13990411 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B70D9C021B2 for ; Tue, 25 Feb 2025 17:55:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type: Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-ID:Date :Subject:CC:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=l0kbEzCCBCwfliZYSwakktJXjjge9xvLJvx1Yf2MNKE=; b=ARdEnshLzaHJbU7MQ7WvuvuKGt Uw3BIp/3L0dS/HYMMDxH04Sg3wSzzXI7ZHeqDDejeLyuBc7FxLgu5OnTnBgMUcRvTGiQOdRI29FPy OWOYJiZvRBR7vEICziSzukm82+ncEjd5suKQAbWkW/bCzDrzH0w5DBcfan62LH17tBGQO9Dg15Ydi gjkFswC+8fGieS5B7zy/HeMZfP97zTQI5kuPY1oGdQvng34AAxDqsyZp7BOwCHPyjfvXOKD9F8qPM fxSk7j+O2ZtDcPB2E0BhYqas4RQUGzx5ssurPWOXe9Tc3t0j3vMS7T9fi3246MHYFjYg6cwo+hQFU cXvDOTgQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tmz93-00000000lvA-3qOE; Tue, 25 Feb 2025 17:55:01 +0000 Received: from mail-dm6nam11on20613.outbound.protection.outlook.com ([2a01:111:f403:2415::613] helo=NAM11-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tmyhS-00000000dGz-37mS for linux-arm-kernel@lists.infradead.org; Tue, 25 Feb 2025 17:26:31 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=CuwbvznDRpT7i+HroDogqFq2ZxwZ8bjhdcpUqBSjnR0E9GUFzDb4dilVS0AWNX1HbXmM1nIRn9TaTS4ccbiXV7wiN7R+p+ZnIctMh6Mw68+I3KYDHtvbFeniP3N81t03Abwi+HX+b0uemm0tkeqk8HhanODUoUZMyG6Gyp9nmCgFwwx5SF0Py9i8OvQJcjfWnW7FtBYbs0ua4YmI/HTyjPVXmKoHhXtWuEzv3bXqtkiPB3XEfxUH3rIlSaQ/GmnrLE0AgDk+r1vh4VQZP38pgsyzt7GObPZXCykcPlpS+IyHs/q7SyplltzUFD/96nIQitzvi6ikVzFOSD+O2bRSXQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=l0kbEzCCBCwfliZYSwakktJXjjge9xvLJvx1Yf2MNKE=; b=NoiF9IPl8TDXJEH2OccCBT/2OcDhpNN5wrmjKnFdsupJkueclqQWKXqSWsFVltHWJuTFpGrXfPrxo7ORfnrR/wiqhmpKXjdKCQUI2kQ+6SUP9YYS0+wRNFU0meNi6YuLRLaeETkwbAl/0x7ATFVInrZ/shJ5kMTlDKLKXRaYyxTE6gf8zzG5ob0mcVDqEkV4k+gCjO/1twOjQ/UKlggP8ESsliMUOMKQmYSHqmLAzmSYHiyS7Xgk7SZtEqxgFkPJaA76AeiFFElBPe/sIO136ZPDE08GZJgmVZCf7pYDmnDgq8z4SvMaUv2txtXd+L9brhmq2I54+4Oa0Xk47j1KfQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=intel.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=l0kbEzCCBCwfliZYSwakktJXjjge9xvLJvx1Yf2MNKE=; b=Kx6C7yS3TPhrvaopyXuWWkOnOC3es51zP9nS5LISw2CTFqVtRl97xSBLNgmZ6jc8N7PaNb5yCFIklGUS+VzpZCqlCpjOXG9blBXr22KKlqMLYihWup1YzanQBoMm3A0lIqIcbc+xR4ywU0wD0pOc5W6t9msqCnwCVSMT3QQr+QVA+kq5LHNTfb0FZSEau/n1i3UkHTWn670WGF8mZS98wBcJjcpHrqEEjL2AKpdiQwqX3fy2vWHSFUuv4ggs1Ntl7ij3Muolv3ECoh/nmUu25zNBBUPYaF0jJj7cE9wmSY4YEuDnN+XCGiWHz+qr0gy/WVBbk6bHdwElhPX8ddjpKA== Received: from DS7PR03CA0179.namprd03.prod.outlook.com (2603:10b6:5:3b2::34) by MW4PR12MB7014.namprd12.prod.outlook.com (2603:10b6:303:218::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8466.21; Tue, 25 Feb 2025 17:26:21 +0000 Received: from DS1PEPF0001708E.namprd03.prod.outlook.com (2603:10b6:5:3b2:cafe::cf) by DS7PR03CA0179.outlook.office365.com (2603:10b6:5:3b2::34) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8466.20 via Frontend Transport; Tue, 25 Feb 2025 17:26:21 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by DS1PEPF0001708E.mail.protection.outlook.com (10.167.17.134) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8489.16 via Frontend Transport; Tue, 25 Feb 2025 17:26:21 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.4; Tue, 25 Feb 2025 09:26:08 -0800 Received: from rnnvmail202.nvidia.com (10.129.68.7) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.14; Tue, 25 Feb 2025 09:26:07 -0800 Received: from Asurada-Nvidia.nvidia.com (10.127.8.11) by mail.nvidia.com (10.129.68.7) with Microsoft SMTP Server id 15.2.1544.14 via Frontend Transport; Tue, 25 Feb 2025 09:26:06 -0800 From: Nicolin Chen To: , , , CC: , , , , , , , , , , , , , , , , , , , Subject: [PATCH v8 10/14] iommufd/selftest: Add IOMMU_VEVENTQ_ALLOC test coverage Date: Tue, 25 Feb 2025 09:25:38 -0800 Message-ID: <88aec1b97268ad9edfeced1567c61bf8fda69a90.1740504232.git.nicolinc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: MIME-Version: 1.0 X-NV-OnPremToCloud: AnonymousSubmission X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS1PEPF0001708E:EE_|MW4PR12MB7014:EE_ X-MS-Office365-Filtering-Correlation-Id: 6f984ed8-09f9-432b-c58a-08dd55c18583 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|82310400026|1800799024|36860700013; X-Microsoft-Antispam-Message-Info: EGY0RTkYd7K8VZDiPc/VCUBCVmLagx58W00QN3YdcU/d1m3vXTKAiq/BDakOnNet4be93HVs5fMICju5VQ3Xue5Eq3p02eP5YGty66ZDAkC/lAGzSwT8FQPhzl9kgITJrDHaPYWMUiePp3e+ivIXCpn+HNJWD6z/d6fngQwT1upKpGRczWBeaH1+lH3fkD78XZ3SQKpjXRxfGx/l+BrhEmVu0qtTxDKCrqva3qub2xB2NnbNubXctIHIZnOitN/T0H3aAkerOeoFbvfBhjUB75EgrYeAY5paNg9O7jyhQCKRCoHoE/wHYlxEd8AUQniXODq5/eyI6F+1nWExDRuwzPDWkftvNY66zTEvaT5QkDH4ruHLE3N8esJqOUH2x2cXK9pCSMvPKpgKsLb3nF8qub/LkeQfAQZw016nZVrcecWw3nz4mJnhFVUF60Jqu5JwlFovoWctePeOO1B2T7VbZ/Jw+fb8u3lTnsEjdByVBQ8aaGaZIUbSOv+CM+lbOlsvhRNsgeFjsFdwmAp2cmqsMMKwAUNzlAwo9I/chKvQQxHKqtAqMy4bx/0RJEFGPtIxV0GjLJNbsVY4yNAZuLDoo95VdavOHY35QDd0ZomCnh8M2QeJdPObKW4r9KKBmTDLtgD78GBWuLGvVJr8wPeek+Z2yqQzRejGANWiv1Kd91GthQgAfEHadNRcm2wZ40E1jKbYpYBk95IfZmOdWoF3loysp1LOaRQAOV0eBrGGnmpAPcmIIdO3XLUPxXAih2lgzI6XwrwYwBRM63ziFvgxGz5jGDZ1xIw39Oryb4ObC3ZEpomdC3wjlRsvWxGCbE1bFBV1GcG3tOfDIOAsQ89BiGLIkcLvcB3K6CWbYxUyKpDi5iOaLWPk71EJ0GGPte8cQn93UwYvJ/r216opG7n9ivpoIwxYSRC2xDeN3EJIvsv9XzfvX5eiQV2/A0kJnok4yGv7ze65ls+WsVLPUyg/by0zJToH+lIREtYJ8OURUx4h0a50Skkut0sktBbhxGfzncaG7sq38PFeInKSZ5af0k68F4HnezCBmQ17lzVQwD+zCPxN5gkkMNYcJRgHjov9Zt24hHQexC2fKqu8Qd79XRw3J0ffF6mCJNyAC14/peof50X9XtSjlsktAYA/OTLH1eRbImXvApXDWm+6RsTY9gXe3dijb30esQwxXAgXZg0i2j5IqdenJlJe86g8/l9iYj8sCfe7R9sVXq0xv/rMCxmBOgjVCYuax/D73YGUuHP6lZBuHUob+LrwaxONsHpKwozq+YL3Y2aS/fNpQrN2M6UfbW/wW6hBlyd6OY8VpNLv8rbrajGSgVCAoPMvJh+s03Hr+79YakK/1vF0y1a+otaGmY6SA2CtCcuGKTXSBJKZMfGroiwqXBQCTGzp8A+g7AT43bqnZ+T5F67tc/mX/WGxpckcu7saqFqzkpN4Cy4dYR6haLJhFFrIN6mhCKZHY3OGbuK8WNjWMe2GsoUJmd3SCimBCwf0CpIZPsPBPRQ= X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(7416014)(376014)(82310400026)(1800799024)(36860700013);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2025 17:26:21.1814 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6f984ed8-09f9-432b-c58a-08dd55c18583 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: DS1PEPF0001708E.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB7014 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250225_092630_839490_C07EAC5C X-CRM114-Status: GOOD ( 18.18 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Trigger vEVENTs by feeding an idev ID and validating the returned output virt_ids whether they equal to the value that was set to the vDEVICE. Reviewed-by: Kevin Tian Signed-off-by: Nicolin Chen --- tools/testing/selftests/iommu/iommufd_utils.h | 115 ++++++++++++++++++ tools/testing/selftests/iommu/iommufd.c | 31 +++++ .../selftests/iommu/iommufd_fail_nth.c | 7 ++ 3 files changed, 153 insertions(+) diff --git a/tools/testing/selftests/iommu/iommufd_utils.h b/tools/testing/selftests/iommu/iommufd_utils.h index d979f5b0efe8..6f2ba2fa8f76 100644 --- a/tools/testing/selftests/iommu/iommufd_utils.h +++ b/tools/testing/selftests/iommu/iommufd_utils.h @@ -9,6 +9,7 @@ #include #include #include +#include #include "../kselftest_harness.h" #include "../../../../drivers/iommu/iommufd/iommufd_test.h" @@ -936,3 +937,117 @@ static int _test_cmd_vdevice_alloc(int fd, __u32 viommu_id, __u32 idev_id, EXPECT_ERRNO(_errno, \ _test_cmd_vdevice_alloc(self->fd, viommu_id, idev_id, \ virt_id, vdev_id)) + +static int _test_cmd_veventq_alloc(int fd, __u32 viommu_id, __u32 type, + __u32 *veventq_id, __u32 *veventq_fd) +{ + struct iommu_veventq_alloc cmd = { + .size = sizeof(cmd), + .type = type, + .veventq_depth = 2, + .viommu_id = viommu_id, + }; + int ret; + + ret = ioctl(fd, IOMMU_VEVENTQ_ALLOC, &cmd); + if (ret) + return ret; + if (veventq_id) + *veventq_id = cmd.out_veventq_id; + if (veventq_fd) + *veventq_fd = cmd.out_veventq_fd; + return 0; +} + +#define test_cmd_veventq_alloc(viommu_id, type, veventq_id, veventq_fd) \ + ASSERT_EQ(0, _test_cmd_veventq_alloc(self->fd, viommu_id, type, \ + veventq_id, veventq_fd)) +#define test_err_veventq_alloc(_errno, viommu_id, type, veventq_id, \ + veventq_fd) \ + EXPECT_ERRNO(_errno, \ + _test_cmd_veventq_alloc(self->fd, viommu_id, type, \ + veventq_id, veventq_fd)) + +static int _test_cmd_trigger_vevents(int fd, __u32 dev_id, __u32 nvevents) +{ + struct iommu_test_cmd trigger_vevent_cmd = { + .size = sizeof(trigger_vevent_cmd), + .op = IOMMU_TEST_OP_TRIGGER_VEVENT, + .trigger_vevent = { + .dev_id = dev_id, + }, + }; + int ret; + + while (nvevents--) { + ret = ioctl(fd, _IOMMU_TEST_CMD(IOMMU_TEST_OP_TRIGGER_VEVENT), + &trigger_vevent_cmd); + if (ret < 0) + return -1; + } + return ret; +} + +#define test_cmd_trigger_vevents(dev_id, nvevents) \ + ASSERT_EQ(0, _test_cmd_trigger_vevents(self->fd, dev_id, nvevents)) + +static int _test_cmd_read_vevents(int fd, __u32 event_fd, __u32 nvevents, + __u32 virt_id, int *prev_seq) +{ + struct pollfd pollfd = { .fd = event_fd, .events = POLLIN }; + struct iommu_viommu_event_selftest *event; + struct iommufd_vevent_header *hdr; + ssize_t bytes; + void *data; + int ret, i; + + ret = poll(&pollfd, 1, 1000); + if (ret < 0) + return -1; + + data = calloc(nvevents, sizeof(*hdr) + sizeof(*event)); + if (!data) { + errno = ENOMEM; + return -1; + } + + bytes = read(event_fd, data, + nvevents * (sizeof(*hdr) + sizeof(*event))); + if (bytes <= 0) { + errno = EFAULT; + ret = -1; + goto out_free; + } + + for (i = 0; i < nvevents; i++) { + hdr = data + i * (sizeof(*hdr) + sizeof(*event)); + + if (hdr->flags & IOMMU_VEVENTQ_FLAG_LOST_EVENTS || + hdr->sequence - *prev_seq > 1) { + *prev_seq = hdr->sequence; + errno = EOVERFLOW; + ret = -1; + goto out_free; + } + *prev_seq = hdr->sequence; + event = data + sizeof(*hdr); + if (event->virt_id != virt_id) { + errno = EINVAL; + ret = -1; + goto out_free; + } + } + + ret = 0; +out_free: + free(data); + return ret; +} + +#define test_cmd_read_vevents(event_fd, nvevents, virt_id, prev_seq) \ + ASSERT_EQ(0, _test_cmd_read_vevents(self->fd, event_fd, nvevents, \ + virt_id, prev_seq)) +#define test_err_read_vevents(_errno, event_fd, nvevents, virt_id, prev_seq) \ + EXPECT_ERRNO(_errno, \ + _test_cmd_read_vevents(self->fd, event_fd, nvevents, \ + virt_id, prev_seq)) diff --git a/tools/testing/selftests/iommu/iommufd.c b/tools/testing/selftests/iommu/iommufd.c index 212e5d62e13d..dd453aae8fed 100644 --- a/tools/testing/selftests/iommu/iommufd.c +++ b/tools/testing/selftests/iommu/iommufd.c @@ -2774,15 +2774,46 @@ TEST_F(iommufd_viommu, vdevice_alloc) uint32_t viommu_id = self->viommu_id; uint32_t dev_id = self->device_id; uint32_t vdev_id = 0; + uint32_t veventq_id; + uint32_t veventq_fd; + int prev_seq = -1; if (dev_id) { + /* Must allocate vdevice before attaching to a nested hwpt */ + test_err_mock_domain_replace(ENOENT, self->stdev_id, + self->nested_hwpt_id); + + /* Allocate a vEVENTQ with veventq_depth=2 */ + test_cmd_veventq_alloc(viommu_id, IOMMU_VEVENTQ_TYPE_SELFTEST, + &veventq_id, &veventq_fd); + test_err_veventq_alloc(EEXIST, viommu_id, + IOMMU_VEVENTQ_TYPE_SELFTEST, NULL, NULL); /* Set vdev_id to 0x99, unset it, and set to 0x88 */ test_cmd_vdevice_alloc(viommu_id, dev_id, 0x99, &vdev_id); + test_cmd_mock_domain_replace(self->stdev_id, + self->nested_hwpt_id); + test_cmd_trigger_vevents(dev_id, 1); + test_cmd_read_vevents(veventq_fd, 1, 0x99, &prev_seq); test_err_vdevice_alloc(EEXIST, viommu_id, dev_id, 0x99, &vdev_id); + test_cmd_mock_domain_replace(self->stdev_id, self->ioas_id); test_ioctl_destroy(vdev_id); + + /* Try again with 0x88 */ test_cmd_vdevice_alloc(viommu_id, dev_id, 0x88, &vdev_id); + test_cmd_mock_domain_replace(self->stdev_id, + self->nested_hwpt_id); + /* Trigger an overflow with three events */ + test_cmd_trigger_vevents(dev_id, 3); + test_err_read_vevents(EOVERFLOW, veventq_fd, 3, 0x88, + &prev_seq); + /* Overflow must be gone after the previous reads */ + test_cmd_trigger_vevents(dev_id, 1); + test_cmd_read_vevents(veventq_fd, 1, 0x88, &prev_seq); + close(veventq_fd); + test_cmd_mock_domain_replace(self->stdev_id, self->ioas_id); test_ioctl_destroy(vdev_id); + test_ioctl_destroy(veventq_id); } else { test_err_vdevice_alloc(ENOENT, viommu_id, dev_id, 0x99, NULL); } diff --git a/tools/testing/selftests/iommu/iommufd_fail_nth.c b/tools/testing/selftests/iommu/iommufd_fail_nth.c index 64b1f8e1b0cf..99a7f7897bb2 100644 --- a/tools/testing/selftests/iommu/iommufd_fail_nth.c +++ b/tools/testing/selftests/iommu/iommufd_fail_nth.c @@ -620,6 +620,7 @@ TEST_FAIL_NTH(basic_fail_nth, device) }; struct iommu_test_hw_info info; uint32_t fault_id, fault_fd; + uint32_t veventq_id, veventq_fd; uint32_t fault_hwpt_id; uint32_t ioas_id; uint32_t ioas_id2; @@ -692,6 +693,12 @@ TEST_FAIL_NTH(basic_fail_nth, device) IOMMU_HWPT_DATA_SELFTEST, &data, sizeof(data))) return -1; + if (_test_cmd_veventq_alloc(self->fd, viommu_id, + IOMMU_VEVENTQ_TYPE_SELFTEST, &veventq_id, + &veventq_fd)) + return -1; + close(veventq_fd); + return 0; }