linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jiang Liu <jiang.liu@linux.intel.com>
To: Joerg Roedel <joro@8bytes.org>,
	David Woodhouse <dwmw2@infradead.org>,
	Dan Williams <dan.j.williams@intel.com>,
	Vinod Koul <vinod.koul@intel.com>,
	Ashok Raj <ashok.raj@intel.com>,
	Yijing Wang <wangyijing@huawei.com>,
	iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org,
	dmaengine@vger.kernel.org
Cc: Jiang Liu <jiang.liu@linux.intel.com>,
	Tony Luck <tony.luck@intel.com>, Yinghai Lu <yinghai@kernel.org>,
	linux-pci@vger.kernel.org
Subject: [Patch Part1 V2 02/20] iommu/vt-d: fix PCI device reference leakage on error recovery path
Date: Fri,  6 Dec 2013 11:21:05 +0800	[thread overview]
Message-ID: <1386300083-6882-3-git-send-email-jiang.liu@linux.intel.com> (raw)
In-Reply-To: <1386300083-6882-1-git-send-email-jiang.liu@linux.intel.com>

Function dmar_parse_dev_scope() should release the PCI device reference
count gained in function dmar_parse_one_dev_scope() on error recovery,
otherwise will cause PCI device object leakage.

This patch also introduces dmar_free_dev_scope(), which will be used
to support DMAR device hotplug.

