Escolar Documentos
Profissional Documentos
Cultura Documentos
Google
November 6, 2012
Implementation
Introduction
Outline
1
Introduction
Why physically contiguous memory is needed
Solutions to the problem
Implementation
Page allocator
CMA implementation
CMA problems and future work
Implementation
Introduction
Outline
1
Introduction
Why physically contiguous memory is needed
Solutions to the problem
Implementation
Page allocator
CMA implementation
CMA problems and future work
Implementation
Introduction
Virtually contiguous =
6
physically
contiguous.
So why bother?
Implementation
Introduction
Virtually contiguous =
6
physically
contiguous.
MMU stands behind CPU.
There are other chips in the system.
Some require large buffers.
5-megapixel camera anyone?
Implementation
Introduction
Implementation
Introduction
Implementation
Introduction
Implementation
Introduction
Implementation
Introduction
Implementation
Introduction
Implementation
Introduction
Implementation
Introduction
Outline
1
Introduction
Why physically contiguous memory is needed
Solutions to the problem
Implementation
Page allocator
CMA implementation
CMA problems and future work
Implementation
Introduction
Implementation
Introduction
void my_dev_alloc_buffer(
unsigned long size_in_bytes, dma_addr_t dma_addrp)
{
void virt_addr = dma_alloc_coherent(
my_dev,
size_in_bytes,
dma_addrp,
GFP_KERNEL);
if (!virt_addr)
dev_err(my_dev, "Allocation failed.");
return virt_addr;
}
Implementation
Introduction
Freeing
1
2
3
4
5
void my_dev_free_buffer(
unsigned long size, void virt, dma_addr_t dma)
{
dma_free_coherent(my_dev, size, virt, dma);
}
Implementation
Introduction
Documentation
Documentation/DMAAPIHOWTO.txt
Documentation/DMAAPI.txt
Linux Device Drivers, 3rd edition, chapter 15.
http://lwn.net/Kernel/LDD3/
Implementation
Introduction
Implementation
Introduction
Memory reservation
Implementation
Introduction
Implementation
if (mdesc>reserve)
mdesc>reserve();
3
4
5
6
7
8
9
10
11
12
+/
+ reserve memory for DMA contigouos allocations,
+ must come from DMA area inside low memory
+ /
+dma_contiguous_reserve(min(arm_dma_limit, arm_lowmem_limit));
+
arm_memblock_steal_permitted = false;
memblock_allow_resize();
memblock_dump_all();
Introduction
Implementation
Early fixups
On ARM
cache is not coherent, and
having two mappings with different cache-ability gives undefined
behaviour.
Introduction
Implementation
#ifndef ASM_DMA_CONTIGUOUS_H
#define ASM_DMA_CONTIGUOUS_H
3
4
#ifdef __KERNEL__
5
6
7
#include <linux/types.h>
#include <asmgeneric/dmacontiguous.h>
8
9
10
11
12
13
14
#endif
#endif
Introduction
Implementation
Introduction
Implementation
Introduction
Implementation
bool dma_release_from_contiguous(
struct device dev,
struct page pages,
int count);
Introduction
Implementation
Let it compile!
Introduction
Implementation
Introduction
Implementation
Use different contexts for different purposes within the same device.
Simulating dual channel memory.
Big and small allocations in the same device.
Introduction
int dma_declare_contiguous(
struct device dev,
unsigned long size,
phys_addr_t base,
phys_addr_t limit);
Implementation
Introduction
Implementation
Introduction
Implementation
Introduction
Implementation
Introduction
Outline
1
Introduction
Why physically contiguous memory is needed
Solutions to the problem
Implementation
Page allocator
CMA implementation
CMA problems and future work
Implementation
Introduction
Implementation
memblock
sm
emo
r
u se
may
y to
es
page allocator
u se
us
vmalloc()
es
kmalloc()
us
ma
kmem_cache
yu
se
may use
mempool
Introduction
Implementation
memblock
page allocator
Introduction
Buddy allocator
Implementation
Introduction
Implementation
Introduction
Implementation
Migrate types
To try keep pages of the same type together, each free page and
each page block has a migrate type assigned.
But allocator will use fallback types.
And migrate type of a free page and page blocks can change.
Introduction
Implementation
memblock
page allocator
CMA
Introduction
Implementation
Introduction
Implementation
Introduction
Allocation
Implementation
Introduction
Implementation
Migration
Introduction
Problems
Implementation
Introduction
Future work
Only swap.
Transcendent memory.
POSIX_FADV_VOLATILE.
Implementation
Q&A
Thank you!
Micha Nazarewicz
mina86@mina86.com
http://mina86.com/cma/