From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (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 15F673081D1 for ; Tue, 2 Dec 2025 23:03:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764716617; cv=none; b=SnAmBIXdLBdmwfZNx67xCHyiaPRxP6FyH8IGBQlXeknKcG9qzW5zXpSQh1nRnHIFoq6dPeXXjV/T4g3cbl7ngkCjsCrI4t4Yn6Xrbk9gsw1pdU7uVW3CWeX7L0l4E/Nj1fesyoeKTQX7miH9Sl4w0kKBNeXp50URbzPZgKUOqKE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764716617; c=relaxed/simple; bh=yKnHFQ1kaX8g8nk0EgcTv3IagYqpPlC8br1kFNBevv8=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=rHK8uCOMrw7Ubul29cIwjUqmuYmfXJIrbktvUO9ntap/3WMIWXjW9H4mDrLs2F3uo8fYASmSpXmB5/DPua7mohwVexUHxODQ4EA7k827cJOAG7zcwKCz0zQPWPv3H1imFywIo+9moZjyCJwplJwftpVSUPBPD4physoy4cA/WcY= 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=fMJcviJd; arc=none smtp.client-ip=209.85.210.201 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="fMJcviJd" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-7b9ef46df43so5883123b3a.1 for ; Tue, 02 Dec 2025 15:03:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1764716615; x=1765321415; 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=PrbTAG14fQ4e4lFg6XwBokA/VuQ0C8hu3lsKsfR40dg=; b=fMJcviJdKyawVfZ2XuPbqaoBeu7SZx94iiP4JFcETMTvkCbZXQB6gMi9sBZFaEBCyR q3tRwVMh4Vg5WAUTybEPSAoPdItAOPdKcH+L9HHHl7enoBrMFtDGq6B3WmPa+OeKHMTZ l3x82TnvncQTFch0oDD/jvlnKS/mgwfePZRZ9HLtBAqaRUs7Kf22sIqK0HExI+t6mk+w 03xWk5Pl5Pi5bFKmGasQh7gWECjO8c3IF6MhrwLZWUHU5ap+cd2hPzGxiUraXT0bWvES 3pwjKBQV5Xz7Tszs71ghjlglhhZv7oD27odkBkG5yoUFDOhujJpENnxwqwXSkEJwB4wl CM/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764716615; x=1765321415; 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=PrbTAG14fQ4e4lFg6XwBokA/VuQ0C8hu3lsKsfR40dg=; b=vgf9nweBzkjzCVwQCuPCwM42Xkqs5e864SGfpeR0z0IZ/detYNjkx5RZzpmOeEaFtj FV0OKBm+BkkVEW0J6m8Ptjc/s0SnEV/6KgCuhSLORxwwU+xxC9jHPNCjWa68TlR20K3V G8bDOC+aFzyzlH/xnQ7llhvqxyf7xwihfZOd9NS4lTUFpM6KLoFup9KnWy0+PR/SirQE i23F63yCOCwHDgR+XgZxw9fXd5Yj9poabUH6p5SX8cvHd8pjTlqos2NwTCNSXl1uip+T LVbCinFXd6YLU8XePm2BRhUvzIk6YZ9DHSqjeHDjU7iOxcE2YqQBRMtRZ5JttMKQw+zP eBRw== X-Forwarded-Encrypted: i=1; AJvYcCU7+BRRGJgFsv4XFHtZkx1rkXaWvDKDwBxbwOa+jFrsTTj4Rcq4pzSrVuxJuAUwVBe/OFBVKBHNs8PMBj0=@vger.kernel.org X-Gm-Message-State: AOJu0YzbWF1/ANEc7VUBA/FkOX4BIZiO8NVjQMmJ56/jmfKSzp3IsIUe cf/DzAuhdtO03jyAi2OGJZ2ghJ4JB0tW+HsSpH7AzzUtA/TXWdgpRTu8TlESlKPu8KttbeLwZVt eLYxH8+cfLLuUTw== X-Google-Smtp-Source: AGHT+IF73IhtHOJfWjVx7aWXFwgxkkcNxwTxexsp+KJDsu7Sndk3wbWZLxaLaJ67euc4ONKi0YZioD+jWQRqDw== X-Received: from pfbfb24.prod.google.com ([2002:a05:6a00:2d98:b0:781:e8d:dd2b]) (user=skhawaja job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:9298:b0:781:17ee:602 with SMTP id d2e1a72fcca58-7e00f7ed693mr186583b3a.28.1764716615287; Tue, 02 Dec 2025 15:03:35 -0800 (PST) Date: Tue, 2 Dec 2025 23:02:50 +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-21-skhawaja@google.com> Subject: [RFC PATCH v2 20/32] iommu: Add APIs to get preserved state of a device 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" The preserved state of the device needs to be fetched at various places during liveupdate. The added API can also be used to check if a device is preserved or not. The API is only used during shutdown and after liveupdate so no locking needed. Signed-off-by: Samiullah Khawaja --- include/linux/iommu-lu.h | 67 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/include/linux/iommu-lu.h b/include/linux/iommu-lu.h index 95375530b7be..08a659de8553 100644 --- a/include/linux/iommu-lu.h +++ b/include/linux/iommu-lu.h @@ -8,9 +8,76 @@ #ifndef _LINUX_IOMMU_LU_H #define _LINUX_IOMMU_LU_H +#include +#include #include #include +#ifdef CONFIG_LIVEUPDATE +static inline void *dev_iommu_preserved_state(struct device *dev) +{ + struct device_ser *ser; + + ser = dev->iommu->device_ser; + if (ser && !ser->obj.incoming) + return ser; + + return NULL; +} + +static inline void *dev_iommu_restored_state(struct device *dev) +{ + struct device_ser *ser; + + ser = dev->iommu->device_ser; + if (ser && ser->obj.incoming) + return ser; + + return NULL; +} + +static inline void *iommu_domain_restored_state(struct iommu_domain *domain) +{ + struct iommu_domain_ser *ser; + + ser = domain->preserved_state; + if (ser && ser->obj.incoming) + return ser; + + return NULL; +} + +static inline int dev_iommu_restore_did(struct device *dev, struct iommu_domain *domain) +{ + struct device_ser *ser = dev_iommu_restored_state(dev); + + if (ser && iommu_domain_restored_state(domain)) + return ser->domain_iommu_ser.did; + + return -1; +} +#else +static inline void *dev_iommu_preserved_state(struct device *dev) +{ + return NULL; +} + +static inline void *dev_iommu_restored_state(struct device *dev) +{ + return NULL; +} + +static inline int dev_iommu_restore_did(struct device *dev, struct iommu_domain *domain) +{ + return -1; +} + +static inline void *iommu_domain_restored_state(struct iommu_domain *domain) +{ + return NULL; +} +#endif + int iommu_domain_preserve(struct iommu_domain *domain, struct iommu_domain_ser **ser); int iommu_domain_unpreserve(struct iommu_domain *domain); int iommu_preserve_device(struct iommu_domain *domain, struct device *dev); -- 2.52.0.158.g65b55ccf14-goog