All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jiang Liu <jiang.liu-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
To: Joerg Roedel <joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>,
	David Woodhouse <dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>,
	Yinghai Lu <yinghai-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
	Bjorn Helgaas <bhelgaas-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>,
	Dan Williams
	<dan.j.williams-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
	Vinod Koul <vinod.koul-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
	"Rafael J . Wysocki"
	<rafael.j.wysocki-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Cc: Tony Luck <tony.luck-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
	linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	dmaengine-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
	Jiang Liu <jiang.liu-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
Subject: [Patch Part3 V1 18/22] iommu/vt-d: update proximity information when a new node with memory available
Date: Tue, 22 Apr 2014 15:07:29 +0800	[thread overview]
Message-ID: <1398150453-28141-19-git-send-email-jiang.liu@linux.intel.com> (raw)
In-Reply-To: <1398150453-28141-1-git-send-email-jiang.liu-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>

If node associated with a DMAR unit has no memory available, it uses -1
as default NUMA node id. So when memory hot-addition adds new memory to
an empty NUMA node, we should update the NUMA node id associated with
the DMAR unit. This will help to optomize memory allocation.

Signed-off-by: Jiang Liu <jiang.liu-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
---
 drivers/iommu/dmar.c        |   50 ++++++++++++++++++++++++++++++++++++++++---
 include/linux/intel-iommu.h |    1 +
 2 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c
index 7a7383858c34..d607691a6a80 100644
--- a/drivers/iommu/dmar.c
+++ b/drivers/iommu/dmar.c
@@ -38,6 +38,7 @@
 #include <linux/tboot.h>
 #include <linux/dmi.h>
 #include <linux/slab.h>
+#include <linux/memory.h>
 #include <asm/irq_remapping.h>
 #include <asm/iommu_table.h>
 
@@ -444,6 +445,7 @@ static int dmar_parse_one_rhsa(struct acpi_dmar_header *header, void *arg)
 			if (!node_online(node))
 				node = -1;
 			drhd->iommu->node = node;
+			drhd->iommu->proximity_domain = rhsa->proximity_domain;
 			return 0;
 		}
 	}
@@ -458,8 +460,48 @@ static int dmar_parse_one_rhsa(struct acpi_dmar_header *header, void *arg)
 
 	return 0;
 }
+
+static int dmar_memory_notifier(struct notifier_block *nb,
+				unsigned long val, void *v)
+{
+	struct memory_notify *mhp = v;
+	struct dmar_drhd_unit *drhd;
+	struct intel_iommu *iommu;
+	int nid;
+
+	if (val != MEM_ONLINE)
+		return NOTIFY_OK;
+
+	if (mhp->status_change_nid < 0)
+		return NOTIFY_OK;
+
+	down_read(&dmar_global_lock);
+	for_each_iommu(iommu, drhd) {
+		if (iommu->node != -1)
+			continue;
+		nid = acpi_map_pxm_to_node(iommu->proximity_domain);
+		if (nid == mhp->status_change_nid)
+			iommu->node = nid;
+	}
+	up_read(&dmar_global_lock);
+
+	return NOTIFY_OK;
+}
+
+static struct notifier_block dmar_memory_nb = {
+	.notifier_call = dmar_memory_notifier,
+};
+
+static void dmar_register_memory_notifier(void)
+{
+	register_memory_notifier(&dmar_memory_nb);
+}
 #else
 #define	dmar_parse_one_rhsa		dmar_res_noop
+
+static void dmar_register_memory_notifier(void)
+{
+}
 #endif
 
 static void __init
@@ -1715,12 +1757,14 @@ static inline bool dmar_in_use(void)
 	return irq_remapping_enabled || intel_iommu_enabled;
 }
 
-static int __init dmar_free_unused_resources(void)
+static int __init dmar_late_init(void)
 {
 	struct dmar_drhd_unit *dmaru, *dmaru_n;
 
-	if (dmar_in_use())
+	if (dmar_in_use()) {
+		dmar_register_memory_notifier();
 		return 0;
+	}
 
 	if (dmar_dev_scope_status != 1 && !list_empty(&dmar_drhd_units))
 		bus_unregister_notifier(&pci_bus_type, &dmar_pci_bus_nb);
@@ -1735,7 +1779,7 @@ static int __init dmar_free_unused_resources(void)
 	return 0;
 }
 
-late_initcall(dmar_free_unused_resources);
+late_initcall(dmar_late_init);
 IOMMU_INIT_POST(detect_intel_iommu);
 
 /*
diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h
index 0a2da5188217..eea52ccdbd8e 100644
--- a/include/linux/intel-iommu.h
+++ b/include/linux/intel-iommu.h
@@ -337,6 +337,7 @@ struct intel_iommu {
 	struct ir_table *ir_table;	/* Interrupt remapping info */
 #endif
 	int		node;