Reviewed-by: Yijing Wang <wangyijing@huawei.com>
Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
---
 drivers/iommu/dmar.c |   14 ++++++++++++--
 include/linux/dmar.h |    1 +
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c
index 8b452c9..c17dbf7 100644
--- a/drivers/iommu/dmar.c
+++ b/drivers/iommu/dmar.c
@@ -100,7 +100,6 @@ static int __init dmar_parse_one_dev_scope(struct acpi_dmar_device_scope *scope,
 	if (!pdev) {
 		pr_warn("Device scope device [%04x:%02x:%02x.%02x] not found\n",
 			segment, scope->bus, path->device, path->function);
-		*dev = NULL;
 		return 0;
 	}
 	if ((scope->entry_type == ACPI_DMAR_SCOPE_TYPE_ENDPOINT && \
@@ -151,7 +150,7 @@ int __init dmar_parse_dev_scope(void *start, void *end, int *cnt,
 			ret = dmar_parse_one_dev_scope(scope,
 				&(*devices)[index], segment);
 			if (ret) {
-				kfree(*devices);
+				dmar_free_dev_scope(devices, cnt);
 				return ret;
 			}
 			index ++;
@@ -162,6 +161,17 @@ int __init dmar_parse_dev_scope(void *start, void *end, int *cnt,
 	return 0;
 }
 
+void dmar_free_dev_scope(struct pci_dev ***devices, int *cnt)
+{
+	if (*devices && *cnt) {
+		while (--*cnt >= 0)
+			pci_dev_put((*devices)[*cnt]);
+		kfree(*devices);
+		*devices = NULL;
+		*cnt = 0;
+	}
+}
+
 /**
  * dmar_parse_one_drhd - parses exactly one DMA remapping hardware definition
  * structure which uniquely represent one DMA remapping hardware unit
diff --git a/include/linux/dmar.h b/include/linux/dmar.h
index b029d1a..8adfce0 100644
--- a/include/linux/dmar.h
+++ b/include/linux/dmar.h
@@ -159,6 +159,7 @@ extern int dmar_parse_one_rmrr(struct acpi_dmar_header *header);
 extern int dmar_parse_one_atsr(struct acpi_dmar_header *header);
 extern int dmar_parse_dev_scope(void *start, void *end, int *cnt,
 				struct pci_dev ***devices, u16 segment);
+extern void dmar_free_dev_scope(struct pci_dev ***devices, int *cnt);
 extern int intel_iommu_init(void);
 #else /* !CONFIG_INTEL_IOMMU: */
 static inline int intel_iommu_init(void) { return -ENODEV; }
-- 
1.7.10.4


  parent reply	other threads:[~2013-12-06  3:20 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-06  3:21 [Patch Part1 V2 00/20] Bugfixes and improvements for Intel IOMMU drivers Jiang Liu
2013-12-06  3:21 ` [Patch Part1 V2 01/20] iommu/vt-d: use dedicated bitmap to track remapping entry allocation status Jiang Liu
2013-12-06  3:21 ` Jiang Liu [this message]
2013-12-06  3:21 ` [Patch Part1 V2 03/20] iommu/vt-d: fix a race window in allocating domain ID for virtual machines Jiang Liu
2013-12-06  3:21 ` [Patch Part1 V2 04/20] iommu/vt-d: fix resource leakage on error recovery path in iommu_init_domains() Jiang Liu
2013-12-06  3:21 ` [Patch Part1 V2 05/20] iommu/vt-d, trivial: refine support of 64bit guest address Jiang Liu
2013-12-06  3:21 ` [Patch Part1 V2 06/20] iommu/vt-d, trivial: print correct domain id of static identity domain Jiang Liu
2013-12-06  3:21 ` [Patch Part1 V2 07/20] iommu/vt-d, trivial: check suitable flag in function detect_intel_iommu() Jiang Liu
2013-12-06  3:21 ` [Patch Part1 V2 08/20] iommu/vt-d, trivial: clean up unused code Jiang Liu
2013-12-06  3:21 ` [Patch Part1 V2 09/20] iommu/vt-d: mark internal functions as static Jiang Liu
2013-12-06  3:21 ` [Patch Part1 V2 10/20] iommu/vt-d, trivial: use defined macro instead of hardcoding Jiang Liu
2013-12-06  3:21 ` [Patch Part1 V2 11/20] iommu/vt-d, trivial: simplify code with existing macros Jiang Liu
2013-12-06  3:21 ` [Patch Part1 V2 12/20] iommu/vt-d: fix invalid memory access when freeing DMAR irq Jiang Liu
2013-12-06  3:21 ` [Patch Part1 V2 13/20] iommu/vt-d: keep shared resources when failed to initialize iommu devices Jiang Liu
2013-12-06  3:21 ` [Patch Part1 V2 14/20] iommu/vt-d: avoid double free in error recovery path Jiang Liu
2013-12-06  3:21 ` [Patch Part1 V2 15/20] iommu/vt-d: fix access after free issue in function free_dmar_iommu() Jiang Liu
2013-12-06  3:21 ` [Patch Part1 V2 16/20] iommu/vt-d: release invalidation queue when destroying IOMMU unit Jiang Liu
2013-12-06  3:21 ` [Patch Part1 V2 17/20] iommu/vt-d: fix wrong return value of dmar_table_init() Jiang Liu
2013-12-06  3:21 ` [Patch Part1 V2 18/20] iommu/vt-d, PCI, trivial: use dev_is_pci() instead of hardcoding Jiang Liu
2013-12-06  3:21 ` [Patch Part1 V2 19/20] iommu/vt-d, trivial: clean sparse warnings Jiang Liu
2013-12-06  3:21 ` [Patch Part1 V2 20/20] iommu/vt-d: free all resources if failed to initialize DMARs Jiang Liu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1386300083-6882-3-git-send-email-jiang.liu@linux.intel.com \
    --to=jiang.liu@linux.intel.com \
    --cc=ashok.raj@intel.com \
    --cc=dan.j.williams@intel.com \
    --cc=dmaengine@vger.kernel.org \
    --cc=dwmw2@infradead.org \
    --cc=iommu@lists.linux-foundation.org \
    --cc=joro@8bytes.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=tony.luck@intel.com \
    --cc=vinod.koul@intel.com \
    --cc=wangyijing@huawei.com \
    --cc=yinghai@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).