From: Baoquan He <bhe@redhat.com> To: "Li, Zhen-Hua" <zhen-hual@hp.com> Cc: dwmw2@infradead.org, indou.takao@jp.fujitsu.com, joro@8bytes.org, vgoyal@redhat.com, dyoung@redhat.com, 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, rwright@hp.com Subject: Re: [PATCH v10 04/10] iommu/vt-d: functions to copy data from old mem Date: Thu, 7 May 2015 15:49:16 +0800 [thread overview] Message-ID: <20150507074916.GA16815@dhcp-16-116.nay.redhat.com> (raw) In-Reply-To: <1428655333-19504-5-git-send-email-zhen-hual@hp.com> On 04/10/15 at 04:42pm, Li, Zhen-Hua wrote: > Add some functions to copy the data from old kernel. > These functions are used to copy context tables and page tables. > > To avoid calling iounmap between spin_lock_irqsave and spin_unlock_irqrestore, > use a link here, store the pointers , and then use iounmap to free them in > another place. > > Li, Zhen-hua: > The functions and logics. > > Takao Indoh: > Check if pfn is ram: > if (page_is_ram(pfn)) > > 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 | 102 ++++++++++++++++++++++++++++++++++++++++++++ > include/linux/intel-iommu.h | 6 +++ > 2 files changed, 108 insertions(+) > > diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c > index ff5ac04..5ba403a 100644 > --- a/drivers/iommu/intel-iommu.c > +++ b/drivers/iommu/intel-iommu.c > @@ -373,6 +373,17 @@ static struct context_entry *device_to_existing_context_entry( > struct intel_iommu *iommu, > u8 bus, u8 devfn); > > +/* > + * 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; > + */ > +struct iommu_remapped_entry { > + struct list_head list; > + void __iomem *mem; > +}; > +static LIST_HEAD(__iommu_remapped_mem); > +static DEFINE_MUTEX(__iommu_mem_list_lock); > + > > /* > * This domain is a statically identity mapping domain. > @@ -4817,3 +4828,94 @@ static struct context_entry *device_to_existing_context_entry( > return ret; > } > > +/* > + * Copy memory from a physically-addressed area into a virtually-addressed area > + */ I don't find where __iommu_load_from_oldmem is called. Obsolete code of this patch? > +int __iommu_load_from_oldmem(void *to, unsigned long from, unsigned long size) > +{ > + unsigned long pfn; /* Page Frame Number */ > + size_t csize = (size_t)size; /* Num(bytes to copy) */ > + unsigned long offset; /* Lower 12 bits of to */ > + void __iomem *virt_mem; > + struct iommu_remapped_entry *mapped; > + > + pfn = from >> VTD_PAGE_SHIFT; > + offset = from & (~VTD_PAGE_MASK); > + > + if (page_is_ram(pfn)) { > + memcpy(to, pfn_to_kaddr(pfn) + offset, csize); > + } else{ > + > + mapped = kzalloc(sizeof(struct iommu_remapped_entry), > + GFP_KERNEL); > + if (!mapped) > + return -ENOMEM; > + > + virt_mem = ioremap_cache((unsigned long)from, size); > + if (!virt_mem) { > + kfree(mapped); > + return -ENOMEM; > + } > + memcpy(to, virt_mem, size); > + > + mutex_lock(&__iommu_mem_list_lock); > + mapped->mem = virt_mem; > + list_add_tail(&mapped->list, &__iommu_remapped_mem); > + mutex_unlock(&__iommu_mem_list_lock); > + } > + return size; > +} > + > +/* > + * Copy memory from a virtually-addressed area into a physically-addressed area > + */ > +int __iommu_save_to_oldmem(unsigned long to, void *from, unsigned long size) > +{ > + unsigned long pfn; /* Page Frame Number */ > + size_t csize = (size_t)size; /* Num(bytes to copy) */ > + unsigned long offset; /* Lower 12 bits of to */ > + void __iomem *virt_mem; > + struct iommu_remapped_entry *mapped; > + > + pfn = to >> VTD_PAGE_SHIFT; > + offset = to & (~VTD_PAGE_MASK); > + > + if (page_is_ram(pfn)) { > + memcpy(pfn_to_kaddr(pfn) + offset, from, csize); > + } else{ > + mapped = kzalloc(sizeof(struct iommu_remapped_entry), > + GFP_KERNEL); > + if (!mapped) > + return -ENOMEM; > + > + virt_mem = ioremap_cache((unsigned long)to, size); > + if (!virt_mem) { > + kfree(mapped); > + return -ENOMEM; > + } > + memcpy(virt_mem, from, size); > + mutex_lock(&__iommu_mem_list_lock); > + mapped->mem = virt_mem; > + list_add_tail(&mapped->list, &__iommu_remapped_mem); > + mutex_unlock(&__iommu_mem_list_lock); > + } > + return size; > +} > + > +/* > + * Free the mapped memory for ioremap; > + */ > +int __iommu_free_mapped_mem(void) > +{ > + struct iommu_remapped_entry *mem_entry, *tmp; > + > + mutex_lock(&__iommu_mem_list_lock); > + list_for_each_entry_safe(mem_entry, tmp, &__iommu_remapped_mem, list) { > + iounmap(mem_entry->mem); > + list_del(&mem_entry->list); > + kfree(mem_entry); > + } > + mutex_unlock(&__iommu_mem_list_lock); > + return 0; > +} > + > diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h > index a65208a..4bca7b5 100644 > --- a/include/linux/intel-iommu.h > +++ b/include/linux/intel-iommu.h > @@ -368,4 +368,10 @@ extern int dmar_ir_support(void); > > extern const struct attribute_group *intel_iommu_groups[]; > > +extern int __iommu_load_from_oldmem(void *to, unsigned long from, > + unsigned long size); > +extern int __iommu_save_to_oldmem(unsigned long to, void *from, > + unsigned long size); > +extern int __iommu_free_mapped_mem(void); > + > #endif > -- > 2.0.0-rc0 >
WARNING: multiple messages have this Message-ID (diff)
From: Baoquan He <bhe@redhat.com> To: "Li, Zhen-Hua" <zhen-hual@hp.com> Cc: alex.williamson@redhat.com, indou.takao@jp.fujitsu.com, tom.vaden@hp.com, rwright@hp.com, dwmw2@infradead.org, joro@8bytes.org, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, lisa.mitchell@hp.com, jerry.hoemann@hp.com, iommu@lists.linux-foundation.org, ddutile@redhat.com, doug.hatch@hp.com, ishii.hironobu@jp.fujitsu.com, linux-pci@vger.kernel.org, bhelgaas@google.com, billsumnerlinux@gmail.com, li.zhang6@hp.com, dyoung@redhat.com, vgoyal@redhat.com Subject: Re: [PATCH v10 04/10] iommu/vt-d: functions to copy data from old mem Date: Thu, 7 May 2015 15:49:16 +0800 [thread overview] Message-ID: <20150507074916.GA16815@dhcp-16-116.nay.redhat.com> (raw) In-Reply-To: <1428655333-19504-5-git-send-email-zhen-hual@hp.com> On 04/10/15 at 04:42pm, Li, Zhen-Hua wrote: > Add some functions to copy the data from old kernel. > These functions are used to copy context tables and page tables. > > To avoid calling iounmap between spin_lock_irqsave and spin_unlock_irqrestore, > use a link here, store the pointers , and then use iounmap to free them in > another place. > > Li, Zhen-hua: > The functions and logics. > > Takao Indoh: > Check if pfn is ram: > if (page_is_ram(pfn)) > > 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 | 102 ++++++++++++++++++++++++++++++++++++++++++++ > include/linux/intel-iommu.h | 6 +++ > 2 files changed, 108 insertions(+) > > diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c > index ff5ac04..5ba403a 100644 > --- a/drivers/iommu/intel-iommu.c > +++ b/drivers/iommu/intel-iommu.c > @@ -373,6 +373,17 @@ static struct context_entry *device_to_existing_context_entry( > struct intel_iommu *iommu, > u8 bus, u8 devfn); > > +/* > + * 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; > + */ > +struct iommu_remapped_entry { > + struct list_head list; > + void __iomem *mem; > +}; > +static LIST_HEAD(__iommu_remapped_mem); > +static DEFINE_MUTEX(__iommu_mem_list_lock); > + > > /* > * This domain is a statically identity mapping domain. > @@ -4817,3 +4828,94 @@ static struct context_entry *device_to_existing_context_entry( > return ret; > } > > +/* > + * Copy memory from a physically-addressed area into a virtually-addressed area > + */ I don't find where __iommu_load_from_oldmem is called. Obsolete code of this patch? > +int __iommu_load_from_oldmem(void *to, unsigned long from, unsigned long size) > +{ > + unsigned long pfn; /* Page Frame Number */ > + size_t csize = (size_t)size; /* Num(bytes to copy) */ > + unsigned long offset; /* Lower 12 bits of to */ > + void __iomem *virt_mem; > + struct iommu_remapped_entry *mapped; > + > + pfn = from >> VTD_PAGE_SHIFT; > + offset = from & (~VTD_PAGE_MASK); > + > + if (page_is_ram(pfn)) { > + memcpy(to, pfn_to_kaddr(pfn) + offset, csize); > + } else{ > + > + mapped = kzalloc(sizeof(struct iommu_remapped_entry), > + GFP_KERNEL); > + if (!mapped) > + return -ENOMEM; > + > + virt_mem = ioremap_cache((unsigned long)from, size); > + if (!virt_mem) { > + kfree(mapped); > + return -ENOMEM; > + } > + memcpy(to, virt_mem, size); > + > + mutex_lock(&__iommu_mem_list_lock); > + mapped->mem = virt_mem; > + list_add_tail(&mapped->list, &__iommu_remapped_mem); > + mutex_unlock(&__iommu_mem_list_lock); > + } > + return size; > +} > + > +/* > + * Copy memory from a virtually-addressed area into a physically-addressed area > + */ > +int __iommu_save_to_oldmem(unsigned long to, void *from, unsigned long size) > +{ > + unsigned long pfn; /* Page Frame Number */ > + size_t csize = (size_t)size; /* Num(bytes to copy) */ > + unsigned long offset; /* Lower 12 bits of to */ > + void __iomem *virt_mem; > + struct iommu_remapped_entry *mapped; > + > + pfn = to >> VTD_PAGE_SHIFT; > + offset = to & (~VTD_PAGE_MASK); > + > + if (page_is_ram(pfn)) { > + memcpy(pfn_to_kaddr(pfn) + offset, from, csize); > + } else{ > + mapped = kzalloc(sizeof(struct iommu_remapped_entry), > + GFP_KERNEL); > + if (!mapped) > + return -ENOMEM; > + > + virt_mem = ioremap_cache((unsigned long)to, size); > + if (!virt_mem) { > + kfree(mapped); > + return -ENOMEM; > + } > + memcpy(virt_mem, from, size); > + mutex_lock(&__iommu_mem_list_lock); > + mapped->mem = virt_mem; > + list_add_tail(&mapped->list, &__iommu_remapped_mem); > + mutex_unlock(&__iommu_mem_list_lock); > + } > + return size; > +} > + > +/* > + * Free the mapped memory for ioremap; > + */ > +int __iommu_free_mapped_mem(void) > +{ > + struct iommu_remapped_entry *mem_entry, *tmp; > + > + mutex_lock(&__iommu_mem_list_lock); > + list_for_each_entry_safe(mem_entry, tmp, &__iommu_remapped_mem, list) { > + iounmap(mem_entry->mem); > + list_del(&mem_entry->list); > + kfree(mem_entry); > + } > + mutex_unlock(&__iommu_mem_list_lock); > + return 0; > +} > + > diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h > index a65208a..4bca7b5 100644 > --- a/include/linux/intel-iommu.h > +++ b/include/linux/intel-iommu.h > @@ -368,4 +368,10 @@ extern int dmar_ir_support(void); > > extern const struct attribute_group *intel_iommu_groups[]; > > +extern int __iommu_load_from_oldmem(void *to, unsigned long from, > + unsigned long size); > +extern int __iommu_save_to_oldmem(unsigned long to, void *from, > + unsigned long size); > +extern int __iommu_free_mapped_mem(void); > + > #endif > -- > 2.0.0-rc0 > _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec
next prev parent reply other threads:[~2015-05-07 7:50 UTC|newest] Thread overview: 99+ 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 ` Li, Zhen-Hua 2015-04-10 8:42 ` 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 ` Li, Zhen-Hua 2015-04-10 8:42 ` 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 ` Li, Zhen-Hua 2015-04-10 8:42 ` 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 ` Li, Zhen-Hua 2015-04-10 8:42 ` 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-04-10 8:42 ` Li, Zhen-Hua 2015-04-10 8:42 ` Li, Zhen-Hua 2015-05-07 7:49 ` Baoquan He [this message] 2015-05-07 7:49 ` Baoquan He 2015-05-07 8:33 ` Li, ZhenHua 2015-05-07 8:33 ` Li, ZhenHua 2015-05-07 8:33 ` Li, ZhenHua 2015-04-10 8:42 ` [PATCH v10 05/10] iommu/vt-d: Add functions to load and save old re Li, Zhen-Hua 2015-04-10 8:42 ` Li, Zhen-Hua 2015-04-10 8:42 ` Li, Zhen-Hua 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 ` Li, Zhen-Hua 2015-04-10 8:42 ` 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 ` Li, Zhen-Hua 2015-04-10 8:42 ` 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 ` Li, Zhen-Hua 2015-04-10 8:42 ` 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 ` Li, Zhen-Hua 2015-04-10 8:42 ` 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-10 8:42 ` Li, Zhen-Hua 2015-04-10 8:42 ` 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 5:47 ` Li, ZhenHua 2015-04-15 5:47 ` Li, ZhenHua 2015-04-15 6:48 ` Dave Young 2015-04-15 6:48 ` Dave Young 2015-04-21 1:39 ` Li, ZhenHua 2015-04-21 1:39 ` Li, ZhenHua 2015-04-21 2:53 ` Dave Young 2015-04-21 2:53 ` Dave Young 2015-04-21 2:53 ` Dave Young 2015-04-24 8:01 ` Baoquan He 2015-04-24 8:01 ` Baoquan He 2015-04-24 8:25 ` Dave Young 2015-04-24 8:25 ` Dave Young 2015-04-24 8:35 ` Baoquan He 2015-04-24 8:35 ` Baoquan He 2015-04-24 8:49 ` Dave Young 2015-04-24 8:49 ` Dave Young 2015-04-28 8:54 ` Baoquan He 2015-04-28 8:54 ` Baoquan He 2015-04-28 9:00 ` Li, ZhenHua 2015-04-28 9:00 ` Li, ZhenHua 2015-05-04 16:23 ` Joerg Roedel 2015-05-04 16:23 ` Joerg Roedel 2015-05-05 6:14 ` Dave Young 2015-05-05 6:14 ` Dave Young 2015-05-05 15:31 ` Joerg Roedel 2015-05-05 15:31 ` Joerg Roedel 2015-05-06 1:51 ` Dave Young 2015-05-06 1:51 ` Dave Young 2015-05-06 1:51 ` Dave Young 2015-05-06 2:37 ` Li, ZhenHua 2015-05-06 2:37 ` Li, ZhenHua 2015-05-06 2:37 ` Li, ZhenHua 2015-05-06 8:25 ` Joerg Roedel 2015-05-06 8:25 ` Joerg Roedel 2015-04-23 8:35 ` Li, ZhenHua 2015-04-23 8:35 ` Li, ZhenHua 2015-04-23 8:35 ` Li, ZhenHua 2015-04-23 8:38 ` Li, ZhenHua 2015-04-23 8:38 ` Li, ZhenHua 2015-04-23 8:38 ` Li, ZhenHua 2015-04-29 11:20 ` Baoquan He 2015-04-29 11:20 ` Baoquan He 2015-04-29 11:20 ` Baoquan He 2015-05-03 8:55 ` Baoquan He 2015-05-03 8:55 ` Baoquan He 2015-05-03 8:55 ` Baoquan He 2015-05-04 3:06 ` Li, ZhenHua 2015-05-04 3:06 ` Li, ZhenHua 2015-05-04 3:06 ` Li, ZhenHua 2015-05-04 3:17 ` Baoquan He 2015-05-04 3:17 ` Baoquan He 2015-05-07 17:32 ` Joerg Roedel 2015-05-07 17:32 ` Joerg Roedel 2015-05-08 1:00 ` Li, ZhenHua 2015-05-08 1:00 ` Li, ZhenHua 2015-05-08 1:00 ` Li, ZhenHua 2015-06-11 15:40 ` David Woodhouse 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=20150507074916.GA16815@dhcp-16-116.nay.redhat.com \ --to=bhe@redhat.com \ --cc=alex.williamson@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 \ --cc=zhen-hual@hp.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: linkBe 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.