From nobody Mon Feb 2 07:29:08 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; arc=fail (Bad Signature); dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1768614256283262.54664014783646; Fri, 16 Jan 2026 17:44:16 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id 035B943DBC; Fri, 16 Jan 2026 20:44:16 -0500 (EST) Received: from [172.19.199.3] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 0871A43F40; Fri, 16 Jan 2026 20:40:01 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id 7983A41B7C; Fri, 16 Jan 2026 20:39:48 -0500 (EST) Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010059.outbound.protection.outlook.com [52.101.193.59]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 7F83341B93 for ; Fri, 16 Jan 2026 20:39:44 -0500 (EST) Received: from DS2PR12MB9567.namprd12.prod.outlook.com (2603:10b6:8:27c::8) by LV2PR12MB999097.namprd12.prod.outlook.com (2603:10b6:408:353::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.6; Sat, 17 Jan 2026 01:39:43 +0000 Received: from DS2PR12MB9567.namprd12.prod.outlook.com ([fe80::636:1b52:24ca:d7e5]) by DS2PR12MB9567.namprd12.prod.outlook.com ([fe80::636:1b52:24ca:d7e5%3]) with mapi id 15.20.9520.005; Sat, 17 Jan 2026 01:39:42 +0000 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_INVALID,DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=EyfcmYhC5fg07wGvtwD8TS+TakD9NdqNVU+GqHUjp7pJqXPF531Vo4pqOtLBAtmcnOE1R48xaJ+10dHFfXoEmq0Vw0mQrPBgS7HKnSpyZrvNhgq7nnBE/jn8EhxCSzd/viiQZoVsS2ufE05iCNpkE+we2tx7IFVaiHpJP5XIgOex0PO7Oaad1QdzUehaiKetmugl/MYwLQkjHRyh323vZe+TubzncAfo0l5fACHjUd4DEKYHMrcaXRlV+rrbwE8Vk3DkUm3lRSscrHjDTVWk7UFbStgX1/G2/M3OZHsKEc8GSSMCmVuWazweyCjPnmQNs4ei4b8QuynJ27ebeZLJ5g== 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=Zrj3lCkiJYPlH4CTN1LGoEjAjqjGPX9vbiNYOXNvXgY=; b=B5NKBuGGxlIvLerRr3yupWDUa9TpuljIWexJ1ny4p9Xu/WL58vVYFu0gjjNbae4DV53KevUuFZ8quWe1mp7HtLw1NdCD+HWgGVeVrH72YNxEUH5ZRPx29EOvxDPwdOKx9JyxhwCPf3kQrxhAXUX8zBYLqyF52gjBkOpk177kVjrS2Tzp4s2ldSUOkos3KQ2jaOfpC7toFXJHMgz1JVmYKUf8fVg0x8R5XOg0j42EVImNkt2w+ncFYtfFpa0vmZC20pu+j70CgG+OqxsyHiYMUzQfRKo++4nTGOnJ0J+IBz1H6QeQhS4CwP6K97lzbbpn6mLl+4CPtc0diN9Z3nNNUA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none 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=Zrj3lCkiJYPlH4CTN1LGoEjAjqjGPX9vbiNYOXNvXgY=; b=seJ3gu+/F8gr4kV8HFaaxnVcfPZCHGKF40TIZMdFQBekhdfwN7B8lQXB9dyb2fAt5eVllnASv4CaM4ktSJ7gvDFYiPoMWCyqJK+Mo/X3LEOQKpCKB20gT7Tcf3+/dfgcVUGzhgbQxUM5ZyILt34Xh9Al6c0hKvAfecuzpChYgm6n93uMMnT/z9dm2M3+9UiigrW2zg+qyTAUBnVYBuVJjISMTIkuNG8z/X6O8fr53/7I5KUiWwVldmKvf+STayzme7KMkFs9hoj41aFVkcalLNnxf39uBmQDT0PHwPloWmCHae69CW/q2edz22MZw+mUBDwaXVrSDooOJk4PM94WQw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; To: devel@lists.libvirt.org Subject: [PATCH v5 3/7] qemu: Support per-process memory accounting for iommufd Date: Fri, 16 Jan 2026 17:39:33 -0800 Message-ID: <20260117013937.3803457-4-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260117013937.3803457-1-nathanc@nvidia.com> References: <20260117013937.3803457-1-nathanc@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0139.namprd03.prod.outlook.com (2603:10b6:a03:33c::24) To DS2PR12MB9567.namprd12.prod.outlook.com (2603:10b6:8:27c::8) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS2PR12MB9567:EE_|LV2PR12MB999097:EE_ X-MS-Office365-Filtering-Correlation-Id: aa9f66e4-7016-42c4-6a11-08de5569499c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|1800799024|366016|18082099003; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?acLXYIm8tgftaeuETgARvGoV5l9V9IlSc2H0ZPj3+Oh7RtRCazjph4ZFFWuw?= =?us-ascii?Q?Wp5E1G9BkxjVZkSweOl2pFHw9HJaHQ5SR8YFucBHc0CfwLNaKOQO9CKSj0+U?= =?us-ascii?Q?5NIKhK6CMXvQlKnWm73AZqrZyNrZt1KQDX9GPYm82pCgdoehbsjZxiAfCWag?= =?us-ascii?Q?3hED5BroG1RVbiO7OjCEMajiZ38SlHuZx9dFzpEoubyIf3QWJto0XlpxJOL2?= =?us-ascii?Q?xxB9M4tbm2p1h40Z+kiLPrcLxBO7zmAKmmFOqfEQBWhWgNBjMYQYGIqhku0b?= =?us-ascii?Q?f3Ij42SzEyUurKjoWaLbxWfW4YZ8CPqe1YVGPu0UqO8aSTAXd6/2031F8SIk?= =?us-ascii?Q?9/uhfXFLoMBqMPjGL2A0IQy436ErJzUv3hNFQfOJL5SBEmthw9HCfb9FVOua?= =?us-ascii?Q?anPi+fxGB4jaZ+U+YvIqu9GcEiGFHhnull8hgX+yQXsb3JVe9Of8oYWpE0Cw?= =?us-ascii?Q?/s1LIjkG1FUsXvv1cI0CXWZeP3aCX0I0O22AVG5sCnlBHiijYtwdcABd805y?= =?us-ascii?Q?zvub5JgGvDTujplWLseahCsS/AZMrrDR8SuupUH/Ll8GscQiFH3YkARoEg5N?= =?us-ascii?Q?nhR621hDJNvslA6asiNbAxWv1W9+/OeF4/6QTazLwaS/K59J5tfJF6NV1d3H?= =?us-ascii?Q?xCvDcSUverNyJRuAvcGLKU33sBQUgjUMiA216XfKTV/o4Xp57EAxdnRKcSXX?= =?us-ascii?Q?S0Bly2+bLr3uGShSxPEt3mfCxosCG6KlObgslDKa/FXbfhiOF+WYhCY5Slr0?= =?us-ascii?Q?5vxYjrQn0bLRLw11aT7t2ihF8x+5qERo7LI3sjDJs1l0V6j+/yRyN4Er7WzG?= =?us-ascii?Q?zGpKmfJYc31In1k+qNi0zLxI+yF7u0bopDXPvIKemj4fKdTQaQ3hUytzplXx?= =?us-ascii?Q?RdKDhbcprrJCzimppId3a27+N4cmUIJWNzOdNot7mEjds6nWuqClBvEa99hB?= =?us-ascii?Q?GdRMSg+dtCiD7h5AVRIkLxAAKvCBKmxLhMPdSLtc7gUldkxDebAXlLToOGL0?= =?us-ascii?Q?WTz1zYTnNbaz8SSKzx7eT9hJrqPEnaZ+y4iiGBss7Gki6P05YazVUY4eSKJ8?= =?us-ascii?Q?+LME8D2VRK0MQFcdKsNi5jRonuD3XUQn4u7hLZVb9f28I0Y1sII6y2O4fe4n?= =?us-ascii?Q?JjYx8XcJ/ljeJu7l7ndfmcByGTaHwpL068MMp4UtaWtU4dRo5g1T0PIenN/2?= =?us-ascii?Q?0Qlmco8zMZm5GzYG83gDxm6EfEz1FYAh/0wv2jSRUdSsZjzS6rGBLQuJIC5f?= =?us-ascii?Q?QKdLoNaZSbx/BGyP41zc2RdQ4hkiXOT2c7/mTbERllDL3vF9pi66ipcreyrk?= =?us-ascii?Q?CyiLH4iNcLOKL9iSHUUWFG7/AQ544IZe+L1dCqwOPRmQ33RUsanv4vjBavBs?= =?us-ascii?Q?OC5oSaNQignaFlI5iL7zb9tzlDu8ckxZZ1DU1TlL2F2DagzWQvGb+ymrkh5s?= =?us-ascii?Q?vlVk1R/mn2o3x0HLemvRbI+Ebt6WfIzlu31f8HXVj14AaqFEE9vWb/qZpRA5?= =?us-ascii?Q?yG93Q5XQUoIHNrj7M/EXNZ4nGCp7AFi4Q78ShCKvjKzSMtrWI6an6nY8FyMh?= =?us-ascii?Q?6K4LKBK5hMA2RT82LS+y2NRQ/Ybg+vtPltxsaSCg?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS2PR12MB9567.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(1800799024)(366016)(18082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?vIDgggHQZEjGFb0Vs/LgqraChgxcQXqjEnSU0LqDUM2YU+Qawe53xMkHriAb?= =?us-ascii?Q?XorJqmT5gCYB2k4Q7wGl+TeJzWBxQZDm/4nX9HfrrM5Xybu8pJO5ytvTZTC7?= =?us-ascii?Q?EcflohITD8mXyvcNlX6j8xwvl2aCoo7IN9fMBNM5D3Vf9Yd0hXtJNemhzhcp?= =?us-ascii?Q?KTbQhAjoOO5kQ6bWoq/SHYQlOAeBAZhVKkwPmyN0hkFwj6zMNNaBQu0FCB7b?= =?us-ascii?Q?nb0PQRgy+A4DL11rqkPKGoWE2HQtOewsDSLKJKk2hEWZdw79udMvOvaczeQM?= =?us-ascii?Q?dNN7APOw5XxRQlwhYrFhWVrMzsFQmfuImTn/HWugon32YRjBweBVJEH/lQ/a?= =?us-ascii?Q?nEf2hJVm0mBBrvFdJmpxoYwuk+VL+2xOHD5u3Do2QtCFePE5vei27pNiMHay?= =?us-ascii?Q?DuMtkrox1ZsdRKxlCVu6clYnIq+lkwL10S2CCtQRqQMZWchth9pFESVT20/L?= =?us-ascii?Q?I60bbAJrkVbZ1ggHKeS1G++ZAqZlwWm5GDwqpjo7f3b3VJKKkVyTfbUBqPZH?= =?us-ascii?Q?sh/ozHdExeblxhj3jWyglqoXJuu4io+97FGoswrMAWn5PcRIIUR/AEzuHtcH?= =?us-ascii?Q?LF82fb0JLv17hAcXtsFUjlb3thFekSM4Qz+TeReW/MU/ITWV+8ASH2U6vnpX?= =?us-ascii?Q?Fixu4vR22RBJPTNXUt0Ag5DyGNkUkLj8VL/7CgSNuRLW03bEkuUEgfx+j7lh?= =?us-ascii?Q?FUi9wBsIUoYobTuqfmxLVc4HgQ7Fvcs3QTKjZ52COK+n98VIvEx26TF0GjQL?= =?us-ascii?Q?AihkAO35bsAqmSF5c977j49K76kb2YqnHIrr8a+545u7UBB2dXbm+Jt6bG9k?= =?us-ascii?Q?ly8E2bKGAXqzb5/AZE6OriXqGFWUPK0X5LLMVI7gDamWp85HR+8n/TdMfuI5?= =?us-ascii?Q?goRELCLlqOtpcHKuNomB/eqyFhXIDcpzxP8w5MT/egKPOAUScTq0fLIYZf4l?= =?us-ascii?Q?nV7GDRb787tvFhleFjSquA1l9nKIDIxdLowXW6ooQdzwuwFzvl71fMjD5yiD?= =?us-ascii?Q?fOgqvEDBFBayNMlqeKH4MdBVxXQ7bm2NqUCxElJx5LmohY78S90NwBb/Tbuf?= =?us-ascii?Q?x1Yi7IaBMOVp14rkg2/57pOp8yTS61FcIwIXz8/f9JHDwsE0XlEyQB/wcrU0?= =?us-ascii?Q?TnLIAXc+unggFeD4sStn6ZsY03QjVsTEGslfvZNpPcoWcU5FWamOHAin62cQ?= =?us-ascii?Q?Vzghgb/b7wCEhaob5soUcTZAk0FWwM9o7qe/JOPIiwxNRzEc157qq0OLIBp3?= =?us-ascii?Q?L+4XEjaH5gkhSoz8kkD0OILnG4ZCxo/HU2i2hN4W5fQQMjZ1o7NaVHxF5UKh?= =?us-ascii?Q?yr+mqO2XUj/z5LCZ6o/Bz/G1Y2aYIyXaMPGR/jDAB71fFp9lFa+tlw4RgUqH?= =?us-ascii?Q?+kS3Cmr9jgyg7RIvhkZYEWr54kgecAIzLL0ActQsTz3CbtEjs0XHFvQ3GFh6?= =?us-ascii?Q?YC9eQYVNWjWP7oQ2Dk05S3KnunSAiNQvox7Vrzh/7aRSRMchEqH5M087vorv?= =?us-ascii?Q?/Zbr0hvAWpp6Myqe6dUXroczzye54FI9s/iAQuXebYL+vXyqYAqwu36A+svS?= =?us-ascii?Q?IRvN6fpkmVP+DM1DRHpx5aeWtLueEkh/ZvzhL3CEx2TDT6wlJrxTpkS8/46c?= =?us-ascii?Q?ESMKoipPTpuDwoOzsMPN+z9Qzl6AQu9Z5g1SztA28XD/KXwZis0dJZGeOfNg?= =?us-ascii?Q?w9AWWGRbH+aGOs3L7je6lfwwNy2t/fzukVEd5CD2n98daKR9Nc8a9eLSAfs0?= =?us-ascii?Q?5MOcWNTIlg=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: aa9f66e4-7016-42c4-6a11-08de5569499c X-MS-Exchange-CrossTenant-AuthSource: DS2PR12MB9567.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Jan 2026 01:39:42.9325 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: bKBUyoBi/2h3a+mwNptBNFS2QTLot6HmFqC+pvouieTwnGFbp00qbRkkFG+D8k5H17SCxSFHueZKiCMxkCvWTw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV2PR12MB999097 Message-ID-Hash: CLTAR6MWCN4PGCXT3AFDCFWV6I57DL3F X-Message-ID-Hash: CLTAR6MWCN4PGCXT3AFDCFWV6I57DL3F X-MailFrom: nathanc@nvidia.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: skolothumtho@nvidia.com, nicolinc@nvidia.com, nathanc@nvidia.com, mochs@nvidia.com X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Nathan Chen via Devel Reply-To: Nathan Chen X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1768614280328158500 Content-Type: text/plain; charset="utf-8" From: Nathan Chen Implement the IOMMU_OPTION_RLIMIT_MODE ioctl to set per-process memory accounting for iommufd. This prevents ENOMEM errors from the default per-user memory accounting when multiple VMs under the libvirt-qemu user have their pinned memory summed and checked against a per-process RLIMIT_MEMLOCK limit. Signed-off-by: Nathan Chen --- meson.build | 1 + po/POTFILES | 1 + src/libvirt_private.syms | 3 ++ src/util/meson.build | 1 + src/util/viriommufd.c | 111 +++++++++++++++++++++++++++++++++++++++ src/util/viriommufd.h | 25 +++++++++ 6 files changed, 142 insertions(+) create mode 100644 src/util/viriommufd.c create mode 100644 src/util/viriommufd.h diff --git a/meson.build b/meson.build index 964d1fa4e1..a6db70f13e 100644 --- a/meson.build +++ b/meson.build @@ -732,6 +732,7 @@ headers =3D [ 'ifaddrs.h', 'libtasn1.h', 'linux/kvm.h', + 'linux/iommufd.h', 'mntent.h', 'net/ethernet.h', 'net/if.h', diff --git a/po/POTFILES b/po/POTFILES index f0aad35c8c..c78d2b8000 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -303,6 +303,7 @@ src/util/virhostuptime.c src/util/viridentity.c src/util/virinhibitor.c src/util/virinitctl.c +src/util/viriommufd.c src/util/viriscsi.c src/util/virjson.c src/util/virlease.c diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 6bffd2eb6d..7fa76a1ec3 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2646,6 +2646,9 @@ virInhibitorRelease; virInitctlFifos; virInitctlSetRunLevel; =20 +# util/viriommufd.h +virIOMMUFDSetRLimitMode; + # util/viriscsi.h virISCSIConnectionLogin; virISCSIConnectionLogout; diff --git a/src/util/meson.build b/src/util/meson.build index 4950a795cc..9fb0aa0fe7 100644 --- a/src/util/meson.build +++ b/src/util/meson.build @@ -46,6 +46,7 @@ util_sources =3D [ 'viridentity.c', 'virinhibitor.c', 'virinitctl.c', + 'viriommufd.c', 'viriscsi.c', 'virjson.c', 'virkeycode.c', diff --git a/src/util/viriommufd.c b/src/util/viriommufd.c new file mode 100644 index 0000000000..225c76f4b2 --- /dev/null +++ b/src/util/viriommufd.c @@ -0,0 +1,111 @@ +#include + +#include "viriommufd.h" +#include "virlog.h" +#include "virerror.h" +#include "virfile.h" + +#ifdef __linux__ + +# include +# include + +# ifdef HAVE_LINUX_IOMMUFD_H +# include +# endif + +# define VIR_FROM_THIS VIR_FROM_NONE + +VIR_LOG_INIT("util.iommufd"); + +# ifndef IOMMU_OPTION + +enum iommufd_option { + IOMMU_OPTION_RLIMIT_MODE =3D 0, + IOMMU_OPTION_HUGE_PAGES =3D 1, +}; + +enum iommufd_option_ops { + IOMMU_OPTION_OP_SET =3D 0, + IOMMU_OPTION_OP_GET =3D 1, +}; + +struct iommu_option { + __u32 size; + __u32 option_id; + __u16 op; + __u16 __reserved; + __u32 object_id; + __aligned_u64 val64; +}; + +# define IOMMUFD_TYPE (';') +# define IOMMUFD_CMD_OPTION 0x87 +# define IOMMU_OPTION _IO(IOMMUFD_TYPE, IOMMUFD_CMD_OPTION) + +# endif + +/** + * virIOMMUFDSetRLimitMode: + * @fd: iommufd file descriptor + * @processAccounting: true for per-process, false for per-user + * + * Set RLIMIT_MEMLOCK accounting mode for the iommufd. + * + * Returns: 0 on success, -1 on error + */ +int +virIOMMUFDSetRLimitMode(int fd, bool processAccounting) +{ + struct iommu_option option =3D { + .size =3D sizeof(struct iommu_option), + .option_id =3D IOMMU_OPTION_RLIMIT_MODE, + .op =3D IOMMU_OPTION_OP_SET, + .__reserved =3D 0, + .object_id =3D 0, + .val64 =3D processAccounting ? 1 : 0, + }; + + if (ioctl(fd, IOMMU_OPTION, &option) < 0) { + switch (errno) { + case ENOTTY: + VIR_WARN("IOMMU_OPTION ioctl not supported"); + return 0; + + case EOPNOTSUPP: + VIR_WARN("IOMMU_OPTION_RLIMIT_MODE not supported by kernel= "); + return 0; + + case EINVAL: + virReportSystemError(errno, "%s", + _("invalid iommufd option parameters"= )); + return -1; + + case EPERM: + VIR_WARN("Permission denied for IOMMU_OPTION ioctl. " + "Per-user-based memory accounting to be used by d= efault."); + return 0; + + default: + virReportSystemError(errno, "%s", + _("failed to set iommufd option")); + return -1; + } + } + + VIR_DEBUG("Set iommufd rlimit mode to %s-based accounting", + processAccounting ? "process" : "user"); + return 0; +} + +#else + +int virIOMMUFDSetRLimitMode(int fd G_GNUC_UNUSED, + bool processAccounting G_GNUC_UNUSED) +{ + virReportError(VIR_ERR_NO_SUPPORT, "%s", + _("IOMMUFD is not supported on this platform")); + return -1; +} + +#endif diff --git a/src/util/viriommufd.h b/src/util/viriommufd.h new file mode 100644 index 0000000000..ebecfe3633 --- /dev/null +++ b/src/util/viriommufd.h @@ -0,0 +1,25 @@ +/* + * viriommufd.h: iommufd helpers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ + +#pragma once + +#include "internal.h" + +#define VIR_IOMMU_DEV_PATH "/dev/iommu" + +int virIOMMUFDSetRLimitMode(int fd, bool processAccounting); --=20 2.43.0