Received: by 2002:a05:7412:d1aa:b0:fc:a2b0:25d7 with SMTP id ba42csp187340rdb; Sun, 28 Jan 2024 21:05:56 -0800 (PST) X-Google-Smtp-Source: AGHT+IEPk28u0M0K71kNMrQy2HzCmNKSifHcPFb8b3prvHj8dIEVq9f/iqL44xiJFbUBr6DZuuiJ X-Received: by 2002:a17:902:ba83:b0:1d8:8aba:4b07 with SMTP id k3-20020a170902ba8300b001d88aba4b07mr4304415pls.60.1706504755922; Sun, 28 Jan 2024 21:05:55 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1706504755; cv=pass; d=google.com; s=arc-20160816; b=0PLLxbn1EQ/efmpVic3LUU0KYCHjC1ENQv53OG1tx/Tk2+U8jXBw1QxvrHZKilBidN gQGflQZO/+GACWfucbI3emhWl2a6PetWNsdGeMH7lJqHbl3Mkh43nBLDIkhA96tYARRm 49oXvmE5GflI4ULtCgiyZ1FVf15333RjobffXOjQkc4J7t3rIt4PoFI9b4SE7eSh4z4T DqBOmXsPoMVMLkrwIILR6n1JFP98ChfiqCxSmOmEZxt8QTZNefbDQ4ieCnnOVwfHyM9F 68uYtYCNEfBnGKmkMBbZyupX0+HavWn1iWlNa8/5GadOph2GStld2fCELlq7CSMJLYFU kLkQ== ARC-Message-Signature: i=2; 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=4TdSEW2Fk+HOAqoFCBS2hrlSPptUsRI1XmmLE3MWbWU=; fh=/SLtzouTDi4mp2pDtrWVI57CT6E/9R7N6aU04uxBbCs=; b=B7pttROuPiywElEkVpFYJenSNogD6yk6SE4vMxoH12lYUka7VJDrX7gGcY+HrN4a0Z Y9YsXmEDzeMQUwFpmKwAAg3kVcX3K3jBvy8IuG40wPhzKq0wwKbDDv800Mi/CknU4hRJ xIUbg21c0y31EbDblBbobraXTQynnIWWRB04KyVQToH8H8SvQv16vUy00V4COv4D+5br 7x34EcO31RNaY4vc+R4EUPF2RjZGQBzcb0ZISoSyMtqqe7LvZO5pEGgtbTxarduEf68T cIQ6XpnvXys8HZQFoPgu1JHLv7xk0kSX2lDMGYYxBjj9qJAQwhDYMovFGcLRBmYlcUNE lPqQ== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=hYkN1Bvj; arc=pass (i=1 dkim=pass dkdomain=intel.com dmarc=pass fromdomain=linux.intel.com); spf=pass (google.com: domain of linux-kernel+bounces-42145-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-42145-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [2604:1380:40f1:3f00::1]) by mx.google.com with ESMTPS id t11-20020a170902d28b00b001d8dbd0bb24si1277162plc.310.2024.01.28.21.05.55 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 28 Jan 2024 21:05:55 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-42145-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) client-ip=2604:1380:40f1:3f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=hYkN1Bvj; arc=pass (i=1 dkim=pass dkdomain=intel.com dmarc=pass fromdomain=linux.intel.com); spf=pass (google.com: domain of linux-kernel+bounces-42145-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-42145-linux.lists.archive=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 sy.mirrors.kernel.org (Postfix) with ESMTPS id BA007B234F7 for ; Mon, 29 Jan 2024 03:51:04 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E2AB2433CF; Mon, 29 Jan 2024 03:49:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="hYkN1Bvj" Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.65]) (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 A4D243D3AC; Mon, 29 Jan 2024 03:49:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=134.134.136.65 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706500195; cv=none; b=DTdTn3Y7ebLgZsa+NM4LDL4CLptMkBjN6O1dZwdO+GcIAkliU/7yiJ8oMdCkD0FLkCjVN5f0qHhE5nE7d0E8+lBaYHAIbknlcGVh6HQs5BkxFYGxGttBwLJL1lkmWLyy9UoGoZMsVIx4M71PTLNoTjHSFHfW/HXb7rfP+GS5otg= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706500195; c=relaxed/simple; bh=wPg3myQaPF0qFlpHC2hxG+yDxWid8qb2MJ2wr7C9/2Y=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=K3WRQtAl2+wPFH5AMCy1350dDpOiCavB5wOFPH/xBrKUyXgd9+LGrCdxzybr64z3s0qJL7HXJEPYGZVocJfoQ9RlbcFJp3XOgD4kQyW7UJaiNIz1A/hTyaBmVbpNIwptMY9AFc6s9eWr/3m7y+VX8pEptYUmVG7X/oVmsAbKAbc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=none smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=hYkN1Bvj; arc=none smtp.client-ip=134.134.136.65 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=1706500193; x=1738036193; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=wPg3myQaPF0qFlpHC2hxG+yDxWid8qb2MJ2wr7C9/2Y=; b=hYkN1Bvj0jgdIxdpfZyr4VF6eOwnfCs7nwcGKLgiOG9wBKbiRFU30PST gtb+7b08KIK9i2ilWtvWYATqsroVy7MmzMyAvp3u43wUPidEs//+KEBwY sTrESHVcWViC3MrE12GH6B356NyyUjQ0lCYyVR/DlPWx3cykPKbYYAftB AVD1bPnjXShXBzNSchobmx8+Mhk2P/kzLXHTqwGiSYjbzpzCOP+DVJqar xs06RImP6654a+CZ1HjAcTqwaAQGqq81CutOCHtLLRsI/7oF08oiOXHWM Y3kEZHHIZdytsOV8viAFtCMZokln5cclt4zbVryswpjZQgG3xVgEw59pg Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10967"; a="406566972" X-IronPort-AV: E=Sophos;i="6.05,226,1701158400"; d="scan'208";a="406566972" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jan 2024 19:49:53 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10967"; a="960775230" X-IronPort-AV: E=Sophos;i="6.05,226,1701158400"; d="scan'208";a="960775230" Received: from unknown (HELO ply01-vm-store.amr.corp.intel.com) ([10.238.153.201]) by orsmga005.jf.intel.com with ESMTP; 28 Jan 2024 19:49:49 -0800 From: Ethan Zhao To: baolu.lu@linux.intel.com, bhelgaas@google.com, robin.murphy@arm.com, jgg@ziepe.ca Cc: kevin.tian@intel.com, dwmw2@infradead.org, will@kernel.org, lukas@wunner.de, yi.l.liu@intel.com, iommu@lists.linux.dev, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, Ethan Zhao Subject: [PATCH v12 5/5] iommu/vt-d: improve ITE fault handling if target device isn't present Date: Sun, 28 Jan 2024 22:49:24 -0500 Message-Id: <20240129034924.817005-6-haifeng.zhao@linux.intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20240129034924.817005-1-haifeng.zhao@linux.intel.com> References: <20240129034924.817005-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 Content-Transfer-Encoding: 8bit Because surprise removal could happen anytime, e.g. user could request safe removal to EP(endpoint device) via sysfs and brings its link down to do surprise removal cocurrently. such aggressive cases would cause ATS invalidation request issued to non-existence target device, then deadly loop to retry that request after ITE fault triggered in interrupt context. this patch aims to optimize the ITE handling by checking the target device presence state to avoid retrying the timeout request blindly, thus avoid hard lockup or system hang. Signed-off-by: Ethan Zhao --- drivers/iommu/intel/dmar.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c index 814134e9aa5a..2e214b43725c 100644 --- a/drivers/iommu/intel/dmar.c +++ b/drivers/iommu/intel/dmar.c @@ -1272,6 +1272,7 @@ static int qi_check_fault(struct intel_iommu *iommu, int index, int wait_index, { u32 fault; int head, tail; + u64 iqe_err, ite_sid; struct q_inval *qi = iommu->qi; int shift = qi_shift(iommu); @@ -1316,6 +1317,13 @@ static int qi_check_fault(struct intel_iommu *iommu, int index, int wait_index, tail = readl(iommu->reg + DMAR_IQT_REG); tail = ((tail >> shift) - 1 + QI_LENGTH) % QI_LENGTH; + /* + * SID field is valid only when the ITE field is Set in FSTS_REG + * see Intel VT-d spec r4.1, section 11.4.9.9 + */ + iqe_err = dmar_readq(iommu->reg + DMAR_IQER_REG); + ite_sid = DMAR_IQER_REG_ITESID(iqe_err); + writel(DMA_FSTS_ITE, iommu->reg + DMAR_FSTS_REG); pr_info("Invalidation Time-out Error (ITE) cleared\n"); @@ -1325,6 +1333,16 @@ static int qi_check_fault(struct intel_iommu *iommu, int index, int wait_index, head = (head - 2 + QI_LENGTH) % QI_LENGTH; } while (head != tail); + /* + * If got ITE, we need to check if the sid of ITE is the same as + * current ATS invalidation target device, if yes, don't try this + * request anymore if the target device isn't present. + * 0 value of ite_sid means old VT-d device, no ite_sid value. + */ + if (pdev && ite_sid && !pci_device_is_present(pdev) && + ite_sid == pci_dev_id(pci_physfn(pdev))) + return -ETIMEDOUT; + if (qi->desc_status[wait_index] == QI_ABORT) return -EAGAIN; } -- 2.31.1