From nobody Fri Jan 9 23:17:25 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 1767754530893937.3071375595075; Tue, 6 Jan 2026 18:55:30 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id D809841BA2; Tue, 6 Jan 2026 21:55:29 -0500 (EST) Received: from [172.19.199.83] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id A6C8F43EAD; Tue, 6 Jan 2026 21:50:18 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id 445D541B50; Tue, 6 Jan 2026 21:49:51 -0500 (EST) Received: from SN4PR2101CU001.outbound.protection.outlook.com (mail-southcentralusazon11012048.outbound.protection.outlook.com [40.93.195.48]) (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 34AE641B72 for ; Tue, 6 Jan 2026 21:49:44 -0500 (EST) Received: from SN7PR12MB6838.namprd12.prod.outlook.com (2603:10b6:806:266::18) by SN7PR12MB7977.namprd12.prod.outlook.com (2603:10b6:806:340::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9478.4; Wed, 7 Jan 2026 02:49:42 +0000 Received: from SN7PR12MB6838.namprd12.prod.outlook.com ([fe80::69ae:2df4:372b:6fbc]) by SN7PR12MB6838.namprd12.prod.outlook.com ([fe80::69ae:2df4:372b:6fbc%7]) with mapi id 15.20.9499.002; Wed, 7 Jan 2026 02:49: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=-5.0 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_INVALID,DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, 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=fpxp60WEG+mISk4/vnDcBcUNcUY38KeqrZue9sQWctxqapH5ZV+jVyqv4FPjSjhphULYj/NSwCjNYdF0usUlG9rRjGj0h1GGGd422J8BpK5W54L9VXH69KxMu/8FxHTKleVlVkg+WMCT3eB+iXEIS7PB3qQvq+xa5eFZFvcAXlSDpYl2psuxEgMbpnHUYsEOl+cTyl77l17b9odTGWyglY+upygguPk/3MnV6Vo5Rgs3OMjUqNJf4JoQ1cM11O6nVgd8p+eRDOv9OZAOeqAQSnjDkl9SPAM2poPUbN6lhOzhVN2nrUu6iL1CTclmltpthGg1V01vrTE+7MYJc5B6cQ== 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=4XEtfusprL7mfcov4IKWFeZ3Jz7siH+CERcBaa7xdTg=; b=W7Zs0Ky8rXX0o3jw8HK2cSeA1yxL0LO5eqBVMAAdx2kP0aHYVejV0EYzqondm3rqcXRG+aI8tjhDji1IhXeaFOABwdZm0byWgl6A4/Y6sq6yBI3a15HcIwCW3B4csOEbDPTsqWN2g8l6FQPdDbem6LIpiRKLEvtxIkrFhF7V3v+Fj0v5WWHOAfmlopOBaO6+pbgCLxOGp4Lvg1DeowacjzR6t1tfo1acEmuIb8lC95GSN29Dutx5suPXfF4y4qxmkvtxk7YXKdEnZ6sYFIBhPHELbSEOVgcYQYjQARPeYr95dVSxpzNkdFOw/dOkA87k5031JhNVRwe7bc1kkCHvEg== 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=4XEtfusprL7mfcov4IKWFeZ3Jz7siH+CERcBaa7xdTg=; b=fsFQDaB3E8OheGf4gWCn9ZBlzGr5qcJWvZ5cerMSMX0wj+IvL4e4cqkJT+Rcx4fYlgtfHm19A8RNtunkXrl8i8Oj+0w6Oaa8ZAb9tRgtNGsMbrjHoXOyU2sUZHoZNUK0SvqBkwEzT6uS+/7yiNAfvyNkTSekC8ao8LKOJLL1IDz/DSkOrP+zxJ3qxHWbAz7C3aLyxbhd/V5S4YPfc9PE+P934JINZ90CrkCwy24LZyfxZc21a8lCxp6nq/eetH1opK0LITJqtts/D5Z2L3oycOdUuktkU8ONl4J3kjeVvC6oT5Rc/M6RoqqkVCycWbR6mp7F6CybLHAERCvyqP8haQ== 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 v4 3/7] qemu: Set per-process memory accounting for iommufd Date: Tue, 6 Jan 2026 18:49:34 -0800 Message-ID: <20260107024938.461794-4-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260107024938.461794-1-nathanc@nvidia.com> References: <20260107024938.461794-1-nathanc@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0136.namprd03.prod.outlook.com (2603:10b6:a03:33c::21) To SN7PR12MB6838.namprd12.prod.outlook.com (2603:10b6:806:266::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN7PR12MB6838:EE_|SN7PR12MB7977:EE_ X-MS-Office365-Filtering-Correlation-Id: 9d076b03-e708-4f74-b9f1-08de4d97687c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|1800799024|366016; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?yQ2+dL6+HWCF15rVPho1sq7ZlB93reyRUe6P0Qa54Gq8uO33eSKHhfxe6xoH?= =?us-ascii?Q?8dwgwKeJNbgSlHzdDdE1gZ4HdPPatIbdQROsPE3yETfqc8y0obdMuZugBuwR?= =?us-ascii?Q?uLOhzXDngi/9l7G4rioY9w6nM8Ce0aRwRilq4uyx8ExUOiUQfatD35FaoZwY?= =?us-ascii?Q?74D5KObwsL/CDekKIREzJ9ENiDZB2PEAb0gt/3ttUS/x0Nh+kpbAwcAyaLYO?= =?us-ascii?Q?46ZlQ3QL60sbH/Nn2UP4PWpQlxQ9AD5jwqH+xC+PSx6GdSJ7mVN8YMNT83Jz?= =?us-ascii?Q?SE+bDK4HXtb3X4sDbSHtWP+ZiiNKDRL74gdFQTgUx1uIsAHbTWbrUHbVg7/P?= =?us-ascii?Q?2RceToFQAV8Lk++F7tJZfdA0JfkxkO0AaahLy9Tq6rQa7fs5VRNPSywkhPT+?= =?us-ascii?Q?FW71w0Ffp9Y4rFuNjOU3bT38h2y5fdHwrf+I+My46Nsdv4fO7nIDHQKaQT2A?= =?us-ascii?Q?mr810TE8EDG52h0xleXkm+Dd8sLNEXtTLY7VYHQJq0rC1vlnnuiaHHUfLk/s?= =?us-ascii?Q?QqGYBhyo9IHgmpEpwIUhNoEJNxn9N7nVk023rAlz29afnFKeg2NRqP6FgGaZ?= =?us-ascii?Q?U3YaRXuP4e/35M7qwai5z+Dm3YCocZQktYEVYaWLetHCUt7C90MHrixisTi9?= =?us-ascii?Q?QA1WMiYhmZfSXC0oFKzhA4qys8bAe85GWQUxQhn+wO/nhHEDbGrQF02aThxo?= =?us-ascii?Q?2ixDrDUDoBGTWAA2qj5cg6abIMN3ylcgHc48kdhRQD+xkN+CFwz50TB1HBAA?= =?us-ascii?Q?0kAJfbj2XFIpF/fRQ8vuuUU905viL1+0limLvgIczrFSiL12scZAl1ILvQQg?= =?us-ascii?Q?yz4Q1bmh7Xy1LSbqvpTMuxtCZCocieODOTyH3DlOk6hanJMYd726UByW50P9?= =?us-ascii?Q?8XjagFHRAA43oOS04gl6xry1HzFumpBtzCLgDZmHmpfuRn9LnTmq19RIGhwy?= =?us-ascii?Q?g+VCHc4E4vBHzLHG9DCyFPej4raSRvCTieulRK3bVsqNp6Z/SG2CO1H7cmdD?= =?us-ascii?Q?LHsSiePhQcihjHu/1irSRBZ8noB9lUiY1cbkHn8ubZLxDs95nQLX0SD3ciGp?= =?us-ascii?Q?WxkgVk57dN5ciR4J6eSWvj6JyBJwLaXUFqURd2Jfqdpa8kAYO08AgytalSY6?= =?us-ascii?Q?pGBTRSo/B3DvvV9PxsLJaBI9fUYfBZRtzZSzrWQY3KxxSK9jM1tg56Fkdpui?= =?us-ascii?Q?5U+s5a/YJb30AnD4KtQxYFi3XZ9DkLr1Lg2u8Qy1FpaoTwQ+0JxtvQICdGg/?= =?us-ascii?Q?YJGKdiDJFNVnEc488nwgPYrHxtzAVOOfjCYvKPNo/62MzJruBRpTrWu7TFC4?= =?us-ascii?Q?daF2pmaBUlKWDIjAiQ7Ejs0xYQzlAyi5BMCVblF9jwt8o9WZhMKqDgL5al4n?= =?us-ascii?Q?tTNqa/KTJ2x4/Fua1Tviogv0OU9i9iK/5kf60DYjdutnyNanrDCRCgAezF0i?= =?us-ascii?Q?hATaqONTfMszfkEfzUhK2kZy+2E9kLmM4l2P1X9s/R7v61I92sfDCw=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SN7PR12MB6838.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(1800799024)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?44SDJvknqSD0YcpUsGKkJ/ND3RkGHOQo2FCPcw0H95qb+sNFyy0UNrj+sTi8?= =?us-ascii?Q?P19BCntzGqO1H9eHZmpWvi/PUyfLlMFFf3LpQnpgL97VOX04LiN/JGLzcr17?= =?us-ascii?Q?AGfTJHXxsbRjM3aQK2wTIQBp8+Rjg7fOmcJKpiv6dmyIMdXl25zKkECqkG3r?= =?us-ascii?Q?aLI5R7vWMy5LPnXJyvDXZnznSGS2SdF+6kfFOrdDVji98uONMfHBHwCbEsEo?= =?us-ascii?Q?mPDztDeK+M2Tmood00xOdJDuJ8I8Ta5vr/rk3wmoQ00OS+arqoZVVGwx4jdG?= =?us-ascii?Q?d17ieZd1eTMHil2p2gPVd72w5PEd8eXJzFIUAswy4yytjGKFoZ5azb4uilL1?= =?us-ascii?Q?nwmDWtQHtSw7L8BqBg3zXjd8a3Yx0C8ytCYFFV13S6RdW29Itjqg7Kty/Es/?= =?us-ascii?Q?fbyAQUT/UXUyR80R9c9dlR/WApBLKdxWZEN/oAtRxkGy4jb4riXR9qGsHs3r?= =?us-ascii?Q?5233jlijSRkNW8IMoN0kkhzkBhUM8hLtSX4STYB4LGU9ezUMq/6r82bzHv+1?= =?us-ascii?Q?IbxekeS8TUa86ZA40R/hEMMEVH5vryfwlzktKkIdFu6INbbE9rWj5CypZLrp?= =?us-ascii?Q?FDyYhZD4dYNPdeQZhtSk7LNmDn8s8TIQ7mV9WfSVlNQ840jHSYsh+7zp6qKf?= =?us-ascii?Q?5lx4olChNv8KOUBIZLky1tTsCjpi1Skr1Ox6gESARipKdKROTjQeiPqr0lQh?= =?us-ascii?Q?nfwJgRLUvYxjs+kv4GX68l0YXHprHkI5KJ3kMLiP2s4OQBGDw2jVPrLfbUbW?= =?us-ascii?Q?wUDvZSJz1zTKe7t0YadFOZS0oruJ+6viCcULSJ6gy86/ytWvWYCryuhPOj0T?= =?us-ascii?Q?fDvNshwUyZwWyLHpqwSiqpGZ9WDzXUYiGM66D4m7jPTzczBoW0gDFPFE1oeL?= =?us-ascii?Q?6Z8AQ4ExrGEj/jrLjUT8FdGypgjD2SCqntImElEVmVyIRdpiCcSio1rklSie?= =?us-ascii?Q?IVrnH1/Srz/y2C83mmzUQ3KjwFFH73Ck8qPUXJzT3k9savlmkmgJg8F/X1lh?= =?us-ascii?Q?KzJVthilMcQ/zisLkHl+VTG+ORciHGG31E3omyo8NC90jNUCl6Wx4gE/hgXO?= =?us-ascii?Q?ebbJblPRSXJvD8fJt3x2ztwK/CGWEh3wojiet03X2yMFCcjAM/OvsslJCLLi?= =?us-ascii?Q?VNSaWAv9rJ0BSbzWwawlZFXYGTLTXKnEszbjfFuAgV7XLU+ufaS6zh4Fu1Nm?= =?us-ascii?Q?2r0uKa38H65/lZ+PhoPs0a6dxn2pK7ZIySkUIo3DcvfXRX9x7SeFYB4xX/mn?= =?us-ascii?Q?hSGUtYGYmIvIx/8GgpFkVD8hHafiDyLj+fjO9qDd/jeE0NVX2Sp+v30my9NW?= =?us-ascii?Q?FdTpCV6BIb8PQ9gnOpNLI/Clfv+xbH2y2kqYg+NRrbSqkC8DIAOEvDih31um?= =?us-ascii?Q?2FABjFZ4iplfwOLnBfMuT/pSEBZXeYJar7NhzLySf8V5oHqg7ms6m1cSLomc?= =?us-ascii?Q?hCBU1OElx1gkLJI27aqiX3I9IPz0Z5uc9bVfZmEUtG11B7ugf/xaB6aHj72P?= =?us-ascii?Q?E+5Cm8GGetfOlwMsqMXSMbtPctEEORX2W8M902mZ2v7TyqcbrRk+Pogav4DJ?= =?us-ascii?Q?gXbjjFjabPffnwy/Npp7zY80VBONHtL+DBiAotJQn5Lfvi+GbktNeYyGie9V?= =?us-ascii?Q?i2c0b98LOOjBsiJI4DDiy1XtryvrvvaJm5o7tAICrzoUvYs2YUyydc9s2qQU?= =?us-ascii?Q?HUjr4w5Mlz/S/5+uQ1sqKkBSsbsEGJPQ7RQ50wJF+FQO2r4vLIMm+UmjLk7P?= =?us-ascii?Q?pqE1zH8N1Q=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9d076b03-e708-4f74-b9f1-08de4d97687c X-MS-Exchange-CrossTenant-AuthSource: SN7PR12MB6838.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jan 2026 02:49:42.2469 (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: x9XkuRf/+PjTCmvMkWbNvbRgHP73HpgjjsZlnrs/1wHn4jXl+IMQZC07jbpnpaAAjHpoIhkTUZn8ju2W8/YqLw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR12MB7977 Message-ID-Hash: H36IH7DQVOIIIAOCD7SG5XHGDOMPU3LY X-Message-ID-Hash: H36IH7DQVOIIIAOCD7SG5XHGDOMPU3LY 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: 1767754532116158500 Content-Type: text/plain; charset="utf-8" From: Nathan Chen Integrate and use 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 --- po/POTFILES | 1 + src/libvirt_private.syms | 4 ++ src/util/meson.build | 1 + src/util/viriommufd.c | 127 +++++++++++++++++++++++++++++++++++++++ src/util/viriommufd.h | 27 +++++++++ 5 files changed, 160 insertions(+) create mode 100644 src/util/viriommufd.c create mode 100644 src/util/viriommufd.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 4e57e4a8f6..a8eadbfb8a 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2652,6 +2652,10 @@ virInhibitorRelease; virInitctlFifos; virInitctlSetRunLevel; =20 +# util/viriommufd.h +virIOMMUFDSetRLimitMode; +virIOMMUFDSupported; + # 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..0f87f95330 --- /dev/null +++ b/src/util/viriommufd.c @@ -0,0 +1,127 @@ +#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; +} + +/** + * virIOMMUFDSupported: Check for presence of /dev/iommu on host. + * + * Returns true if the file exists and false if it does not. + */ +bool +virIOMMUFDSupported(void) +{ + return virFileExists(VIR_IOMMU_DEV_PATH); +} + +#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; +} + +bool virIOMMUFDSupported(void) +{ + return false; +} + +#endif diff --git a/src/util/viriommufd.h b/src/util/viriommufd.h new file mode 100644 index 0000000000..ec6be9fa66 --- /dev/null +++ b/src/util/viriommufd.h @@ -0,0 +1,27 @@ +/* + * 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); + +bool virIOMMUFDSupported(void); --=20 2.43.0