linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Li, Zhen-Hua" <zhen-hual@hp.com>
To: <dwmw2@infradead.org>, <indou.takao@jp.fujitsu.com>,
	<bhe@redhat.com>, <joro@8bytes.org>, <vgoyal@redhat.com>,
	<dyoung@redhat.com>
Cc: <iommu@lists.linux-foundation.org>,
	<linux-kernel@vger.kernel.org>, <linux-pci@vger.kernel.org>,
	<kexec@lists.infradead.org>, <alex.williamson@redhat.com>,
	<ddutile@redhat.com>, <ishii.hironobu@jp.fujitsu.com>,
	<bhelgaas@google.com>, <doug.hatch@hp.com>,
	<jerry.hoemann@hp.com>, <tom.vaden@hp.com>, <li.zhang6@hp.com>,
	<lisa.mitchell@hp.com>, <billsumnerlinux@gmail.com>,
	<zhen-hual@hp.com>, <rwright@hp.com>
Subject: [PATCH v10 05/10] iommu/vt-d: Add functions to load and save old re
Date: Fri, 10 Apr 2015 16:42:08 +0800	[thread overview]
Message-ID: <1428655333-19504-6-git-send-email-zhen-hual@hp.com> (raw)
In-Reply-To: <1428655333-19504-1-git-send-email-zhen-hual@hp.com>

Add functions to load root entry table from old kernel, and to save updated
root entry table.
Add two member in struct intel_iommu, to store the RTA in old kernel, and
the mapped virt address of it.

We use the old RTA in dump kernel, and when the iommu->root_entry is used as
a cache in kdump kernel, its phys address will not be save to RTA register,
but when its data is changed, we will save the new data to old root entry table.

Li, Zhen-hua:
    The functions and logics.

Takao Indoh:
    Add __iommu_flush_cache.

Signed-off-by: Li, Zhen-Hua <zhen-hual@hp.com>
Signed-off-by: Takao Indoh <indou.takao@jp.fujitsu.com>
---
 drivers/iommu/intel-iommu.c | 54 ++++++++++++++++++++++++++++++++++++++++++++-
 include/linux/intel-iommu.h |  3 +++
 2 files changed, 56 insertions(+), 1 deletion(-)

diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 5ba403a..ef8a99c 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -373,6 +373,10 @@ static struct context_entry *device_to_existing_context_entry(
 				struct intel_iommu *iommu,
 				u8 bus, u8 devfn);
 