+	int		proximity_domain;
 };
 
 static inline void __iommu_flush_cache(
-- 
1.7.10.4

WARNING: multiple messages have this Message-ID (diff)
From: Jiang Liu <jiang.liu@linux.intel.com>
To: Joerg Roedel <joro@8bytes.org>,
	David Woodhouse <dwmw2@infradead.org>,
	Yinghai Lu <yinghai@kernel.org>,
	Bjorn Helgaas <bhelgaas@google.com>,
	Dan Williams <dan.j.williams@intel.com>,
	Vinod Koul <vinod.koul@intel.com>,
	"Rafael J . Wysocki" <rafael.j.wysocki@intel.com>
Cc: Jiang Liu <jiang.liu@linux.intel.com>,
	Ashok Raj <ashok.raj@intel.com>,
	Yijing Wang <wangyijing@huawei.com>,
	Tony Luck <tony.luck@intel.com>,
	iommu@lists.linux-foundation.org, linux-pci@vger.kernel.org,
	linux-kernel@vger.kernel.org, dmaengine@vger.kernel.org
Subject: [Patch Part3 V1 18/22] iommu/vt-d: update proximity information when a new node with memory available
Date: Tue, 22 Apr 2014 15:07:29 +0800	[thread overview]
Message-ID: <1398150453-28141-19-git-send-email-jiang.liu@linux.intel.com> (raw)
In-Reply-To: <1398150453-28141-1-git-send-email-jiang.liu@linux.intel.com>

If node associated with a DMAR unit has no memory available, it uses -1
as default NUMA node id. So when memory hot-addition adds new memory to
an empty NUMA node, we should update the NUMA node id associated with
the DMAR unit. This will help to optomize memory allocation.

Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
---
 drivers/iommu/dmar.c        |   50 ++++++++++++++++++++++++++++++++++++++++---
 include/linux/intel-iommu.h |    1 +
 2 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c
index 7a7383858c34..d607691a6a80 100644
--- a/drivers/iommu/dmar.c
+++ b/drivers/iommu/dmar.c
@@ -38,6 +38,7 @@
 #include <linux/tboot.h>
 #include <linux/dmi.h>
 #include <linux/slab.h>
+#include <linux/memory.h>
 #include <asm/irq_remapping.h>
 #include <asm/iommu_table.h>
 
@@ -444,6 +445,7 @@ static int dmar_parse_one_rhsa(struct acpi_dmar_header *header, void *arg)
 			if (!node_online(node))
 				node = -1;
 			drhd->iommu->node = node;
+			drhd->iommu->proximity_domain = rhsa->proximity_domain;
 			return 0;
 		}
 	}
@@ -458,8 +460,48 @@ static int dmar_parse_one_rhsa(struct acpi_dmar_header *header, void *arg)
 
 	return 0;
 }
+
+static int dmar_memory_notifier(struct notifier_block *nb,
+				unsigned long val, void *v)
+{
+	struct memory_notify *mhp = v;
+	struct dmar_drhd_unit *drhd;
+	struct intel_iommu *iommu;
+	int nid;
+
+	if (val != MEM_ONLINE)
+		return NOTIFY_OK;
+
+	if (mhp->status_change_nid < 0)
+		return NOTIFY_OK;
+
+	down_read(&dmar_global_lock);
+	for_each_iommu(iommu, drhd) {
+		if (iommu->node != -1)
+			continue;
+		nid = acpi_map_pxm_to_node(iommu->proximity_domain);
+		if (nid == mhp->status_change_nid)
+			iommu->node = nid;
+	}
+	up_read(&dmar_global_lock);
+
+	return NOTIFY_OK;
+}
+
+static struct notifier_block dmar_memory_nb = {
+	.notifier_call = dmar_memory_notifier,
+};
+
+static void dmar_register_memory_notifier(void)
+{
+	register_memory_notifier(&dmar_memory_nb);
+}
 #else
 #define	dmar_parse_one_rhsa		dmar_res_noop
+
+static void dmar_register_memory_notifier(void)
+{
+}
 #endif
 
 static void __init
@@ -1715,12 +1757,14 @@ static inline bool dmar_in_use(void)
 	return irq_remapping_enabled || intel_iommu_enabled;
 }
 
-static int __init dmar_free_unused_resources(void)
+static int __init dmar_late_init(void)
 {
 	struct dmar_drhd_unit *dmaru, *dmaru_n;
 
-	if (dmar_in_use())
+	if (dmar_in_use()) {
+		dmar_register_memory_notifier();
 		return 0;
+	}
 
 	if (dmar_dev_scope_status != 1 && !list_empty(&dmar_drhd_units))
 		bus_unregister_notifier(&pci_bus_type, &dmar_pci_bus_nb);
@@ -1735,7 +1779,7 @@ static int __init dmar_free_unused_resources(void)
 	return 0;
 }
 
