From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DD07263DE for ; Tue, 30 May 2023 05:39:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1685425158; x=1716961158; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=m2M+k/wNJUpLwNpk+M4ahpND6qZ7v9d+7FJR9k8IhpI=; b=TMaXT+Wj6CS71Q4fmvDPBjalY6Incb1K9i5t1FHJ0HFun+iku+bYFxpZ 0J6xmFMCVNb4PiKXwy6fUCSeNlP5fzmJns8XcGRK9YPvZ+gIxWFN6LaVs wMgBc4DA9GbXogRIisif/LYvpDWv5GyW6M8XWq3ck6yRqzbleGYRizUX0 CLolXfVxqYaohO6TQnkuMHYPvWuAJ414k7cRWZMLyeyErK1XPBO71stQG hdO5SI0BcXPIcsiCrQa3gm3dpDVViUmlrhEeukO2mJt9g4R3a3T1wdiYJ oPvf6QmpeEhsnuzZtZpzP2lJkZFcp0nMN0Y1veScrMIDOIUOBtjejlHaj g==; X-IronPort-AV: E=McAfee;i="6600,9927,10725"; a="420579881" X-IronPort-AV: E=Sophos;i="6.00,203,1681196400"; d="scan'208";a="420579881" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 May 2023 22:39:18 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10725"; a="739369909" X-IronPort-AV: E=Sophos;i="6.00,203,1681196400"; d="scan'208";a="739369909" Received: from allen-box.sh.intel.com ([10.239.159.127]) by orsmga001.jf.intel.com with ESMTP; 29 May 2023 22:39:15 -0700 From: Lu Baolu To: Jason Gunthorpe , Kevin Tian , Joerg Roedel , Will Deacon , Robin Murphy , Jean-Philippe Brucker , Nicolin Chen , Yi Liu , Jacob Pan Cc: iommu@lists.linux.dev, linux-kselftest@vger.kernel.org, virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org, Lu Baolu Subject: [RFC PATCHES 14/17] iommufd: Drain all pending faults when destroying hwpt Date: Tue, 30 May 2023 13:37:21 +0800 Message-Id: <20230530053724.232765-15-baolu.lu@linux.intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230530053724.232765-1-baolu.lu@linux.intel.com> References: <20230530053724.232765-1-baolu.lu@linux.intel.com> Precedence: bulk X-Mailing-List: iommu@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit When a HWPT is unexpectedly destroyed, drain all faults in the pending lists. It is safe because the iommu domain has been released and there will never be new io page faults anymore. Signed-off-by: Lu Baolu --- drivers/iommu/iommufd/hw_pagetable.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/drivers/iommu/iommufd/hw_pagetable.c b/drivers/iommu/iommufd/hw_pagetable.c index 8c441fd72e1f..7f18e6bd76ec 100644 --- a/drivers/iommu/iommufd/hw_pagetable.c +++ b/drivers/iommu/iommufd/hw_pagetable.c @@ -574,11 +574,26 @@ static struct hw_pgtable_fault *hw_pagetable_fault_alloc(int eventfd) return ERR_PTR(rc); } +static void iommufd_fault_list_destroy(struct hw_pgtable_fault *fault, + struct list_head *list) +{ + struct iommufd_fault *ifault; + + mutex_lock(&fault->mutex); + while (!list_empty(list)) { + ifault = list_first_entry(list, struct iommufd_fault, item); + if (iommufd_fault_timer_teardown(ifault)) + drain_iopf_fault(ifault); + list_del_init(&ifault->item); + iommufd_put_fault(ifault); + } + mutex_unlock(&fault->mutex); +} + static void hw_pagetable_fault_free(struct hw_pgtable_fault *fault) { - WARN_ON(!list_empty(&fault->deliver)); - WARN_ON(!list_empty(&fault->response)); - + iommufd_fault_list_destroy(fault, &fault->deliver); + iommufd_fault_list_destroy(fault, &fault->response); eventfd_ctx_put(fault->trigger); kfree(fault); } -- 2.34.1