+static void __iommu_load_old_root_entry(struct intel_iommu *iommu);
+
+static void __iommu_update_old_root_entry(struct intel_iommu *iommu, int index);
+
 /*
  * A structure used to store the address allocated by ioremap();
  * The we need to call iounmap() to free them out of spin_lock_irqsave/unlock;
@@ -384,7 +388,6 @@ struct iommu_remapped_entry {
 static LIST_HEAD(__iommu_remapped_mem);
 static DEFINE_MUTEX(__iommu_mem_list_lock);
 
-
 /*
  * This domain is a statically identity mapping domain.
  *	1. This domain creats a static 1:1 mapping to all usable memory.
@@ -4919,3 +4922,52 @@ int __iommu_free_mapped_mem(void)
 	return 0;
 }
 
+/*
+ * Load the old root entry table to new root entry table.
+ */
+static void __iommu_load_old_root_entry(struct intel_iommu *iommu)
+{
+	if ((!iommu)
+		|| (!iommu->root_entry)
+		|| (!iommu->root_entry_old_virt)
+		|| (!iommu->root_entry_old_phys))
+		return;
+	memcpy(iommu->root_entry, iommu->root_entry_old_virt, PAGE_SIZE);
+
+	__iommu_flush_cache(iommu, iommu->root_entry, PAGE_SIZE);
+}
+
+/*
+ * When the data in new root entry table is changed, this function
+ * must be called to save the updated data to old root entry table.
+ */
+static void __iommu_update_old_root_entry(struct intel_iommu *iommu, int index)
+{
+	u8 start;
+	unsigned long size;
+	void __iomem *to;
+	void *from;
+
+	if ((!iommu)
+		|| (!iommu->root_entry)
+		|| (!iommu->root_entry_old_virt)
+		|| (!iommu->root_entry_old_phys))
+		return;
+
+	if (index < -1 || index >= ROOT_ENTRY_NR)
+		return;
+
+	if (index == -1) {
+		start = 0;
+		size = ROOT_ENTRY_NR * sizeof(struct root_entry);
+	} else {
+		start = index * sizeof(struct root_entry);
+		size = sizeof(struct root_entry);
+	}
+	to = iommu->root_entry_old_virt;
+	from = iommu->root_entry;
+	memcpy(to + start, from + start, size);
+
+	__iommu_flush_cache(iommu, to + start, size);
+}
+
diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h
index 4bca7b5..6fa0804 100644
--- a/include/linux/intel-iommu.h
+++ b/include/linux/intel-iommu.h
@@ -328,6 +328,9 @@ struct intel_iommu {
 	spinlock_t	lock; /* protect context, domain ids */
 	struct root_entry *root_entry; /* virtual address */
 
+	void __iomem	*root_entry_old_virt; /* mapped from old root entry */
+	unsigned long	root_entry_old_phys; /* root entry in old kernel */
+
 	struct iommu_flush flush;
 #endif
 	struct q_inval  *qi;            /* Queued invalidation info */
-- 
2.0.0-rc0


  parent reply	other threads:[~2015-04-10  8:43 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-10  8:42 [PATCH v10 0/10] iommu/vt-d: Fix intel vt-d faults in kdump kernel Li, Zhen-Hua
2015-04-10  8:42 ` [PATCH v10 01/10] iommu/vt-d: New function to attach domain with id Li, Zhen-Hua
2015-04-10  8:42 ` [PATCH v10 02/10] iommu/vt-d: Items required for kdump Li, Zhen-Hua
2015-04-10  8:42 ` [PATCH v10 03/10] iommu/vt-d: Function to get old context entry Li, Zhen-Hua
2015-04-10  8:42 ` [PATCH v10 04/10] iommu/vt-d: functions to copy data from old mem Li, Zhen-Hua
2015-05-07  7:49   ` Baoquan He
2015-05-07  8:33     ` Li, ZhenHua
2015-04-10  8:42 ` Li, Zhen-Hua [this message]
2015-04-10  8:42 ` [PATCH v10 06/10] iommu/vt-d: datatypes and functions used for kdump Li, Zhen-Hua
2015-04-10  8:42 ` [PATCH v10 07/10] iommu/vt-d: enable kdump support in iommu module Li, Zhen-Hua
2015-04-10  8:42 ` [PATCH v10 08/10] iommu/vt-d: assign new page table for dma_map Li, Zhen-Hua
2015-04-10  8:42 ` [PATCH v10 09/10] iommu/vt-d: Copy functions for irte Li, Zhen-Hua
2015-04-10  8:42 ` [PATCH v10 10/10] iommu/vt-d: Use old irte in kdump kernel Li, Zhen-Hua
2015-04-15  0:57 ` [PATCH v10 0/10] iommu/vt-d: Fix intel vt-d faults " Dave Young
2015-04-15  5:47   ` Li, ZhenHua
2015-04-15  6:48     ` Dave Young
2015-04-21  1:39       ` Li, ZhenHua
2015-04-21  2:53         ` Dave Young
2015-04-24  8:01       ` Baoquan He
2015-04-24  8:25         ` Dave Young
2015-04-24  8:35           ` Baoquan He
2015-04-24  8:49             ` Dave Young
2015-04-28  8:54               ` Baoquan He
2015-04-28  9:00                 ` Li, ZhenHua
2015-05-04 16:23               ` Joerg Roedel
2015-05-05  6:14                 ` Dave Young
2015-05-05 15:31                   ` Joerg Roedel
2015-05-06  1:51                     ` Dave Young
2015-05-06  2:37                       ` Li, ZhenHua
2015-05-06  8:25                       ` Joerg Roedel
2015-04-23  8:35 ` Li, ZhenHua
2015-04-23  8:38   ` Li, ZhenHua
2015-04-29 11:20 ` Baoquan He
2015-05-03  8:55   ` Baoquan He
2015-05-04  3:06     ` Li, ZhenHua
2015-05-04  3:17       ` Baoquan He
2015-05-07 17:32         ` Joerg Roedel
2015-05-08  1:00           ` Li, ZhenHua
2015-06-11 15:40 ` David Woodhouse

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=1428655333-19504-6-git-send-email-zhen-hual@hp.com \
    --to=zhen-hual@hp.com \
    --cc=alex.williamson@redhat.com \
    --cc=bhe@redhat.com \
    --cc=bhelgaas@google.com \
    --cc=billsumnerlinux@gmail.com \
    --cc=ddutile@redhat.com \
    --cc=doug.hatch@hp.com \
    --cc=dwmw2@infradead.org \
    --cc=dyoung@redhat.com \
    --cc=indou.takao@jp.fujitsu.com \
    --cc=iommu@lists.linux-foundation.org \
    --cc=ishii.hironobu@jp.fujitsu.com \
    --cc=jerry.hoemann@hp.com \
    --cc=joro@8bytes.org \
    --cc=kexec@lists.infradead.org \
    --cc=li.zhang6@hp.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=lisa.mitchell@hp.com \
    --cc=rwright@hp.com \
    --cc=tom.vaden@hp.com \
    --cc=vgoyal@redhat.com \
    /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).