bab9bb6b69
Create new directories: ceph config config-files filesystem kernel kernel/kernel-modules ldap logging strorage-drivers tools utilities virt Retire directories: connectivity core devtools support extended Delete two packages: tgt irqbalance Relocated packages: base/ dhcp initscripts libevent lighttpd linuxptp memcached net-snmp novnc ntp openssh pam procps sanlock shadow sudo systemd util-linux vim watchdog ceph/ python-cephclient config/ facter puppet-4.8.2 puppet-modules filesystem/ e2fsprogs nfs-utils nfscheck kernel/ kernel-std kernel-rt kernel/kernel-modules/ mlnx-ofa_kernel ldap/ nss-pam-ldapd openldap logging/ syslog-ng logrotate networking/ lldpd iproute mellanox python-ryu mlx4-config python/ python-2.7.5 python-django python-gunicorn python-setuptools python-smartpm python-voluptuous security/ shim-signed shim-unsigned tboot strorage-drivers/ python-3parclient python-lefthandclient virt/ cloud-init libvirt libvirt-python qemu tools/ storage-topology vm-topology utilities/ tis-extensions namespace-utils nova-utils update-motd Change-Id: I37ade764d873c701b35eac5881eb40412ba64a86 Story: 2002801 Task: 22687 Signed-off-by: Scott Little <scott.little@windriver.com>
183 lines
7.1 KiB
Diff
183 lines
7.1 KiB
Diff
From 37680a25caeba0ee4e5f26cb524ff8b4faa5c0f5 Mon Sep 17 00:00:00 2001
|
|
Message-Id: <37680a25caeba0ee4e5f26cb524ff8b4faa5c0f5.1528226387.git.Jim.Somerville@windriver.com>
|
|
In-Reply-To: <c8270e79f6b7008fde44b8d5aa6314d8cf89d3ed.1528226387.git.Jim.Somerville@windriver.com>
|
|
References: <c8270e79f6b7008fde44b8d5aa6314d8cf89d3ed.1528226387.git.Jim.Somerville@windriver.com>
|
|
From: Akinobu Mita <akinobu.mita@gmail.com>
|
|
Date: Wed, 4 Jun 2014 16:06:50 -0700
|
|
Subject: [PATCH 13/32] x86: enable DMA CMA with swiotlb
|
|
|
|
commit 9c5a3621427da68afe6a078cadf807d2c8cc1d12 upstream.
|
|
Ported-by: Nam Ninh <nam.ninh@windriver.com>
|
|
|
|
The DMA Contiguous Memory Allocator support on x86 is disabled when
|
|
swiotlb config option is enabled. So DMA CMA is always disabled on
|
|
x86_64 because swiotlb is always enabled. This attempts to support for
|
|
DMA CMA with enabling swiotlb config option.
|
|
|
|
The contiguous memory allocator on x86 is integrated in the function
|
|
dma_generic_alloc_coherent() which is .alloc callback in nommu_dma_ops
|
|
for dma_alloc_coherent().
|
|
|
|
x86_swiotlb_alloc_coherent() which is .alloc callback in swiotlb_dma_ops
|
|
tries to allocate with dma_generic_alloc_coherent() firstly and then
|
|
swiotlb_alloc_coherent() is called as a fallback.
|
|
|
|
The main part of supporting DMA CMA with swiotlb is that changing
|
|
x86_swiotlb_free_coherent() which is .free callback in swiotlb_dma_ops
|
|
for dma_free_coherent() so that it can distinguish memory allocated by
|
|
dma_generic_alloc_coherent() from one allocated by
|
|
swiotlb_alloc_coherent() and release it with dma_generic_free_coherent()
|
|
which can handle contiguous memory. This change requires making
|
|
is_swiotlb_buffer() global function.
|
|
|
|
This also needs to change .free callback in the dma_map_ops for amd_gart
|
|
and sta2x11, because these dma_ops are also using
|
|
dma_generic_alloc_coherent().
|
|
|
|
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
|
|
Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>
|
|
Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
|
Cc: David Woodhouse <dwmw2@infradead.org>
|
|
Cc: Don Dutile <ddutile@redhat.com>
|
|
Cc: Thomas Gleixner <tglx@linutronix.de>
|
|
Cc: Ingo Molnar <mingo@redhat.com>
|
|
Cc: "H. Peter Anvin" <hpa@zytor.com>
|
|
Cc: Andi Kleen <andi@firstfloor.org>
|
|
Cc: Yinghai Lu <yinghai@kernel.org>
|
|
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
|
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
|
Signed-off-by: Jim Somerville <Jim.Somerville@windriver.com>
|
|
---
|
|
arch/x86/Kconfig | 2 +-
|
|
arch/x86/include/asm/swiotlb.h | 7 +++++++
|
|
arch/x86/kernel/amd_gart_64.c | 2 +-
|
|
arch/x86/kernel/pci-swiotlb.c | 9 ++++++---
|
|
arch/x86/pci/sta2x11-fixup.c | 6 ++----
|
|
include/linux/swiotlb.h | 2 ++
|
|
lib/swiotlb.c | 2 +-
|
|
7 files changed, 20 insertions(+), 10 deletions(-)
|
|
|
|
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
|
|
index bdcca71..f67aa39 100644
|
|
--- a/arch/x86/Kconfig
|
|
+++ b/arch/x86/Kconfig
|
|
@@ -44,7 +44,7 @@ config X86
|
|
select ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH if SMP
|
|
select ARCH_WANT_OPTIONAL_GPIOLIB
|
|
select ARCH_WANT_FRAME_POINTERS
|
|
- select HAVE_DMA_CONTIGUOUS if !SWIOTLB
|
|
+ select HAVE_DMA_CONTIGUOUS
|
|
select HAVE_KRETPROBES
|
|
select HAVE_OPTPROBES
|
|
select HAVE_KPROBES_ON_FTRACE
|
|
diff --git a/arch/x86/include/asm/swiotlb.h b/arch/x86/include/asm/swiotlb.h
|
|
index 977f176..ab05d73 100644
|
|
--- a/arch/x86/include/asm/swiotlb.h
|
|
+++ b/arch/x86/include/asm/swiotlb.h
|
|
@@ -29,4 +29,11 @@ static inline void pci_swiotlb_late_init(void)
|
|
|
|
static inline void dma_mark_clean(void *addr, size_t size) {}
|
|
|
|
+extern void *x86_swiotlb_alloc_coherent(struct device *hwdev, size_t size,
|
|
+ dma_addr_t *dma_handle, gfp_t flags,
|
|
+ struct dma_attrs *attrs);
|
|
+extern void x86_swiotlb_free_coherent(struct device *dev, size_t size,
|
|
+ void *vaddr, dma_addr_t dma_addr,
|
|
+ struct dma_attrs *attrs);
|
|
+
|
|
#endif /* _ASM_X86_SWIOTLB_H */
|
|
diff --git a/arch/x86/kernel/amd_gart_64.c b/arch/x86/kernel/amd_gart_64.c
|
|
index b574b29..8e3842f 100644
|
|
--- a/arch/x86/kernel/amd_gart_64.c
|
|
+++ b/arch/x86/kernel/amd_gart_64.c
|
|
@@ -512,7 +512,7 @@ gart_free_coherent(struct device *dev, size_t size, void *vaddr,
|
|
dma_addr_t dma_addr, struct dma_attrs *attrs)
|
|
{
|
|
gart_unmap_page(dev, dma_addr, size, DMA_BIDIRECTIONAL, NULL);
|
|
- free_pages((unsigned long)vaddr, get_order(size));
|
|
+ dma_generic_free_coherent(dev, size, vaddr, dma_addr, attrs);
|
|
}
|
|
|
|
static int gart_mapping_error(struct device *dev, dma_addr_t dma_addr)
|
|
diff --git a/arch/x86/kernel/pci-swiotlb.c b/arch/x86/kernel/pci-swiotlb.c
|
|
index 4853440..284d506 100644
|
|
--- a/arch/x86/kernel/pci-swiotlb.c
|
|
+++ b/arch/x86/kernel/pci-swiotlb.c
|
|
@@ -16,7 +16,7 @@
|
|
|
|
int swiotlb __read_mostly;
|
|
|
|
-static void *x86_swiotlb_alloc_coherent(struct device *hwdev, size_t size,
|
|
+void *x86_swiotlb_alloc_coherent(struct device *hwdev, size_t size,
|
|
dma_addr_t *dma_handle, gfp_t flags,
|
|
struct dma_attrs *attrs)
|
|
{
|
|
@@ -30,11 +30,14 @@ static void *x86_swiotlb_alloc_coherent(struct device *hwdev, size_t size,
|
|
return swiotlb_alloc_coherent(hwdev, size, dma_handle, flags);
|
|
}
|
|
|
|
-static void x86_swiotlb_free_coherent(struct device *dev, size_t size,
|
|
+void x86_swiotlb_free_coherent(struct device *dev, size_t size,
|
|
void *vaddr, dma_addr_t dma_addr,
|
|
struct dma_attrs *attrs)
|
|
{
|
|
- swiotlb_free_coherent(dev, size, vaddr, dma_addr);
|
|
+ if (is_swiotlb_buffer(dma_to_phys(dev, dma_addr)))
|
|
+ swiotlb_free_coherent(dev, size, vaddr, dma_addr);
|
|
+ else
|
|
+ dma_generic_free_coherent(dev, size, vaddr, dma_addr, attrs);
|
|
}
|
|
|
|
static struct dma_map_ops swiotlb_dma_ops = {
|
|
diff --git a/arch/x86/pci/sta2x11-fixup.c b/arch/x86/pci/sta2x11-fixup.c
|
|
index 9d8a509..5ceda85 100644
|
|
--- a/arch/x86/pci/sta2x11-fixup.c
|
|
+++ b/arch/x86/pci/sta2x11-fixup.c
|
|
@@ -173,9 +173,7 @@ static void *sta2x11_swiotlb_alloc_coherent(struct device *dev,
|
|
{
|
|
void *vaddr;
|
|
|
|
- vaddr = dma_generic_alloc_coherent(dev, size, dma_handle, flags, attrs);
|
|
- if (!vaddr)
|
|
- vaddr = swiotlb_alloc_coherent(dev, size, dma_handle, flags);
|
|
+ vaddr = x86_swiotlb_alloc_coherent(dev, size, dma_handle, flags, attrs);
|
|
*dma_handle = p2a(*dma_handle, to_pci_dev(dev));
|
|
return vaddr;
|
|
}
|
|
@@ -183,7 +181,7 @@ static void *sta2x11_swiotlb_alloc_coherent(struct device *dev,
|
|
/* We have our own dma_ops: the same as swiotlb but from alloc (above) */
|
|
static struct dma_map_ops sta2x11_dma_ops = {
|
|
.alloc = sta2x11_swiotlb_alloc_coherent,
|
|
- .free = swiotlb_free_coherent,
|
|
+ .free = x86_swiotlb_free_coherent,
|
|
.map_page = swiotlb_map_page,
|
|
.unmap_page = swiotlb_unmap_page,
|
|
.map_sg = swiotlb_map_sg_attrs,
|
|
diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h
|
|
index 16c296a..65c4a7a 100644
|
|
--- a/include/linux/swiotlb.h
|
|
+++ b/include/linux/swiotlb.h
|
|
@@ -117,4 +117,6 @@ static inline void swiotlb_free(void) { }
|
|
#endif
|
|
|
|
extern void swiotlb_print_info(void);
|
|
+extern int is_swiotlb_buffer(phys_addr_t paddr);
|
|
+
|
|
#endif /* __LINUX_SWIOTLB_H */
|
|
diff --git a/lib/swiotlb.c b/lib/swiotlb.c
|
|
index ffcaff5..d89c82a 100644
|
|
--- a/lib/swiotlb.c
|
|
+++ b/lib/swiotlb.c
|
|
@@ -404,7 +404,7 @@ void __init swiotlb_free(void)
|
|
io_tlb_nslabs = 0;
|
|
}
|
|
|
|
-static int is_swiotlb_buffer(phys_addr_t paddr)
|
|
+int is_swiotlb_buffer(phys_addr_t paddr)
|
|
{
|
|
return paddr >= io_tlb_start && paddr < io_tlb_end;
|
|
}
|
|
--
|
|
1.8.3.1
|
|
|