From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3CC662FE06D for ; Tue, 2 Dec 2025 23:03:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764716597; cv=none; b=lLuw+Gr5qg+Wlb74ZMDx8kOrmxmR9vILboXXvBhsQTNziK+WcWHDHaemH8QEqk7mlyNOBXKnKQ8g9kmikLxuzY3pMamfiaYStoFYvmU3k2H1QRofwsE+hAaHfWQfjGCZqkAiKxMTrjD8FHBVdoAYT7rlbrO2jXf3szjKlT77sk8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764716597; c=relaxed/simple; bh=ULbb7w3/DoJS6C3vS82w8RNd+7RiFjPM1CAt3aUcOeI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=OzeoGv4DG/dGssgliPi1rSm2z7HvgtL0f5un4JTzvadWogDXjsJHf/j6SLHux+joVaCuoHmNa7DLsm1+3u17v/iuZsuUr2tBCZ0BPCzq6TkGpqzbOlFN3obgNqm4KzlcFiJ5vIuA6lUGJJCGgIy7qKXv5DUo1KXc86wdMDoG/m8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--skhawaja.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=VpV07v8M; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--skhawaja.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="VpV07v8M" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-340ad9349b3so9414971a91.1 for ; Tue, 02 Dec 2025 15:03:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1764716596; x=1765321396; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=aTpVIxhw3gSn/J7xlrm22d5yrRXDXGIS3cf2bBwoQ4c=; b=VpV07v8MrWCSzzk+ebOy/kxD86jua+GEvLcqK4QQB7u/AioN6ylB9ekRRxyT7ygPyf piB3q0nxmF2x+enDO1ePLFQ16ORLwq2eBY3xoFT61127aRFqWxuMKOEwG1ZWJBKokjWW tntPspietuYuybJ7/luekWdqhxr36R0QvxX6/8VF89y/v1rF87BWI0u3kwp2a3gGarwZ KovPQo5iZCnT7M3n31eWL0qD+uAHC0DuNgB4Z/+xdPRAQvBNUg3brOyhzQQMNLwUTTXc I/r0MlIvlqu7Y6JHEIUe2UVgBrCmmXQCPPdM6aQA2mybCj1jENWnlfaDHsuKu3k2BleV pX5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764716596; x=1765321396; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=aTpVIxhw3gSn/J7xlrm22d5yrRXDXGIS3cf2bBwoQ4c=; b=RApCqSGdZb+RuoBHI1uZn/I077LCwykiUYSlWlfDH73WsK6GexwQL0jG0z2D5foCpy eblLRJ7Uz11XcSBSzdhisSIla/xJd8VGyh4YzBjn3ezHkfR9VFiR6+01d2E+TVKDm3hH QoziTnY2ssId9hOc0YoqD1SdioDRhGLWTk0+i/OrmxoUjrErrAikoQJNLWHc/X3P/2Bq VFIbVdiKZrouMFPY29mIpOigouzbNQl8Bb1GNt4vzJMDrGLDodIzXgUVOpwpkeNvc3Od D5LZ4+gdvYmQIV1RFq0u5CvSPlRVd2F2hOJk2RDA8yqqd/GIDsHI+yoX+dOtSfpRv48K Sh7Q== X-Forwarded-Encrypted: i=1; AJvYcCXlevCjmXCPGUKm1cVkdSuAvRFGbyA6Z3dzGtGSz86t1ekdH8cxpZmAlgU5KdYZzk4pHwgSrNyj+T4ojf8=@vger.kernel.org X-Gm-Message-State: AOJu0YwhTztOThJ1GrMmWK7zxgdxtIw0vrf5Sq3vjof7Kf0xy6H0gC7H mmO6TQMV1vY8kmaGLU9n111OJziJaMHM8KiMs8t4bSG2JAkOGyNLZaK4bukJWf5odPO02kKR8Xh aIDWXAOqrb/JIeQ== X-Google-Smtp-Source: AGHT+IHmkBy3pomegCZetYEkRcS2fbDHj0XK2NUpEIw1NB+1JhzqNWEpW/z/YDAVvXt2MKUoUHVAU302Q0gA5A== X-Received: from pjbjs17.prod.google.com ([2002:a17:90b:1491:b0:341:2141:d814]) (user=skhawaja job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:390a:b0:33b:cfae:3621 with SMTP id 98e67ed59e1d1-349126fae11mr263303a91.32.1764716595575; Tue, 02 Dec 2025 15:03:15 -0800 (PST) Date: Tue, 2 Dec 2025 23:02:37 +0000 In-Reply-To: <20251202230303.1017519-1-skhawaja@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20251202230303.1017519-1-skhawaja@google.com> X-Mailer: git-send-email 2.52.0.158.g65b55ccf14-goog Message-ID: <20251202230303.1017519-8-skhawaja@google.com> Subject: [RFC PATCH v2 07/32] iommu: Add liveupdate FLB for IOMMU state preservation From: Samiullah Khawaja To: David Woodhouse , Lu Baolu , Joerg Roedel , Will Deacon , Pasha Tatashin , Jason Gunthorpe , iommu@lists.linux.dev Cc: Samiullah Khawaja , Robin Murphy , Pratyush Yadav , Kevin Tian , Alex Williamson , linux-kernel@vger.kernel.org, Saeed Mahameed , Adithya Jayachandran , Parav Pandit , Leon Romanovsky , William Tu , Vipin Sharma , dmatlack@google.com, YiFei Zhu , Chris Li , praan@google.com Content-Type: text/plain; charset="UTF-8" Add a liveupdate FLB for IOMMU state preservation with stub implementation only. Also add APIs to to register/unregister this FLB with the iommufd LU file handler. Signed-off-by: Samiullah Khawaja --- drivers/iommu/Makefile | 1 + drivers/iommu/liveupdate.c | 60 +++++++++++++++++ include/linux/iommu-lu.h | 17 +++++ include/linux/kho/abi/iommu.h | 119 ++++++++++++++++++++++++++++++++++ 4 files changed, 197 insertions(+) create mode 100644 drivers/iommu/liveupdate.c create mode 100644 include/linux/iommu-lu.h create mode 100644 include/linux/kho/abi/iommu.h diff --git a/drivers/iommu/Makefile b/drivers/iommu/Makefile index 8e8843316c4b..f1d740bb3592 100644 --- a/drivers/iommu/Makefile +++ b/drivers/iommu/Makefile @@ -15,6 +15,7 @@ obj-$(CONFIG_IOMMU_IO_PGTABLE_ARMV7S) += io-pgtable-arm-v7s.o obj-$(CONFIG_IOMMU_IO_PGTABLE_LPAE) += io-pgtable-arm.o obj-$(CONFIG_IOMMU_IO_PGTABLE_LPAE_KUNIT_TEST) += io-pgtable-arm-selftests.o obj-$(CONFIG_IOMMU_IO_PGTABLE_DART) += io-pgtable-dart.o +obj-$(CONFIG_LIVEUPDATE) += liveupdate.o obj-$(CONFIG_IOMMU_IOVA) += iova.o obj-$(CONFIG_OF_IOMMU) += of_iommu.o obj-$(CONFIG_MSM_IOMMU) += msm_iommu.o diff --git a/drivers/iommu/liveupdate.c b/drivers/iommu/liveupdate.c new file mode 100644 index 000000000000..93e5691a8c1f --- /dev/null +++ b/drivers/iommu/liveupdate.c @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-2.0-only + +/* + * Copyright (C) 2025, Google LLC + * Author: Samiullah Khawaja + */ + +#define pr_fmt(fmt) "iommu: liveupdate: " fmt + +#include +#include +#include +#include + +static void iommu_liveupdate_flb_free(struct iommu_lu_flb_obj *obj) +{ +} + +static int iommu_liveupdate_flb_preserve(struct liveupdate_flb_op_args *argp) +{ + return -EOPNOTSUPP; +} + +static void iommu_liveupdate_flb_unpreserve(struct liveupdate_flb_op_args *argp) +{ + iommu_liveupdate_flb_free(argp->obj); +} + +static void iommu_liveupdate_flb_finish(struct liveupdate_flb_op_args *argp) +{ +} + +static int iommu_liveupdate_flb_retrieve(struct liveupdate_flb_op_args *argp) +{ + return -EOPNOTSUPP; +} + +static struct liveupdate_flb_ops iommu_flb_ops = { + .preserve = iommu_liveupdate_flb_preserve, + .unpreserve = iommu_liveupdate_flb_unpreserve, + .finish = iommu_liveupdate_flb_finish, + .retrieve = iommu_liveupdate_flb_retrieve, +}; + +static struct liveupdate_flb iommu_flb = { + .compatible = IOMMU_LUO_FLB_COMPATIBLE, + .ops = &iommu_flb_ops, +}; + +int iommu_liveupdate_register_flb(struct liveupdate_file_handler *handler) +{ + return liveupdate_register_flb(handler, &iommu_flb); +} +EXPORT_SYMBOL(iommu_liveupdate_register_flb); + +int iommu_liveupdate_unregister_flb(struct liveupdate_file_handler *handler) +{ + return liveupdate_unregister_flb(handler, &iommu_flb); +} +EXPORT_SYMBOL(iommu_liveupdate_unregister_flb); diff --git a/include/linux/iommu-lu.h b/include/linux/iommu-lu.h new file mode 100644 index 000000000000..59095d2f1bb2 --- /dev/null +++ b/include/linux/iommu-lu.h @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +/* + * Copyright (C) 2025, Google LLC + * Author: Samiullah Khawaja + */ + +#ifndef _LINUX_IOMMU_LU_H +#define _LINUX_IOMMU_LU_H + +#include +#include + +int iommu_liveupdate_register_flb(struct liveupdate_file_handler *handler); +int iommu_liveupdate_unregister_flb(struct liveupdate_file_handler *handler); + +#endif /* _LINUX_IOMMU_LU_H */ diff --git a/include/linux/kho/abi/iommu.h b/include/linux/kho/abi/iommu.h new file mode 100644 index 000000000000..71ff9b670a0b --- /dev/null +++ b/include/linux/kho/abi/iommu.h @@ -0,0 +1,119 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +/* + * Copyright (C) 2025, Google LLC + * Author: Samiullah Khawaja + */ + +#ifndef _LINUX_KHO_ABI_IOMMU_H +#define _LINUX_KHO_ABI_IOMMU_H + +#include +#include +#include + +/** + * DOC: IOMMU File-Lifecycle Bound (FLB) Live Update ABI + * + * This header defines the ABI for preserving IOMMU state across kexec using + * Live Update File-Lifecycle Bound (FLB) data. + * + * This interface is a contract. Any modification to any of the serialization + * structs defined here constitutes a breaking change. Such changes require + * incrementing the version number in the IOMMU_LUO_FLB_COMPATIBLE string. + */ + +#define IOMMU_LUO_FLB_COMPATIBLE "iommu-v1" + +enum iommu_lu_type { + IOMMU_INVALID, + IOMMU_INTEL, +}; + +struct iommu_obj_ser { + u32 idx; + u32 ref_count; + u32 deleted:1; + u32 incoming:1; +} __packed; + +struct iommu_domain_ser { + struct iommu_obj_ser obj; + u64 top_table; + u64 top_level; + u64 attach_count; + struct iommu_domain *restored_domain; +} __packed; + +struct device_domain_iommu_ser { + u32 did; + u64 domain_phys; + u64 iommu_phys; +}; + +struct device_ser { + struct iommu_obj_ser obj; + u64 token; + u32 devid; + u32 pci_domain; + struct device_domain_iommu_ser domain_iommu_ser; + enum iommu_lu_type type; +} __packed; + +struct iommu_intel_ser { + u64 phys_addr; + u64 root_table; +} __packed; + +struct iommu_ser { + struct iommu_obj_ser obj; + u64 token; + enum iommu_lu_type type; + union { + struct iommu_intel_ser intel; + }; +}; + +struct iommu_objs_ser { + u64 next_objs; + u64 nr_objs; +}; + +struct iommus_ser { + struct iommu_objs_ser objs; + struct iommu_ser iommus[]; +} __packed; + +struct iommu_domains_ser { + struct iommu_objs_ser objs; + struct iommu_domain_ser iommu_domains[]; +} __packed; + +struct devices_ser { + struct iommu_objs_ser objs; + struct device_ser devices[]; +} __packed; + +#define MAX_IOMMU_SERS ((PAGE_SIZE - sizeof(struct iommus_ser)) / sizeof(struct iommu_ser)) +#define MAX_IOMMU_DOMAIN_SERS ((PAGE_SIZE - sizeof(struct iommu_domains_ser)) / sizeof(struct iommu_domain_ser)) +#define MAX_DEVICE_SERS ((PAGE_SIZE - sizeof(struct devices_ser)) / sizeof(struct device_ser)) + +struct iommu_lu_flb_ser { + u64 iommus_phys; + u64 nr_iommus; + u64 iommu_domains_phys; + u64 nr_domains; + u64 devices_phys; + u64 nr_devices; +} __packed; + +struct iommu_lu_flb_obj { + struct mutex lock; + struct iommu_lu_flb_ser *ser; + + struct iommu_domains_ser *iommu_domains; + struct iommus_ser *iommus; + struct devices_ser *devices; +}; + +#endif /* _LINUX_KHO_ABI_IOMMU_H */ -- 2.52.0.158.g65b55ccf14-goog