From nobody Mon Feb 2 07:28:47 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; 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 1769799840705345.74257896851134; Fri, 30 Jan 2026 11:04:00 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id DB206419AB; Fri, 30 Jan 2026 14:03:59 -0500 (EST) Received: from [172.19.199.6] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 4D86A43DBD; Fri, 30 Jan 2026 13:59:42 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id 511CF3F870; Fri, 30 Jan 2026 13:59:29 -0500 (EST) Received: from MW6PR02CU001.outbound.protection.outlook.com (mail-westus2azon11012032.outbound.protection.outlook.com [52.101.48.32]) (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 9A18C3F89E for ; Fri, 30 Jan 2026 13:59:28 -0500 (EST) Received: from DS2PR12MB9567.namprd12.prod.outlook.com (2603:10b6:8:27c::8) by SN7PR12MB7106.namprd12.prod.outlook.com (2603:10b6:806:2a1::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.7; Fri, 30 Jan 2026 18:59:24 +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.9564.008; Fri, 30 Jan 2026 18:59:24 +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=LIhfF6VXnV+ehrv9JN5SxxO/gRsjKzJoRBai8fge9i1mSC4BV6Z19x+IrwXw7ap5+r8f47weMsoJvzdkd6eMaSKOvowWGh41k5E18htIQhtxtLL4ErQesqsm9N6HNni29aT9XSxu5z8kdG9FyTdJrU6Jc9WF/l4lwN6FHpz04DinjxWwRvP/x7gzyNUlukYOtHIAzrkzxst173l3jAm39SN9jlN1b+zBXUiFwic+La2bbnGZNSj58K7BCiuRtMGKeJ3qYtZPH9K0iSBVzJEWZy5Q9S9yqznmJQCq/D2eUMtvr0Sy+hE9JAfq9E3zis0baQCCeoFxSOfbGk8OzEXHgQ== 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=3IKMnaRCdmDLYVxcnQb5AjCYEh8ZsmBxYRFXqd3bnTU=; b=q6DHie44qUYZpyBJoDs4C2nM8BCd8Y/94K07Np8gNbPcmt2+m94rb0Y0fVJ/6YjTtVv2OnWDhLN4nD4XlA1vlv7Iy4RtAVtDrWaWpo1o+8rvLEpL9a2a8rQ0IfTZ0u9zr5SEgtB4PkdV+sB7+MMtqMK1blaAna1Rx2FOOfpkrt0jjmGfN9Oa8nbY3WBYsJg+90lUhUSA0oiKpPnUvbVXxRksZh3Wk/45kGWXDvF1/+2B9YeUtC6r5Ghh5+ndHuo68hiYijIbqY3em0ZLc5w6AkYNWQ8G9HJfVR4RwcU380HLYogCDtQpJcyecpgABS32lrly7f16FnD5HmSnJYnYhQ== 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=3IKMnaRCdmDLYVxcnQb5AjCYEh8ZsmBxYRFXqd3bnTU=; b=HM6cYlsjpsCJ9WjlldsiLIquPEW1Vf7NNgBS5cejSSPriB7EMlyEF9D0A6beg6a12DSKFJFJd9GUoSyertabAqnZqe9QyrHAmrFMiSZoLCAxRcIrttjJsHoWg9DTCP76W45qopajgLyr8GzuYsu0ZxpB4Wlo1Rzyvt1I4ECJwMjAiG1kGv12lC9GiOdnOtmNuKdCpYYC9dMZckNyCDo/NzIl6hPG+nnORhEHnMU+W95+aTNwCE2AvzRvkoEIJ1/1cW6s0WbrMbVHdrEemLoEjJ5aVux1shtu4NJ9e2JoOXzLnqjvEZJHzifDesxKs7uCSDlfkRxhthaskcVIPWw2TA== 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 v6 3/7] qemu: Support per-process memory accounting for iommufd Date: Fri, 30 Jan 2026 10:59:14 -0800 Message-ID: <20260130185918.4154310-4-nathanc@nvidia.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260130185918.4154310-1-nathanc@nvidia.com> References: <20260130185918.4154310-1-nathanc@nvidia.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BYAPR05CA0067.namprd05.prod.outlook.com (2603:10b6:a03:74::44) To DS2PR12MB9567.namprd12.prod.outlook.com (2603:10b6:8:27c::8) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS2PR12MB9567:EE_|SN7PR12MB7106:EE_ X-MS-Office365-Filtering-Correlation-Id: b0012a02-eb85-4228-b473-08de6031aec0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014|18082099003; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?QeRcN0mo7ccKPQzgu4JSrD4phYzgMtr6ES9Hf+fdKP6z8qKutN8TOmMrFXC+?= =?us-ascii?Q?EjYZoeFLTwMreJbYmJl1p1IC5l6aIELZUJpjT3drd7S3bR1Dzd4IhndGNyNH?= =?us-ascii?Q?6JoyqEWdW2e9AnsDFKNDohiaVoQUA6w0bECeKR2L52W3jvEROct1ffgXOZJj?= =?us-ascii?Q?N3F3mWJj5ns/E1agGiciteXW8kZtxAOd0ld6RYCpz3MsLSGh0j8uTPgB4/Sl?= =?us-ascii?Q?op3N2PIDJXn0BltV/gauAwC2sN5+YHRvbVDn/Osk26MnezLxDP+pdJI5GKS/?= =?us-ascii?Q?5GJ1RsCmSnJ/5ZtxMQOxqqYdD0Db9VSAcnf1ECACEMDptAy9FDL/jQHD42bs?= =?us-ascii?Q?LfdV/ICGHiJC+YegT84CfmBZhr2yo70ahR7XuNIqWgAjy0WQvIc9/ScI6xg8?= =?us-ascii?Q?Xv6EoYbdsFQr0xU085tT+DS9JDbAPKTQ2LmY/C7QitjbMa3URfqLlWm5jcKz?= =?us-ascii?Q?WOhr61QuFwh1ZNyKsE5ypy9DvdQRx6pOt6Pl0c2+/t8D7DX5ljun6XUBZeMC?= =?us-ascii?Q?ipYFqNHmEYXpwbiEHM+zWU3MSdn5GVFvEISCG9WAYzOhQ0kfUDHEUmglKQch?= =?us-ascii?Q?8UXkzmdbAiY1BoX1glbyNDs6g1mSup8gYKhKqtMakAJ8kRqQvuRbKqeCNDK0?= =?us-ascii?Q?FAD23NQTjNjnd51zmEMBxM87yCCHoHg69qwS/zqdxj1XfCGKoOqhTZm2Mcm/?= =?us-ascii?Q?ipuvSP+b22yqbZDA1rtryZhAk/XC1sY0814NIySaGUDCaauOKU6+XaTwlq5n?= =?us-ascii?Q?vLoqDIgd0X2yVF7KFPmG0BvXNcdUClzPNBtdgQeOIFFnb44FgdAraKoN6Ixh?= =?us-ascii?Q?hRKeDAdbare/P1f9IU3ocm9i2mTfrz+hWGQFdw5gCaHN90JsShErcSAA5k0Z?= =?us-ascii?Q?X9cDylfKtwz3U3mQ8auEFK8AmKDQ5c3JWLpaNrXYe7WqKDSAFcVeBCz0wg3R?= =?us-ascii?Q?CQdJt/MYgPQfY4MbIDtmMtoxfEddoh6/kZHiry5dmenU1F0Uh2PPl1DsQZw0?= =?us-ascii?Q?PpIglPuyuKSFJOa6eGPZ+AvrE/MnNUfC+w6Oa2PdCSxwkWwKS29u8wp3jUSY?= =?us-ascii?Q?PiWGZK33R/Ly19cs35RovocDXlVa0ceMe/hhl56EUuo3OS3yY46VaqIo0T+7?= =?us-ascii?Q?W5r/lGnv1lstAKzXXoArUK6gvwdxuqrZaZX5SqaCWd9s4d/cdDit4ivw1daF?= =?us-ascii?Q?6kjVlYkgm5D5w9AtNqBObfmcPqMoHuaZGP8+TJihvJ3xVj0pLd29jIJMr7vs?= =?us-ascii?Q?6gO9LZcP6Cs5gKGDi6TL4m65tOLCt+YolqMoT05iQ8dUFUmSSYbd9TSqB2/4?= =?us-ascii?Q?XeVTS2Ev5tTE0R1KS5e0/BW4xPVT5gfS8dgGFPnihJxJ9ahSJrK4XC8B7rrX?= =?us-ascii?Q?eXIUU6HH+5/rmgtbftSY4UKr3eS8k4anzKI8ZE/76l/DjsaTIQQG6IoikHyv?= =?us-ascii?Q?eTz4RVWIl0pkO0MA+Tld0v3Zoxsz6b/hWLwaZ3PIdUC3kZG5G+VHeLKcReSV?= =?us-ascii?Q?vkMLr04IXqDZhHxSkeaEVjkSfJvglQ3R9Dh/si21n00hK4uEZwF0wnDSXiXE?= =?us-ascii?Q?PuO2mAXkoIA+25pyKAZ8MonbMnKJ9IL1vOQwPjv0?= 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)(366016)(1800799024)(376014)(18082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?pDzyOzifMRvaVEFHhB84sNu/zcyW6ASo3Ox+LRav9BUKHkXUp9+LZYxuRw8A?= =?us-ascii?Q?BZPud9V0JBchIKQ9BkoVdHsCL6D0RsokUfs+rk6J29aAiUfkaHb+HNAL1O66?= =?us-ascii?Q?J7pHEmqxJM3eRLE92O/bcDsAh+ES1i7H3R32KuG2T5jI00DXPHpjGG26BAM6?= =?us-ascii?Q?KwUwnxV0ep+Kjf+H63OxIg4kf7JzWkwDNKKqw1yQ8Wnc9ZztlIvbC7DZYmTf?= =?us-ascii?Q?0/JaSV66VsRqgXJmCjKCvSdViM0+Fu1QKO0sAOTWuFoO0IyDOSG6NmT+gkdF?= =?us-ascii?Q?r947gtTqPNVLfvdxiZo7/IAud9A8YfQDQB5CilY79/Tb//q2S9+ToPalZ09M?= =?us-ascii?Q?/KzkPP+6EwKs6bzt49qmDZqnVpSQYM7fNVlo9l/yS/Sw5m49j1M+WbB1VP+B?= =?us-ascii?Q?pvu5iCY39awb+tH7VE/zYSUlFPEzcAjF6rrTHgpppW+QeXaZQUEeqysythJq?= =?us-ascii?Q?xsXl+XX4GHlnKLiChkxnl20bAKub+xDaJPERtIFTMZU+Qpuuwf0+tvyxuoI8?= =?us-ascii?Q?Yme3mN+2BF+nM1IgnwZkATxPLo52HbeYFb8lAnCMRnihUwrRlYAtyOQ9xQfX?= =?us-ascii?Q?lrvxJqS7lmFdJg6hE7K28ObApP31VGelc3WJBk7fKoT70TYXh7MNp/aXL3w0?= =?us-ascii?Q?AyCWkZScgUyvn+XUOZ0VE5h+dJ5vLzIBVtrzLiFp0dXFBIgxrHJRjm8bkIVG?= =?us-ascii?Q?5RzRRZ2TLEoZn68DbkmnM9mXdSvwkc0zG/6geWnyLehjdHpj9t3mANIHMC13?= =?us-ascii?Q?QOGoLgRoL3PpRed5DZAsIigb9PXgvLDMVowlZycuEE4i2dbrEX4kjbv1TL4X?= =?us-ascii?Q?WhBKPmYy4omrnd32iOuQYuNaCs4WaMpMPKvM0GLXGkh/sG0d/p0hjcKXvC6T?= =?us-ascii?Q?vx4+49fQRlyJyo/aPDegCUGH8deJB5kHCT1/GVQ0dctm80v5ia/9PwmRJNG3?= =?us-ascii?Q?Ahnz+7399dWEJIoc1faYlpdufsFt3qHkbGfWsjMd61p70h5fTrdzhT+vmtrq?= =?us-ascii?Q?YOvBpMQbLVVF+1TyIBySg9cFIjtMkHyojtFFJPO8ZDFXMpqFN8RUOdHqhZYx?= =?us-ascii?Q?Y5ngnqEgI96yIOm7kpTGcQq2NNCyiYl/hTsohgqcRWM33YP59KEJVi/oujzc?= =?us-ascii?Q?kpu03nnU46dMqeIt8jdlVaJ8jozuOeC1pn5Me0supI2hpbeuNOBxITzBLdBE?= =?us-ascii?Q?tP7Va3LkpkUMUo/XydluagFJW/j7SrZhcSCnzjEsbmVj0Vfuli7aGLxwECyk?= =?us-ascii?Q?sO5TrdnYOZuMohZTXkH6Jdhd0pRCnxL8Njb+MZOVphO5PlXv3VSQAQN7sm/1?= =?us-ascii?Q?A0C/S68ifcvXFPhSEM1u3+Y9ncQgCNQEqePsu91vzbs/Cn+OpwdrgoSlqe+h?= =?us-ascii?Q?mMl+tXR5+YJqVBHKyOzJ5W7ZLPhg3Doll+OSYs418ss3udaSNovKK3VynL3T?= =?us-ascii?Q?GB8tbto01zV4e4nq437ZDfawZqFTkMIMLPUjVWGEVZ+pLzdzvd9ZU+IPnF/e?= =?us-ascii?Q?nOTbRU1lMHETmhr9ojf0N3+lM8cDnsuitBBy3P9mwSQk9DDXol/fnANhCSSh?= =?us-ascii?Q?C8orTztjPiJzreo87AEMdulB7lLTDSm82BItEc6d7mzjX+79SkLHhLfedatf?= =?us-ascii?Q?L7hsvwPB+wRggMlF17POCL82a0fjzaF0U0WEgGMM8v8quFueVcHe/c7KfaxI?= =?us-ascii?Q?33BN/VJqAMqbU5DKXEI6qRiwAnWDD1p6Hcc/0djHvsSATSaadK8kvPfJnbFD?= =?us-ascii?Q?gfqZbQRFyQ=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: b0012a02-eb85-4228-b473-08de6031aec0 X-MS-Exchange-CrossTenant-AuthSource: DS2PR12MB9567.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jan 2026 18:59:23.6460 (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: KLQBo2KftQ7FI/6vq7eEfnoL56n+aNnDjJobn03nJB02ILq0nGQjZnptLormY20+RyMtWIjBOpMidRgFzbepyQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR12MB7106 Message-ID-Hash: C7772ASNRQQBWYL5F7IBHDCNQ5R36SCN X-Message-ID-Hash: C7772ASNRQQBWYL5F7IBHDCNQ5R36SCN 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: 1769799842258158500 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..b44bc8ed1d --- /dev/null +++ b/src/util/viriommufd.c @@ -0,0 +1,111 @@ +#include + +#include "viriommufd.h" +#include "virlog.h" +#include "virerror.h" +#include "virfile.h" + +#define VIR_FROM_THIS VIR_FROM_NONE + +VIR_LOG_INIT("util.iommufd"); + +#ifdef __linux__ + +# include +# include + +# ifdef HAVE_LINUX_IOMMUFD_H +# include +# endif + +# 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 -1; + + case EOPNOTSUPP: + VIR_WARN("IOMMU_OPTION_RLIMIT_MODE not supported by kernel= "); + return -1; + + 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 -1; + + 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