From patchwork Thu Dec 28 00:16:42 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ethan Zhao X-Patchwork-Id: 183583 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:6f82:b0:100:9c79:88ff with SMTP id tb2csp1732281dyb; Wed, 27 Dec 2023 16:17:23 -0800 (PST) X-Google-Smtp-Source: AGHT+IE7My5CveDRt1Z+lsoE+F88OK1CXEEnN/w4751zvyicijoys0pxm5FpsX3D9bTP2xj4vebm X-Received: by 2002:a2e:2ac2:0:b0:2cc:5dc2:3f09 with SMTP id q185-20020a2e2ac2000000b002cc5dc23f09mr3671665ljq.44.1703722643081; Wed, 27 Dec 2023 16:17:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703722643; cv=none; d=google.com; s=arc-20160816; b=VTQClaub4jnAIbSGl1i3qMRfyYcRhEsCKtbIi41gPEMrh+NUgoVgC2hIHTmXG/MX7r 8MvH+f4OAY8rY+7S4K4eGK0UtPfT4/GwPLLDp2PLLmMKDSqBFMk+aP7u5kUgKYZaGOIw TDcwSBSdllTQAfRxtVRJ/lMnXhD7744fXg9NgbspJOn+OVsKV7U5GHK/Hd7UsOukN3c4 2F8slbVIqqB9ks7bqaXoVw9J3A134o/WCQFSS9HjyRLY86hSPJhcptDsRvXD/CI2xvHI JQRt7adip1I6hpOit/VtpGQ5xkgVcUBplUjs2PwALWruouEz0opPHdsgqzFn4tEXm0o5 DWJA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=DP0qNiCsKhg8xKh15rKZ+1HQ3CpPWBa8+wFOtwpt6MI=; fh=cQTxynQ7rGExgmbyXq8tNmd/VmE1Fzgt9QW51hABj2c=; b=vZ/X/wx5xW8Zmc6l7bulSDT6N4hoaOQmvfQBz5lUZEMC0A/RkzQhUBFcu66O6fT6Qt 4OfAEIv13zKJMAyK/fxfyD6Mr0IeD8lEJ/wSowl/Xix5/cZG2X8nUZPHlTBg/Mj0pSG9 Oq1cJglAjFHONUJ6fWRAHlhr/Z87L8upTBn7cYJ6TSoQNuQTy6LBbS0BX3vGFhs2krLy WTy00mK1Np48qxB6Fjt9CHg6RZ4VPDJiPUI2j9o+AmOWZUQs5BUL8kdm2cr4JaezWgII Ccx0etngmInbjz/id9qj3hiUuWvQFszsC7TdwrFADDFO3b0pzk4hreFiBNKxbx5lktjE ZZyw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=nIit7FxY; spf=pass (google.com: domain of linux-kernel+bounces-12314-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12314-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [147.75.80.249]) by mx.google.com with ESMTPS id d6-20020a50f686000000b005545ab3e6a4si5349799edn.74.2023.12.27.16.17.22 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Dec 2023 16:17:23 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-12314-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) client-ip=147.75.80.249; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=nIit7FxY; spf=pass (google.com: domain of linux-kernel+bounces-12314-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12314-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id AE3BD1F23259 for ; Thu, 28 Dec 2023 00:17:22 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D552028E8; Thu, 28 Dec 2023 00:16:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="nIit7FxY" X-Original-To: linux-kernel@vger.kernel.org Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.12]) (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 9E48A637; Thu, 28 Dec 2023 00:16:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1703722615; x=1735258615; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=E0MhZ0JF1VXMX0GUVKCEwMF1hc/wfxdlOt1kMXlN/dc=; b=nIit7FxYGJIPxdQ9P0K6QgJXfKldNZTsHRG1+pK/f+a/DVXqjBxizb7j u/nkyV/KVhT/UL1MLUrtK+gQ7tQFZj/4afyrjEYnYlXgjyzEISBvViMfy Q5zLTXQeb2lXlvE0UhL2RXdymv6IxM+kLewPNASGvRajXZHXjWOmB4ljr 7DA4s4Lk12o7Ji/bTloWk2NPVWv/XSGPN0YBONHTbDWdktWPCEAQT6U0b JJDIf4mXmo7dg9+HMQ+vdg/kfETgzI4WJ9zUeoGiS2lC4wLkjw2G5dnZ2 N1FXe/0JRHdykyjmQLx7g7K+QDajTwlo9ZkDA3KDcCslwU7DrF2NevVLt w==; X-IronPort-AV: E=McAfee;i="6600,9927,10936"; a="3800448" X-IronPort-AV: E=Sophos;i="6.04,310,1695711600"; d="scan'208";a="3800448" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orvoesa104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Dec 2023 16:16:55 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10936"; a="848812665" X-IronPort-AV: E=Sophos;i="6.04,310,1695711600"; d="scan'208";a="848812665" Received: from ply01-vm-store.bj.intel.com ([10.238.153.201]) by fmsmga004.fm.intel.com with ESMTP; 27 Dec 2023 16:16:51 -0800 From: Ethan Zhao To: bhelgaas@google.com, baolu.lu@linux.intel.com, dwmw2@infradead.org, will@kernel.org, robin.murphy@arm.com, lukas@wunner.de Cc: linux-pci@vger.kernel.org, iommu@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [RFC PATCH v9 1/5] iommu/vt-d: add flush_target_dev member to struct intel_iommu and pass device info to all ATS Invalidation functions Date: Wed, 27 Dec 2023 19:16:42 -0500 Message-Id: <20231228001646.587653-2-haifeng.zhao@linux.intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20231228001646.587653-1-haifeng.zhao@linux.intel.com> References: <20231228001646.587653-1-haifeng.zhao@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1786482674159437288 X-GMAIL-MSGID: 1786482674159437288 As iommu is a pointer member of device_domain_info, so can't play trick like container_of() to get the info and device instance for qi_submit_sync() low level function to check device status, add a flush_target_dev member to struct inte_iommu and pass dev info to all device-TLB invalidation (a.k.a ATS Invalidation) functions. Signed-off-by: Ethan Zhao --- drivers/iommu/intel/iommu.c | 1 + drivers/iommu/intel/iommu.h | 2 ++ drivers/iommu/intel/pasid.c | 1 + drivers/iommu/intel/svm.c | 1 + 4 files changed, 5 insertions(+) diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c index 897159dba47d..c3724f1d86dc 100644 --- a/drivers/iommu/intel/iommu.c +++ b/drivers/iommu/intel/iommu.c @@ -1461,6 +1461,7 @@ static void __iommu_flush_dev_iotlb(struct device_domain_info *info, sid = info->bus << 8 | info->devfn; qdep = info->ats_qdep; + info->iommu->flush_target_dev = info->dev; qi_flush_dev_iotlb(info->iommu, sid, info->pfsid, qdep, addr, mask); quirk_extra_dev_tlb_flush(info, addr, mask, IOMMU_NO_PASID, qdep); diff --git a/drivers/iommu/intel/iommu.h b/drivers/iommu/intel/iommu.h index ce030c5b5772..e892c5c7560a 100644 --- a/drivers/iommu/intel/iommu.h +++ b/drivers/iommu/intel/iommu.h @@ -731,6 +731,8 @@ struct intel_iommu { void *perf_statistic; struct iommu_pmu *pmu; + + struct device *flush_target_dev; /* the target device TLB to be invalidated. */ }; /* PCI domain-device relationship */ diff --git a/drivers/iommu/intel/pasid.c b/drivers/iommu/intel/pasid.c index 74e8e4c17e81..1c87fb1b1039 100644 --- a/drivers/iommu/intel/pasid.c +++ b/drivers/iommu/intel/pasid.c @@ -485,6 +485,7 @@ devtlb_invalidation_with_pasid(struct intel_iommu *iommu, qdep = info->ats_qdep; pfsid = info->pfsid; + info->iommu->flush_target_dev = info->dev; /* * When PASID 0 is used, it indicates RID2PASID(DMA request w/o PASID), * devTLB flush w/o PASID should be used. For non-zero PASID under diff --git a/drivers/iommu/intel/svm.c b/drivers/iommu/intel/svm.c index ac12f76c1212..d42a99801cdf 100644 --- a/drivers/iommu/intel/svm.c +++ b/drivers/iommu/intel/svm.c @@ -181,6 +181,7 @@ static void __flush_svm_range_dev(struct intel_svm *svm, qi_flush_piotlb(sdev->iommu, sdev->did, svm->pasid, address, pages, ih); if (info->ats_enabled) { + info->iommu->flush_target_dev = info->dev; qi_flush_dev_iotlb_pasid(sdev->iommu, sdev->sid, info->pfsid, svm->pasid, sdev->qdep, address, order_base_2(pages)); From patchwork Thu Dec 28 00:16:43 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ethan Zhao X-Patchwork-Id: 183584 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:6f82:b0:100:9c79:88ff with SMTP id tb2csp1732374dyb; Wed, 27 Dec 2023 16:17:37 -0800 (PST) X-Google-Smtp-Source: AGHT+IGz1I+wAytIHoAXzeFNPsFgHpKvgbTCA/txvBF9zHfJQiZfFQrbKc4Beoic4vd8OSNmonM3 X-Received: by 2002:a05:622a:407:b0:427:9c29:5aff with SMTP id n7-20020a05622a040700b004279c295affmr14607296qtx.1.1703722657429; Wed, 27 Dec 2023 16:17:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703722657; cv=none; d=google.com; s=arc-20160816; b=RIuji3CmIf3Kh7DNY4k9SyD31F2lSS/E7QE8DF8P4DGLMPy+AjsLLE81hYiRkWDtXI zulggcbmGIUDzB9TgsV8mdEDRUdh/EpLPC3ZvMumenlbG7waCUvXgIzgCtU5cdgg5eWW vTNmyXtn2Lo7Dpo+VvFhpph5JD8JQoAc3VSccoVzmwfzB5orx8y5jQmoCaNzkwQB3bfo ivK9fEC76NZyFqidhdz7drgbcE3jqKYa8Fd3ZZk12oi8KAa40q8UWB0k1622egkvPpNk mnRj3spzu5vi0ZUMvChjuBThkz5iNjfmdn/hLnfFSrcemkf79UAxD5v8l9KpWPymaaED od3Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=BeSxHFLqJBbPJxWmhB3sei+pp2UT9ETBDxP2G5t6LLc=; fh=cQTxynQ7rGExgmbyXq8tNmd/VmE1Fzgt9QW51hABj2c=; b=XsTR/lyu56Sd2m4NoW4m2m8+ihxDUNknDGlwQEJ2HnbL5l7zJHdXgpapiMuiKBrpCd D+A8fl8g1OwPp9a0R3Z7d3o4UzX2pneTFAY6+FVVuFe/e2dGVokWUDlUmiSVVPJ/fBx/ 7T3g14G98DMPr7N2PshVf6wGPcb57fM3vVXwHpPTuXhab2dVP3mtMTI1fReM9dqyzBwH CmlxWm/f4ZJtez878gl98m5xXrJiJ8+w6/vtdWjj+rS2A2Q5+HX1ML+Q2AWjPA2mfHkG 1WlmxcqFAAZtaSz0/gpT2ng3W4nZUQyXjA+Yc2JhpQ8032+ek9k92JxCPgzCjP1b1W1J L23g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=iqigY51o; spf=pass (google.com: domain of linux-kernel+bounces-12315-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12315-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id p20-20020a05622a049400b0042578f95d8esi15992957qtx.254.2023.12.27.16.17.37 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Dec 2023 16:17:37 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-12315-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=iqigY51o; spf=pass (google.com: domain of linux-kernel+bounces-12315-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12315-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 2D20A1C212A4 for ; Thu, 28 Dec 2023 00:17:37 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id EBD29388; Thu, 28 Dec 2023 00:17:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="iqigY51o" X-Original-To: linux-kernel@vger.kernel.org Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.12]) (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 A7CE523A7; Thu, 28 Dec 2023 00:16:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1703722618; x=1735258618; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=mBm6xksKyEqXXtQd/jsCC3V3Gq8QwOkIyd1EN1TXxK8=; b=iqigY51oWBw9SairBES1PVYvJ6KnSDAjgVYKPYt2NAq4Jwjt4ya2/Fuw nPGOyLWlzsIb+Uh0KcaSmloIsqMp8kuSZkmfwo4cFf7gpCGzFGdbI6OqI aqfT2VLZloFX8Ti0NEelEC9XxtC3HBW2D9KFsiYfcbdohn9FtUC9g9NeD +wWV5cX8KzVzRJAW49ar1i5b+2lo5KuKb4D777siJ2+t0ujydWeNHHAD/ Jl10mn/n+6wyFHObbV3E3Y/rkbwtbl8EZE71phlUkKUleIpQDZ7/BZ0h+ dcZ6hWXC9LNdl++3eBl0c9T8Gunsew/KzM3xQf48KsjeZoPWT/30a7v6y g==; X-IronPort-AV: E=McAfee;i="6600,9927,10936"; a="3800472" X-IronPort-AV: E=Sophos;i="6.04,310,1695711600"; d="scan'208";a="3800472" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orvoesa104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Dec 2023 16:16:58 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10936"; a="848812674" X-IronPort-AV: E=Sophos;i="6.04,310,1695711600"; d="scan'208";a="848812674" Received: from ply01-vm-store.bj.intel.com ([10.238.153.201]) by fmsmga004.fm.intel.com with ESMTP; 27 Dec 2023 16:16:54 -0800 From: Ethan Zhao To: bhelgaas@google.com, baolu.lu@linux.intel.com, dwmw2@infradead.org, will@kernel.org, robin.murphy@arm.com, lukas@wunner.de Cc: linux-pci@vger.kernel.org, iommu@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [RFC PATCH v9 2/5] iommu/vt-d: break out ATS Invalidation if target device is gone Date: Wed, 27 Dec 2023 19:16:43 -0500 Message-Id: <20231228001646.587653-3-haifeng.zhao@linux.intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20231228001646.587653-1-haifeng.zhao@linux.intel.com> References: <20231228001646.587653-1-haifeng.zhao@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1786482689272354580 X-GMAIL-MSGID: 1786482689272354580 For those endpoint devices connect to system via hotplug capable ports, users could request a warm reset to the device by flapping device's link through setting the slot's link control register, as pciehp_ist() DLLSC interrupt sequence response, pciehp will unload the device driver and then power it off. thus cause an IOMMU device-TLB invalidation (Intel VT-d spec, or ATS Invalidation in PCIe spec r6.1) request for device to be sent and a long time completion/timeout waiting in interrupt context. That would cause following continuous hard lockup warning and system hang [ 4211.433662] pcieport 0000:17:01.0: pciehp: Slot(108): Link Down [ 4211.433664] pcieport 0000:17:01.0: pciehp: Slot(108): Card not present [ 4223.822591] NMI watchdog: Watchdog detected hard LOCKUP on cpu 144 [ 4223.822622] CPU: 144 PID: 1422 Comm: irq/57-pciehp Kdump: loaded Tainted: G S OE kernel version xxxx [ 4223.822623] Hardware name: vendorname xxxx 666-106, BIOS 01.01.02.03.01 05/15/2023 [ 4223.822623] RIP: 0010:qi_submit_sync+0x2c0/0x490 [ 4223.822624] Code: 48 be 00 00 00 00 00 08 00 00 49 85 74 24 20 0f 95 c1 48 8b 57 10 83 c1 04 83 3c 1a 03 0f 84 a2 01 00 00 49 8b 04 24 8b 70 34 <40> f6 c6 1 0 74 17 49 8b 04 24 8b 80 80 00 00 00 89 c2 d3 fa 41 39 [ 4223.822624] RSP: 0018:ffffc4f074f0bbb8 EFLAGS: 00000093 [ 4223.822625] RAX: ffffc4f040059000 RBX: 0000000000000014 RCX: 0000000000000005 [ 4223.822625] RDX: ffff9f3841315800 RSI: 0000000000000000 RDI: ffff9f38401a8340 [ 4223.822625] RBP: ffff9f38401a8340 R08: ffffc4f074f0bc00 R09: 0000000000000000 [ 4223.822626] R10: 0000000000000010 R11: 0000000000000018 R12: ffff9f384005e200 [ 4223.822626] R13: 0000000000000004 R14: 0000000000000046 R15: 0000000000000004 [ 4223.822626] FS: 0000000000000000(0000) GS:ffffa237ae400000(0000) knlGS:0000000000000000 [ 4223.822627] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 4223.822627] CR2: 00007ffe86515d80 CR3: 000002fd3000a001 CR4: 0000000000770ee0 [ 4223.822627] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 4223.822628] DR3: 0000000000000000 DR6: 00000000fffe07f0 DR7: 0000000000000400 [ 4223.822628] PKRU: 55555554 [ 4223.822628] Call Trace: [ 4223.822628] qi_flush_dev_iotlb+0xb1/0xd0 [ 4223.822628] __dmar_remove_one_dev_info+0x224/0x250 [ 4223.822629] dmar_remove_one_dev_info+0x3e/0x50 [ 4223.822629] intel_iommu_release_device+0x1f/0x30 [ 4223.822629] iommu_release_device+0x33/0x60 [ 4223.822629] iommu_bus_notifier+0x7f/0x90 [ 4223.822630] blocking_notifier_call_chain+0x60/0x90 [ 4223.822630] device_del+0x2e5/0x420 [ 4223.822630] pci_remove_bus_device+0x70/0x110 [ 4223.822630] pciehp_unconfigure_device+0x7c/0x130 [ 4223.822631] pciehp_disable_slot+0x6b/0x100 [ 4223.822631] pciehp_handle_presence_or_link_change+0xd8/0x320 [ 4223.822631] pciehp_ist+0x176/0x180 [ 4223.822631] ? irq_finalize_oneshot.part.50+0x110/0x110 [ 4223.822632] irq_thread_fn+0x19/0x50 [ 4223.822632] irq_thread+0x104/0x190 [ 4223.822632] ? irq_forced_thread_fn+0x90/0x90 [ 4223.822632] ? irq_thread_check_affinity+0xe0/0xe0 [ 4223.822633] kthread+0x114/0x130 [ 4223.822633] ? __kthread_cancel_work+0x40/0x40 [ 4223.822633] ret_from_fork+0x1f/0x30 [ 4223.822633] Kernel panic - not syncing: Hard LOCKUP [ 4223.822634] CPU: 144 PID: 1422 Comm: irq/57-pciehp Kdump: loaded Tainted: G S OE kernel version xxxx [ 4223.822634] Hardware name: vendorname xxxx 666-106, BIOS 01.01.02.03.01 05/15/2023 [ 4223.822634] Call Trace: [ 4223.822634] [ 4223.822635] dump_stack+0x6d/0x88 [ 4223.822635] panic+0x101/0x2d0 [ 4223.822635] ? ret_from_fork+0x11/0x30 [ 4223.822635] nmi_panic.cold.14+0xc/0xc [ 4223.822636] watchdog_overflow_callback.cold.8+0x6d/0x81 [ 4223.822636] __perf_event_overflow+0x4f/0xf0 [ 4223.822636] handle_pmi_common+0x1ef/0x290 [ 4223.822636] ? __set_pte_vaddr+0x28/0x40 [ 4223.822637] ? flush_tlb_one_kernel+0xa/0x20 [ 4223.822637] ? __native_set_fixmap+0x24/0x30 [ 4223.822637] ? ghes_copy_tofrom_phys+0x70/0x100 [ 4223.822637] ? __ghes_peek_estatus.isra.16+0x49/0xa0 [ 4223.822637] intel_pmu_handle_irq+0xba/0x2b0 [ 4223.822638] perf_event_nmi_handler+0x24/0x40 [ 4223.822638] nmi_handle+0x4d/0xf0 [ 4223.822638] default_do_nmi+0x49/0x100 [ 4223.822638] exc_nmi+0x134/0x180 [ 4223.822639] end_repeat_nmi+0x16/0x67 [ 4223.822639] RIP: 0010:qi_submit_sync+0x2c0/0x490 [ 4223.822639] Code: 48 be 00 00 00 00 00 08 00 00 49 85 74 24 20 0f 95 c1 48 8b 57 10 83 c1 04 83 3c 1a 03 0f 84 a2 01 00 00 49 8b 04 24 8b 70 34 <40> f6 c6 10 74 17 49 8b 04 24 8b 80 80 00 00 00 89 c2 d3 fa 41 39 [ 4223.822640] RSP: 0018:ffffc4f074f0bbb8 EFLAGS: 00000093 [ 4223.822640] RAX: ffffc4f040059000 RBX: 0000000000000014 RCX: 0000000000000005 [ 4223.822640] RDX: ffff9f3841315800 RSI: 0000000000000000 RDI: ffff9f38401a8340 [ 4223.822641] RBP: ffff9f38401a8340 R08: ffffc4f074f0bc00 R09: 0000000000000000 [ 4223.822641] R10: 0000000000000010 R11: 0000000000000018 R12: ffff9f384005e200 [ 4223.822641] R13: 0000000000000004 R14: 0000000000000046 R15: 0000000000000004 [ 4223.822641] ? qi_submit_sync+0x2c0/0x490 [ 4223.822642] ? qi_submit_sync+0x2c0/0x490 [ 4223.822642] [ 4223.822642] qi_flush_dev_iotlb+0xb1/0xd0 [ 4223.822642] __dmar_remove_one_dev_info+0x224/0x250 [ 4223.822643] dmar_remove_one_dev_info+0x3e/0x50 [ 4223.822643] intel_iommu_release_device+0x1f/0x30 [ 4223.822643] iommu_release_device+0x33/0x60 [ 4223.822643] iommu_bus_notifier+0x7f/0x90 [ 4223.822644] blocking_notifier_call_chain+0x60/0x90 [ 4223.822644] device_del+0x2e5/0x420 [ 4223.822644] pci_remove_bus_device+0x70/0x110 [ 4223.822644] pciehp_unconfigure_device+0x7c/0x130 [ 4223.822644] pciehp_disable_slot+0x6b/0x100 [ 4223.822645] pciehp_handle_presence_or_link_change+0xd8/0x320 [ 4223.822645] pciehp_ist+0x176/0x180 [ 4223.822645] ? irq_finalize_oneshot.part.50+0x110/0x110 [ 4223.822645] irq_thread_fn+0x19/0x50 [ 4223.822646] irq_thread+0x104/0x190 [ 4223.822646] ? irq_forced_thread_fn+0x90/0x90 [ 4223.822646] ? irq_thread_check_affinity+0xe0/0xe0 [ 4223.822646] kthread+0x114/0x130 [ 4223.822647] ? __kthread_cancel_work+0x40/0x40 [ 4223.822647] ret_from_fork+0x1f/0x30 [ 4223.822647] Kernel Offset: 0x6400000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff) Furthermore even an in-process safe removal unplugged device could be surprise removed anytime, thus need to check the ATS Invalidation target device state to see if it is gone, and don't wait for the completion/ timeout blindly, thus avoid the up to 1min+50% (see Implementation Note in PCIe spec r6.1 sec 10.3.1) waiting and cause hard lockup or system hang. Signed-off-by: Ethan Zhao --- drivers/iommu/intel/dmar.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c index 23cb80d62a9a..76903a8bf963 100644 --- a/drivers/iommu/intel/dmar.c +++ b/drivers/iommu/intel/dmar.c @@ -1347,6 +1347,7 @@ int qi_submit_sync(struct intel_iommu *iommu, struct qi_desc *desc, unsigned int count, unsigned long options) { struct q_inval *qi = iommu->qi; + struct pci_dev *pdev = NULL; s64 devtlb_start_ktime = 0; s64 iotlb_start_ktime = 0; s64 iec_start_ktime = 0; @@ -1360,6 +1361,9 @@ int qi_submit_sync(struct intel_iommu *iommu, struct qi_desc *desc, if (!qi) return 0; + if (iommu->flush_target_dev && dev_is_pci(iommu->flush_target_dev)) + pdev = to_pci_dev(iommu->flush_target_dev); + type = desc->qw0 & GENMASK_ULL(3, 0); if ((type == QI_IOTLB_TYPE || type == QI_EIOTLB_TYPE) && @@ -1423,6 +1427,14 @@ int qi_submit_sync(struct intel_iommu *iommu, struct qi_desc *desc, writel(qi->free_head << shift, iommu->reg + DMAR_IQT_REG); while (qi->desc_status[wait_index] != QI_DONE) { + /* + * if the device-TLB invalidation target device is gone, don't + * wait anymore, it might take up to 1min+50%, causes system + * hang. (see Implementation Note in PCIe spec r6.1 sec 10.3.1) + */ + if ((type == QI_DIOTLB_TYPE || type == QI_DEIOTLB_TYPE) && pdev) + if (!pci_device_is_present(pdev)) + break; /* * We will leave the interrupts disabled, to prevent interrupt * context to queue another cmd while a cmd is already submitted From patchwork Thu Dec 28 00:16:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ethan Zhao X-Patchwork-Id: 183585 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:6f82:b0:100:9c79:88ff with SMTP id tb2csp1732463dyb; Wed, 27 Dec 2023 16:17:53 -0800 (PST) X-Google-Smtp-Source: AGHT+IGIWkbOc4+XQQtVgFaVzc8eNIqxZBrfiC+eO82XNlEkss4WFKcpCuMWZUBDgKbn2QbanC0E X-Received: by 2002:a17:906:d4:b0:a26:d9a9:fff0 with SMTP id 20-20020a17090600d400b00a26d9a9fff0mr2441662eji.81.1703722673211; Wed, 27 Dec 2023 16:17:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703722673; cv=none; d=google.com; s=arc-20160816; b=cdD502xKoOvuB2PJaDJUjj/QEJD7rLqJC6Erf/X4cMqlWc94e0zx6EesoZsnG4gjUs cVUuIS8VydXNcOqfeo2JPzyR0R54W/dJ2VQE7orGkcwrDFS3ZFjlc5cujplBfxQgECoZ FIfMIud8f0teeIHxWEDj+cdaQMYqHJwQBX0QE35G5g5Y0icghO9wf5upsLQKP+xmoePP uJBWX/SxzHxJtmajx8J+GCRcbZIovxx7J0VdU5fat5kJ/AmR1saBeWKNox50+2HAR+No oFJ68sG98bbZB6rd0TLP8SdMZDm+/TOk2ifuu/ZhLxlUMmV4uMJ9ljVSqSUF8etvGv3F 0F8g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=DelDexIfre9vz5N71N3zrlf2++us0mu/7QD2oskpaOE=; fh=cQTxynQ7rGExgmbyXq8tNmd/VmE1Fzgt9QW51hABj2c=; b=MAPWU44pDM22dSFqPdNPjTEY//xLgxjeoi+5M0LCk/f1J97DR3pH0QFwIsyLSVxCUm VodgKH7EjpCYyyolrnhltTxXCaerxATOhFJko3ZDrr06nBq1dO8DtO0GsT+y+qN+Akyp x4K1+YjtjeSOLpIf7NRpg1qg3suQOOjk3jv3JUDegHwfXG1jGJkzHarMvZtfPjKZexo9 0POAxMNaEArrR4SjRDFTh4yJFxA3Qq+Nt2nUK7INb7mmJsK7lBZuNmB1w2dGoCSIAjG1 kiUWH4oxriPrZRPk3kLYhXXMRI1zFDEmihCoInduCAziDODBLCZLR5UT05lghTdA0MYS Kmfg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=I1ZN3bdh; spf=pass (google.com: domain of linux-kernel+bounces-12316-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12316-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [147.75.80.249]) by mx.google.com with ESMTPS id vz16-20020a17090704d000b00a2335936fc9si6261961ejb.458.2023.12.27.16.17.53 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Dec 2023 16:17:53 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-12316-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) client-ip=147.75.80.249; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=I1ZN3bdh; spf=pass (google.com: domain of linux-kernel+bounces-12316-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12316-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id D03AF1F23251 for ; Thu, 28 Dec 2023 00:17:52 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6AAE423A7; Thu, 28 Dec 2023 00:17:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="I1ZN3bdh" X-Original-To: linux-kernel@vger.kernel.org Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.12]) (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 47C55323C; Thu, 28 Dec 2023 00:17:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1703722621; x=1735258621; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=1qBt4D1WArrSV0MOzrBsQzAWBORFHOsqP7rl6KWn9uo=; b=I1ZN3bdhkNE7fM+1TwmsmoeGMLWQ11T8jQ2K10y6gCHfsZcT3hr468TJ D09b6cD/BWsxFiKs+SN+OJ+flBSHo+yN1Hzdx8D8CSJ2fpn1dwkYE4Ucu g0lFS0iCMU1coQqcCZXFH/g62N89z6ClvGkp0Q0Smt/zXT1I6wEPaRI+X vKf9kq+paObt8U/NdM/RwH/8J3BxBP5kG2NcDfBnFZscahrMqqgur+RbB VZaBma0FKrGI92PumfUjy0jPpQimt/Rn9SaNJv5viO3whJBrvYqZmQ4FP cL/QqVUXVXPcprGs1ewgw5FTNiISRxU9CcuBFTJHcPQO9ZJcTg1ed4sYp g==; X-IronPort-AV: E=McAfee;i="6600,9927,10936"; a="3800486" X-IronPort-AV: E=Sophos;i="6.04,310,1695711600"; d="scan'208";a="3800486" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orvoesa104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Dec 2023 16:17:00 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10936"; a="848812692" X-IronPort-AV: E=Sophos;i="6.04,310,1695711600"; d="scan'208";a="848812692" Received: from ply01-vm-store.bj.intel.com ([10.238.153.201]) by fmsmga004.fm.intel.com with ESMTP; 27 Dec 2023 16:16:57 -0800 From: Ethan Zhao To: bhelgaas@google.com, baolu.lu@linux.intel.com, dwmw2@infradead.org, will@kernel.org, robin.murphy@arm.com, lukas@wunner.de Cc: linux-pci@vger.kernel.org, iommu@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [RFC PATCH v9 3/5] PCI: make pci_dev_is_disconnected() helper public for other drivers Date: Wed, 27 Dec 2023 19:16:44 -0500 Message-Id: <20231228001646.587653-4-haifeng.zhao@linux.intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20231228001646.587653-1-haifeng.zhao@linux.intel.com> References: <20231228001646.587653-1-haifeng.zhao@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1786482705991005611 X-GMAIL-MSGID: 1786482705991005611 Make pci_dev_is_disconnected() public so that it can be called from Intel VT-d driver to quickly fix/workaround the surprise removal unplug hang issue for those ATS capable devices on PCIe switch downstream hotplug capable ports. Beside pci_device_is_present() function, this one has no config space space access, so is light enough to optimize the normal pure surprise removal and safe removal flow. Tested-by: Haorong Ye Signed-off-by: Ethan Zhao --- drivers/pci/pci.h | 5 ----- include/linux/pci.h | 5 +++++ 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 5ecbcf041179..75fa2084492f 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -366,11 +366,6 @@ static inline int pci_dev_set_disconnected(struct pci_dev *dev, void *unused) return 0; } -static inline bool pci_dev_is_disconnected(const struct pci_dev *dev) -{ - return dev->error_state == pci_channel_io_perm_failure; -} - /* pci_dev priv_flags */ #define PCI_DEV_ADDED 0 #define PCI_DPC_RECOVERED 1 diff --git a/include/linux/pci.h b/include/linux/pci.h index dea043bc1e38..4779eec8b267 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -2506,6 +2506,11 @@ static inline struct pci_dev *pcie_find_root_port(struct pci_dev *dev) return NULL; } +static inline bool pci_dev_is_disconnected(const struct pci_dev *dev) +{ + return dev->error_state == pci_channel_io_perm_failure; +} + void pci_request_acs(void); bool pci_acs_enabled(struct pci_dev *pdev, u16 acs_flags); bool pci_acs_path_enabled(struct pci_dev *start, From patchwork Thu Dec 28 00:16:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ethan Zhao X-Patchwork-Id: 183586 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:6f82:b0:100:9c79:88ff with SMTP id tb2csp1732529dyb; Wed, 27 Dec 2023 16:18:04 -0800 (PST) X-Google-Smtp-Source: AGHT+IFwFq36bdvL1CCeIw7H8V48GnRybaNTsP558BuIyDciQvh+a3tUeXibdr5E6GF9vvG49rfa X-Received: by 2002:a05:6a00:1889:b0:6d9:bcc4:4d08 with SMTP id x9-20020a056a00188900b006d9bcc44d08mr2484322pfh.56.1703722683990; Wed, 27 Dec 2023 16:18:03 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703722683; cv=none; d=google.com; s=arc-20160816; b=KXgNCVdFoDO/iz4qhGjK7W3PTM51KArEghD1JDSNtP08AeRDlh/qUDNcfSoEuRz/Sb btaOf61h9rVMPpbbETEWcVlbJ1+5f0YUIdfUMv2nYOzcJSv+yk4AgFd0slI4q1D/89oK xkqotusZAScJVswC1/RDceEK+meHQDgex785Ybzw5/knIfLxgOdYQW6JHsNfXwJ3Zsqh oKSAYadKnqGrk730Y1Mi7GgU81J563v6642dgwjP5yFH2FIbbl/aja1EjAMU9WraiV5p mOfJUdSGhWgqT0bnNwgusJY8KyJQFl79WrDOXNvf10+ABQmCgHTi/ZXK9W7uwwATS/HB 9esA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=V9Dlj6yC7MD7HzmsJ/6rTf1ZRUKqYS5WSjQWEeNdJOU=; fh=cQTxynQ7rGExgmbyXq8tNmd/VmE1Fzgt9QW51hABj2c=; b=F0chdgQldOOA8TWtF30BYgVxTYwku5kkViG/1KsE7qeJzjp88i/RPPTBLodEUAMnzU tTJ4MftB7PQCzAQTi87x+orOcWWUsWz+oLR0HWh+U2ZGxSeIEJIEu8pULObHeZkWOFAV REhujNSz1bt0BYysa5pSLU2I/pjTzFV/ZHT7/RrYi3FIgdItf/t/r0VglcDECXlTTEzD deuN2IzqJ0N272/clgunB+qFLt2KfSq4hBuhGibkZYQ/ch20tpixBAVANsljfxm5AZDh j74xrZWOpGWi6OfQsFdhD+ayvJyM6ILmETqFIgPFCr2fehwwzbSo2EJMAMrHVb2VuIxt zcyA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=MigY8J2b; spf=pass (google.com: domain of linux-kernel+bounces-12317-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12317-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id ey23-20020a056a0038d700b006d9aab1bbd4si7261002pfb.77.2023.12.27.16.18.03 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Dec 2023 16:18:03 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-12317-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=MigY8J2b; spf=pass (google.com: domain of linux-kernel+bounces-12317-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12317-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 5E1B128402A for ; Thu, 28 Dec 2023 00:18:03 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id BAFC96FC4; Thu, 28 Dec 2023 00:17:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="MigY8J2b" X-Original-To: linux-kernel@vger.kernel.org Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.12]) (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 D3E61468A; Thu, 28 Dec 2023 00:17:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1703722623; x=1735258623; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=IPG70dq4MxJlSWKi/4rQ7H5/6g4MZ38NrEOljwVuQN0=; b=MigY8J2buM8ebR/ekEsKQ3yWDQrFM4C4qQ7uEDJAZKcGVDavH6ocIlBD RuORMT7Nr9cIpwnrVbCQNnDLgjAK0oF5Y+kJZABUBKPqej0Lgqd1fJOyZ JrgCilmMpdHN26vOL/L2+pBFw1Ip3kwFWI+OKzRcWDf+5s08BeECRULs1 9Z4vMqKU69TYHQda3l4yrEH/ZQO2S+3iyYxlI3FfGIrMnX7Z3Tm3nHpic r1/CmbY+cf1G6F972/fpu33LaU+Naq90ga6isyDfnvQBTbfuRg5N6WwSo 1yvbbPfG+nQQFBf+Ux4tRBJehzl/7RGMq2DoZo8Ods8OcR5VXdl3iAVjq Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10936"; a="3800498" X-IronPort-AV: E=Sophos;i="6.04,310,1695711600"; d="scan'208";a="3800498" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orvoesa104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Dec 2023 16:17:03 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10936"; a="848812704" X-IronPort-AV: E=Sophos;i="6.04,310,1695711600"; d="scan'208";a="848812704" Received: from ply01-vm-store.bj.intel.com ([10.238.153.201]) by fmsmga004.fm.intel.com with ESMTP; 27 Dec 2023 16:17:00 -0800 From: Ethan Zhao To: bhelgaas@google.com, baolu.lu@linux.intel.com, dwmw2@infradead.org, will@kernel.org, robin.murphy@arm.com, lukas@wunner.de Cc: linux-pci@vger.kernel.org, iommu@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [RFC PATCH v9 4/5] iommu/vt-d: don't issue ATS Invalidation request when device is disconnected Date: Wed, 27 Dec 2023 19:16:45 -0500 Message-Id: <20231228001646.587653-5-haifeng.zhao@linux.intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20231228001646.587653-1-haifeng.zhao@linux.intel.com> References: <20231228001646.587653-1-haifeng.zhao@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1786482717248544646 X-GMAIL-MSGID: 1786482717248544646 Except those aggressive hotplug cases - surprise remove a hotplug device while its safe removal is requested and handled in process by: 1. pull it out directly. 2. turn off its power. 3. bring the link down. 4. just died there that moment. etc, in a word, 'gone' or 'disconnected'. Mostly are regular normal safe removal and surprise removal unplug. these hot unplug handling process could be optimized for fix the ATS Invalidation hang issue by calling pci_dev_is_disconnected() in function devtlb_invalidation_with_pasid() to check target device state to avoid sending meaningless ATS Invalidation request to iommu when device is gone. (see IMPLEMENTATION NOTE in PCIe spec r6.1 section 10.3.1) For safe removal, device wouldn't be removed untill the whole software handling process is done, it wouldn't trigger the hard lock up issue caused by too long ATS Invalidation timeout wait. In safe removal path, device state isn't set to pci_channel_io_perm_failure in pciehp_unconfigure_device() by checking 'presence' parameter, calling pci_dev_is_disconnected() in devtlb_invalidation_with_pasid() will return false there, wouldn't break the function. For surprise removal, device state is set to pci_channel_io_perm_failure in pciehp_unconfigure_device(), means device is already gone (disconnected) call pci_dev_is_disconnected() in devtlb_invalidation_with_pasid() will return true to break the function not to send ATS Invalidation request to the disconnected device blindly, thus avoid the further long time waiting triggers the hard lockup. safe removal & surprise removal pciehp_ist() pciehp_handle_presence_or_link_change() pciehp_disable_slot() remove_board() pciehp_unconfigure_device(presence) Tested-by: Haorong Ye Signed-off-by: Ethan Zhao --- drivers/iommu/intel/pasid.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/iommu/intel/pasid.c b/drivers/iommu/intel/pasid.c index 1c87fb1b1039..a08bdbec90eb 100644 --- a/drivers/iommu/intel/pasid.c +++ b/drivers/iommu/intel/pasid.c @@ -481,6 +481,9 @@ devtlb_invalidation_with_pasid(struct intel_iommu *iommu, if (!info || !info->ats_enabled) return; + if (pci_dev_is_disconnected(to_pci_dev(dev))) + return; + sid = info->bus << 8 | info->devfn; qdep = info->ats_qdep; pfsid = info->pfsid; From patchwork Thu Dec 28 00:16:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ethan Zhao X-Patchwork-Id: 183587 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:6f82:b0:100:9c79:88ff with SMTP id tb2csp1732589dyb; Wed, 27 Dec 2023 16:18:17 -0800 (PST) X-Google-Smtp-Source: AGHT+IGTpkWPN5nvvb+0tk8EUaNF+GnMJ5Smh7OCHHxjsVl+FuCzRGWzFdJvkjLdZXnyifEO64M1 X-Received: by 2002:a05:620a:229:b0:77d:8946:11c3 with SMTP id u9-20020a05620a022900b0077d894611c3mr9727787qkm.34.1703722696987; Wed, 27 Dec 2023 16:18:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703722696; cv=none; d=google.com; s=arc-20160816; b=uLShvqgKH+hhy5b2Fj/BE7RJGMYA885Ti9D+lrhJ11GxQjZyat2VuIGcKL5a0dc1KD kxV12ZbYX2fRxHBcxixpRPbEdDWDkALRTdzeGYazQZ5UueI5ZbQDuBiyLldgx0xvetox LB0vllkYJAADQB0ZQCP6fTaYHy06ZeXTZADFgudOlGHqLMy4ZEK1ENvr6Vbx9Ug5flo/ +roYlIxmS5/1Ii32mwf5iYfEsXaPvQsqzy/bBiE2g12IkoG2nAJmQFN5yB8LzmBc4std eIf3sPSqBaeCmLBLjhjSPr1LscuE7Yizuf2DlD0Aem12GvNJugmfkpIGqRkZ0PJv8akX Y8+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=Hhy3PCWrIjpEthT0ZHydK8llmvz3gBBkZEy9Oq9L0Bk=; fh=cQTxynQ7rGExgmbyXq8tNmd/VmE1Fzgt9QW51hABj2c=; b=V0pMyA5REel+/64pAA1onKjDsEnbIgGf6Hw4sYxezBGY4Ny7I5hjo2Bs69rhEge1zl CyPJvQ2A3ZtenG1rJdGjpz1dBj3zPEHNxLSKxyzVUQvzZ8fynPqvGBccQGYWIYj+AAjg mYRFp2crBOMlnVM3Y5uzihQRJyaEeVuGbSEvPoVUDXPPxz0jaRB2ouwQY9EmtkPjxjdU P+95Zwc/TXHVjh/hdKMyvF9dHDBiPLg6tOJtPt21U9CKq7pA7kSYa6TFXSTvlMLCzoeO L29akKbp1mIS7sqqIqzo+6oNW7PJFZ37yiNlqWy4M8LXEDX1cm8saLJ4yT8tetu0pJyc toCg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=NcDQUH4J; spf=pass (google.com: domain of linux-kernel+bounces-12318-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12318-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id u9-20020a05620a430900b0077f91185dcasi16555189qko.98.2023.12.27.16.18.16 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Dec 2023 16:18:16 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-12318-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=NcDQUH4J; spf=pass (google.com: domain of linux-kernel+bounces-12318-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-12318-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id B720D1C20F0C for ; Thu, 28 Dec 2023 00:18:16 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 480B58466; Thu, 28 Dec 2023 00:17:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="NcDQUH4J" X-Original-To: linux-kernel@vger.kernel.org Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.12]) (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 3E1326ABC; Thu, 28 Dec 2023 00:17:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1703722627; x=1735258627; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=zVZqQhADGmi9C9GQU0Rpvfm53YSnRw8E732emv+/c8g=; b=NcDQUH4JDI1HBp3eglGmJZl89vtfPsh8WVHzAUUetgSTQ/CCagVoO386 kP6KQYoFPmfaB3giiSzmp87rMLpIueBejui7nR7OHqiikCCd56QSrddhU Rgepi500nsF5pZWHFbEfsLCBWkCjsGbi/jfUilniZjW9iAPEyXgPY3mfg jSzTlURgPBrOAiirFygFJ1UnAFWGrECrdGQQBzFtrChPaO5heCewJ/SG+ AuXxCtDkC/fWHOMsWChe2op6RUR2IKsUzePrWwfrOjaxrt4hGJnSYykK6 11dntf1TTw8Q3VrWZlrQzcT6QE7aP+4iOe6o9rQ8OvkniX5UMtlYOonY8 A==; X-IronPort-AV: E=McAfee;i="6600,9927,10936"; a="3800513" X-IronPort-AV: E=Sophos;i="6.04,310,1695711600"; d="scan'208";a="3800513" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orvoesa104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Dec 2023 16:17:06 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10936"; a="848812712" X-IronPort-AV: E=Sophos;i="6.04,310,1695711600"; d="scan'208";a="848812712" Received: from ply01-vm-store.bj.intel.com ([10.238.153.201]) by fmsmga004.fm.intel.com with ESMTP; 27 Dec 2023 16:17:02 -0800 From: Ethan Zhao To: bhelgaas@google.com, baolu.lu@linux.intel.com, dwmw2@infradead.org, will@kernel.org, robin.murphy@arm.com, lukas@wunner.de Cc: linux-pci@vger.kernel.org, iommu@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [RFC PATCH v9 5/5] iommu/vt-d: don't loop for timeout ATS Invalidation request forever Date: Wed, 27 Dec 2023 19:16:46 -0500 Message-Id: <20231228001646.587653-6-haifeng.zhao@linux.intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20231228001646.587653-1-haifeng.zhao@linux.intel.com> References: <20231228001646.587653-1-haifeng.zhao@linux.intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1786482730508485937 X-GMAIL-MSGID: 1786482730508485937 When the ATS Invalidation request timeout happens, the qi_submit_sync() will restart and loop for the invalidation request forever till it is done, it will block another Invalidation thread such as the fq_timer to issue invalidation request, cause the system lockup as following [exception RIP: native_queued_spin_lock_slowpath+92] RIP: ffffffffa9d1025c RSP: ffffb202f268cdc8 RFLAGS: 00000002 RAX: 0000000000000101 RBX: ffffffffab36c2a0 RCX: 0000000000000000 RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffffffffab36c2a0 RBP: ffffffffab36c2a0 R8: 0000000000000001 R9: 0000000000000000 R10: 0000000000000010 R11: 0000000000000018 R12: 0000000000000000 R13: 0000000000000004 R14: ffff9e10d71b1c88 R15: ffff9e10d71b1980 ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018 #12 [ffffb202f268cdc8] native_queued_spin_lock_slowpath at ffffffffa9d1025c #13 [ffffb202f268cdc8] do_raw_spin_lock at ffffffffa9d121f1 #14 [ffffb202f268cdd8] _raw_spin_lock_irqsave at ffffffffaa51795b #15 [ffffb202f268cdf8] iommu_flush_dev_iotlb at ffffffffaa20df48 #16 [ffffb202f268ce28] iommu_flush_iova at ffffffffaa20e182 #17 [ffffb202f268ce60] iova_domain_flush at ffffffffaa220e27 #18 [ffffb202f268ce70] fq_flush_timeout at ffffffffaa221c9d #19 [ffffb202f268cea8] call_timer_fn at ffffffffa9d46661 #20 [ffffb202f268cf08] run_timer_softirq at ffffffffa9d47933 #21 [ffffb202f268cf98] __softirqentry_text_start at ffffffffaa8000e0 #22 [ffffb202f268cff0] asm_call_sysvec_on_stack at ffffffffaa60114f --- --- (the left part of exception see the hotplug case of ATS capable device) If one endpoint device just no response to the ATS Invalidation request, but is not gone, it will bring down the whole system, to avoid such case, don't try the timeout ATS Invalidation request forever. Signed-off-by: Ethan Zhao --- drivers/iommu/intel/dmar.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c index 76903a8bf963..206ab0b7294f 100644 --- a/drivers/iommu/intel/dmar.c +++ b/drivers/iommu/intel/dmar.c @@ -1457,7 +1457,7 @@ int qi_submit_sync(struct intel_iommu *iommu, struct qi_desc *desc, reclaim_free_desc(qi); raw_spin_unlock_irqrestore(&qi->q_lock, flags); - if (rc == -EAGAIN) + if (rc == -EAGAIN && type !=QI_DIOTLB_TYPE && type != QI_DEIOTLB_TYPE) goto restart; if (iotlb_start_ktime)