-late_initcall(dmar_free_unused_resources);
+late_initcall(dmar_late_init);
 IOMMU_INIT_POST(detect_intel_iommu);
 
 /*
diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h
index 0a2da5188217..eea52ccdbd8e 100644
--- a/include/linux/intel-iommu.h
+++ b/include/linux/intel-iommu.h
@@ -337,6 +337,7 @@ struct intel_iommu {
 	struct ir_table *ir_table;	/* Interrupt remapping info */
 #endif
 	int		node;
+	int		proximity_domain;
 };
 
 static inline void __iommu_flush_cache(
-- 
1.7.10.4


  parent reply	other threads:[~2014-04-22  7:07 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-22  7:07 [RFC Patch Part3 V1 00/22] Enable Intel DMAR device hotplug Jiang Liu
     [not found] ` <1398150453-28141-1-git-send-email-jiang.liu-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2014-04-22  7:07   ` [Patch Part3 V1 01/22] iommu/vt-d: match segment number when searching for dev_iotlb capable devices Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  7:07   ` [Patch Part3 V1 02/22] iommu/vt-d: use correct domain id to flush virtual machine domains Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  7:07   ` [Patch Part3 V1 03/22] iommu/vt-d: introduce helper functions to improve code readability Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  7:07   ` [Patch Part3 V1 04/22] iommu/vt-d: introduce helper functions to make code symmetric for readability Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  7:07   ` [Patch Part3 V1 05/22] iommu/vt-d: only dynamically allocate domain id for virtual domains Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  7:07   ` [Patch Part3 V1 06/22] iommu/vt-d: fix possible invalid memory access caused by free_dmar_iommu() Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  7:07   ` [Patch Part3 V1 07/22] iommu/vt-d: avoid freeing virtual machine domain in free_dmar_iommu() Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  7:07   ` [Patch Part3 V1 08/22] iommu/VT-d: simplify include/linux/dmar.h Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  7:07   ` [Patch Part3 V1 09/22] iommu/vt-d: change iommu_enable/disable_translation to return void Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  7:07   ` [Patch Part3 V1 10/22] iommu/vt-d: dynamically allocate and free seq_id for DMAR units Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  7:07   ` [Patch Part3 V1 11/22] IOMMU/vt-d: introduce helper function dmar_walk_resources() Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  7:07   ` [Patch Part3 V1 12/22] iommu/vt-d: implement DMAR unit hotplug framework Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  7:07   ` [Patch Part3 V1 13/22] iommu/vt-d: search _DSM method for DMAR hotplug Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  7:07   ` [Patch Part3 V1 14/22] iommu/vt-d: enhance intel_irq_remapping driver to support DMAR unit hotplug Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  7:07   ` [Patch Part3 V1 15/22] iommu/vt-d: enhance error recovery in function intel_enable_irq_remapping() Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  7:07   ` [Patch Part3 V1 16/22] iommu/vt-d: enhance intel-iommu driver to support DMAR unit hotplug Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  7:07   ` [Patch Part3 V1 17/22] pci, ACPI, iommu: enhance pci_root to support DMAR device hotplug Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  9:49     ` Rafael J. Wysocki
2014-05-05  8:31       ` Jiang Liu
     [not found]     ` <1398150453-28141-18-git-send-email-jiang.liu-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2014-04-24 17:33       ` Bjorn Helgaas
2014-04-24 17:33         ` Bjorn Helgaas
2014-05-05  8:22         ` Jiang Liu
2014-04-22  7:07   ` Jiang Liu [this message]
2014-04-22  7:07     ` [Patch Part3 V1 18/22] iommu/vt-d: update proximity information when a new node with memory available Jiang Liu
2014-04-22  7:07   ` [Patch Part3 V1 19/22] iommu/vt-d: simplify intel_unmap_sg() and kill duplicated code Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  7:38     ` David Woodhouse
2014-04-22  7:42       ` Jiang Liu
2014-04-22  7:07   ` [Patch Part3 V1 20/22] iommu/vt-d: introduce helper domain_pfn_within_range() to simplify code Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  7:07   ` [Patch Part3 V1 21/22] iommu/vt-d: introduce helper function iova_size() to improve code readability Jiang Liu
2014-04-22  7:07     ` Jiang Liu
2014-04-22  7:07 ` [Patch Part3 V1 22/22] iommu/vt-d: fix bug in computing domain's iommu_snooping flag 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=1398150453-28141-19-git-send-email-jiang.liu@linux.intel.com \
    --to=jiang.liu-vuqaysv1563yd54fqh9/ca@public.gmane.org \
    --cc=bhelgaas-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org \
    --cc=dan.j.williams-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
    --cc=dmaengine-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org \
    --cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
    --cc=joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=rafael.j.wysocki-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
    --cc=tony.luck-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
    --cc=vinod.koul-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
    --cc=yinghai-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.