CMA (Contiguous Memory Allocator)
๊ฐ์ (Overview)
CMA๋ ์ปค๋ ๋ถํ ์ด๊ธฐ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์์ ์ฐ์๋ ์์ญ์ ์์ฝํ๊ณ , ๋ฐํ์์ ํด๋น ์์ญ์ ํ์ด์ง๋ฅผ ํ ๋น/ํด์ ํ๋ ์๋ธ์์คํ ์ ๋๋ค. ์ฃผ๋ก DMA, ๋์คํ๋ ์ด ํ๋ ์๋ฒํผ, GPU, ๋น๋์ค ๋์ฝ๋ ๊ฐ์ ์ฅ์น์์ ํ๋์จ์ด ์ ์ฝ์ผ๋ก ์ธํด ์ฐ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. CMA ์์ญ์ ํ์์๋ Buddy Allocator์ ๋ฐํ๋์ด ์ผ๋ฐ ๋ฉ๋ชจ๋ฆฌ๋ก ํ์ฉ๋์ง๋ง, ์ฅ์น๊ฐ ํ ๋น์ ์์ฒญํ๋ฉด ํด๋น ์์ญ์ ์ฌ์ฉ์ ํ์ด์ง๋ฅผ ์ฌ๋ฐฐ์น(migrating)ํ์ฌ ์ฐ์ ๋ธ๋ก์ ํ๋ณดํฉ๋๋ค.
Linux 7.0์์ CMA๋ ๋ฉํฐ ๋ ์ธ์ง(multi-range) ์ง์์ ํตํด ํ๋์ CMA ์์ญ์ด ์ต๋ 8๊ฐ์ ๋ถ์ฐ์ ๋ฌผ๋ฆฌ ๋ฒ์๋ก ๊ตฌ์ฑ๋ ์ ์์ต๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ํ(memory hole)์ด ์๋ ์์คํ ์์ ๋จ์ผ ์ฐ์ ์์ญ ํ๋ณด๊ฐ ์ด๋ ค์ด ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค.
์์ค ํ์ผ:
mm/cma.c โ ํต์ฌ ๊ตฌํ (ํ ๋น/ํด์ /์ด๊ธฐํ)
mm/cma.h โ ๋ด๋ถ ๊ตฌ์กฐ์ฒด (cma, cma_memrange)
include/linux/cma.h โ ์ธ๋ถ API ํค๋
include/trace/events/cma.h โ tracepoint ์ ์
๋น ๋ฅธ ์ ๊ฒ ๋ช ๋ น
# CMA ์์ญ ์ ์ฒด ํํฉ ํ์ธ (์ด๋ฆ, ํฌ๊ธฐ, ์ฌ์ฉ๋)
cat /proc/meminfo | grep Cma
# CMA ์์ญ๋ณ ์์ธ ์ ๋ณด
cat /sys/kernel/debug/cma/cma-0/used_cma # ์ฌ์ฉ ์ค์ธ ํ์ด์ง ์
cat /sys/kernel/debug/cma/cma-0/count # ์ ์ฒด ํ์ด์ง ์
# Buddy Allocator์์ CMA ํ์ด์ง ๋ธ๋ก ๋ถํฌ ํ์ธ
cat /proc/buddyinfo | grep MIGRATE_CMA
# CMA ์์ญ์ pageblock ๋ง์ด๊ทธ๋ ์ด์
ํ์
ํ์ธ
cat /proc/pagetypeinfo | grep CMA
# CMA ํ ๋น/ํด์ tracepoint ํ์ธ
sudo perf stat -e cma:cma_alloc_start,cma:cma_alloc_finish,cma:cma_release -- sleep 5
# CMA ์์ญ ๋๋ฒ๊ทธ ์ ๋ณด (CONFIG_CMA_DEBUGFS)
sudo ls /sys/kernel/debug/cma/
# dmesg์์ CMA ์ด๊ธฐํ ๋ฉ์์ง ํ์ธ
dmesg | grep -i "cma"
ํต์ฌ ์๋ฃ๊ตฌ์กฐ
struct cma โ CMA ์์ญ ๊ด๋ฆฌ์ (`mm/cma.h:39-65`)
struct cma {
unsigned long count; // ์ด ํ์ด์ง ์
unsigned long available_count; // ์ฌ์ฉ ๊ฐ๋ฅํ ํ์ด์ง ์
unsigned int order_per_bit; // ๋นํธ๋งต 1๋นํธ๋น ํ์ด์ง ์ (2^order)
spinlock_t lock; // ๋นํธ๋งต ๋์์ฑ ์ ์ด
struct mutex alloc_mutex; // ํ ๋น ์ ์ง๋ ฌํ
char name[CMA_MAX_NAME]; // ์์ญ ์ด๋ฆ ("cma0", "linux,contiguous-region")
int nranges; // ์ค์ ๋ ์ธ์ง ์ (1~8)
struct cma_memrange ranges[CMA_MAX_RANGES]; // ๋ฉํฐ ๋ ์ธ์ง ๋ฐฐ์ด
unsigned long flags; // CMA_ACTIVATED ๋ฑ ํ๋๊ทธ
int nid; // NUMA ๋
ธ๋ ID
};
์ค๋ช
: count๋ ์ ์ฒด ์์ญ ํฌ๊ธฐ(ํ์ด์ง ์), available_count๋ ํ์ฌ Buddy์ ๋ฐํ๋์ด ์ฌ์ฉ ๊ฐ๋ฅํ ํ์ด์ง ์์
๋๋ค. order_per_bit์ ๋นํธ๋งต ํด์๋๋ฅผ ๊ฒฐ์ ํ๋ฉฐ, ๋ณดํต 0์ด๋ฉด ๋นํธ๋งต 1๋นํธ = 1ํ์ด์ง์
๋๋ค. nranges๋ ๋ฉํฐ ๋ ์ธ์ง ์ง์์ผ๋ก, ํ๋์ CMA ์์ญ์ด ์ฌ๋ฌ ๋ถ์ฐ์ ๋ฌผ๋ฆฌ ๋ฒ์๋ฅผ ๊ฐ์ง ๋ ์ฌ์ฉ๋ฉ๋๋ค.
struct cma_memrange โ ๊ฐ๋ณ ๋ฌผ๋ฆฌ ๋ฒ์ (`mm/cma.h:26-36`)
struct cma_memrange {
unsigned long base_pfn; // ๋ฒ์ ์์ PFN
unsigned long count; // ๋ฒ์ ๋ด ํ์ด์ง ์
union {
unsigned long early_pfn; // cma_reserve_early()์์ ์ฌ์ฉ
unsigned long *bitmap; // ํ์ฑํ ํ ํ ๋น ๋นํธ๋งต
};
};
์ค๋ช
: early_pfn์ ๋ถํ
์ด๊ธฐ cma_reserve_early() ํธ์ถ ์ ์์ง ๋นํธ๋งต์ด ํ ๋น๋๊ธฐ ์ ์ ์์ฝ๋ PFN์ ์ถ์ ํฉ๋๋ค. bitmap์ cma_activate_area() ์ดํ ํ ๋น ์ํ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ๋นํธ๋งต์์ 1๋นํธ = ํด๋น ํ์ด์ง๊ฐ CMA ํ ๋น๋จ์ ๋ํ๋
๋๋ค.
cma_flags โ ์ํ ํ๋๊ทธ (`mm/cma.h:67-72`)
enum cma_flags {
CMA_RESERVE_PAGES_ON_ERROR, // ์ด๊ธฐํ ์คํจ ์ ํ์ด์ง ๋ฐํ ์ ํจ
CMA_ZONES_VALID, // ์กด ๊ฒ์ฆ ํต๊ณผ
CMA_ZONES_INVALID, // ์กด ๊ฒ์ฆ ์คํจ (cross-zone)
CMA_ACTIVATED, // cma_activate_area ์๋ฃ
};
์ค๋ช
: CMA_ACTIVATED๋ cma_reserve_early()๊ฐ ๋์ํ๋ ์กฐ๊ฑด์
๋๋ค โ ์ด ๋นํธ๊ฐ ์ค์ ๋๋ฉด ์ด๊ธฐ ํ ๋น์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. CMA_ZONES_VALID/INVALID๋ CMA ์์ญ์ด ๋จ์ผ ์กด์ ์ํ๋์ง ๊ฒ์ฆํ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํฉ๋๋ค.
struct cma_init_memrange โ ์ด๊ธฐํ ์์ ๊ตฌ์กฐ์ฒด (`mm/cma.c:311-315`)
struct cma_init_memrange {
phys_addr_t base;
phys_addr_t size;
struct list_head list;
};
์ค๋ช
: cma_declare_contiguous_multi()์์ ๋ฉํฐ ๋ ์ธ์ง ํ๋ณด๋ฅผ ์ ๋ ฌํ์ฌ ๊ด๋ฆฌํ๋ ์์ ๊ตฌ์กฐ์ฒด์
๋๋ค. ์ต๋ CMA_MAX_RANGES(8๊ฐ)๊น์ง ์ฌ์ฉ๋ฉ๋๋ค.
ํต์ฌ ํจ์
1. `cma_declare_contiguous_nid()` โ CMA ์์ญ ์์ฝ (`mm/cma.c:733-751`)
int __init cma_declare_contiguous_nid(phys_addr_t base,
phys_addr_t size, phys_addr_t limit,
phys_addr_t alignment, unsigned int order_per_bit,
bool fixed, const char *name, struct cma **res_cma,
int nid)
์ญํ : ๋ถํ
์ด๊ธฐ์ memblock์์ CMA ์์ญ์ ์์ฝํฉ๋๋ค. base=0์ด๋ฉด ์์ ์์น, fixed=true๋ฉด ์ ํํ ์ฃผ์์ ์์ฝํฉ๋๋ค.
๋ถ๊ธฐ ๋ก์ง:
1. __cma_declare_contiguous_nid() ํธ์ถ (๋ด๋ถ ๊ตฌํ)
2. fixed=true โ cma_fixed_reserve(): ์ง์ ์์น์์ ์ง์ ์์ฝ ์๋
3. fixed=false โ cma_alloc_mem(): 64๋นํธ ์์คํ
์์๋ 4GB ์์ชฝ๋ถํฐ bottom-up ํ์, HIGHMEM ์ฒ๋ฆฌ
4. cma_init_reserved_mem(): struct cma ์ด๊ธฐํ
2. `cma_alloc()` / `cma_alloc_frozen()` โ ํ์ด์ง ํ ๋น (`mm/cma.c:943-953, 918-924`)
struct page *cma_alloc(struct cma *cma, unsigned long count,
unsigned int align, bool no_warn)
struct page *cma_alloc_frozen(struct cma *cma, unsigned long count,
unsigned int align, bool no_warn)
์ญํ : CMA ์์ญ์์ ์ฐ์ ํ์ด์ง๋ฅผ ํ ๋นํฉ๋๋ค. cma_alloc()์ refcount ์ค์ ๊น์ง, cma_alloc_frozen()์ refcount ์์ด ๋ฐํํฉ๋๋ค.
๋ถ๊ธฐ ๋ก์ง (cma_range_alloc ๋ด๋ถ, mm/cma.c:780-858):
1. bitmap_find_next_zero_area_off(): ๋นํธ๋งต์์ ์ฐ์ ๋น ์์ญ ํ์
2. page_range_contiguous(): ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ฐ์์ธ์ง ์ฌ๊ฒ์ฆ
3. bitmap_set(): ํด๋น ์์ญ์ "์ฌ์ฉ ์ค"์ผ๋ก ํ์
4. alloc_contig_frozen_range(): Buddy์์ ์ค์ ํ์ด์ง๋ฅผ ๋๊ฒฐ(freeze)ํ๊ณ ํ ๋น
5. ํ ๋น ์คํจ ์ cma_clear_bitmap()์ผ๋ก ๋๋๋ฆฌ๊ณ -EBUSY ์ ์ฌ์๋
3. `cma_release()` โ ํ์ด์ง ํด์ (`mm/cma.c:1012-1032`)
bool cma_release(struct cma *cma, const struct page *pages,
unsigned long count)
์ญํ : cma_alloc()์ผ๋ก ํ ๋น๋ ํ์ด์ง๋ฅผ ํด์ ํ๊ณ Buddy์ ๋ฐํํฉ๋๋ค.
๋ถ๊ธฐ ๋ก์ง:
1. find_cma_memrange(): ํด๋น ํ์ด์ง๊ฐ ์ด๋ ๋ ์ธ์ง์ ์ํ๋์ง ํ์
2. put_page_testzero(): ๋ชจ๋ ํ์ด์ง์ refcount๋ฅผ 0์ผ๋ก ๊ฐ์
3. __cma_release_frozen(): free_contig_frozen_range()๋ก Buddy ๋ฐํ + cma_clear_bitmap()
4. `cma_activate_area()` โ ์ด๊ธฐํ ์๋ฃ (`mm/cma.c:140-200`)
static void __init cma_activate_area(struct cma *cma)
์ญํ : ๋ถํ
์ core_initcall์์ ํธ์ถ๋์ด ๋นํธ๋งต ํ ๋น, ์กด ๊ฒ์ฆ, init_cma_reserved_pageblock() ํธ์ถ๋ก pageblock์ CMA ์ ์ฉ์ผ๋ก ์ค์ ํฉ๋๋ค.
๋ถ๊ธฐ ๋ก์ง:
1. ๊ฐ ๋ ์ธ์ง๋ณ bitmap_zalloc()์ผ๋ก ๋นํธ๋งต ํ ๋น
2. cma_validate_zones(): CMA ์์ญ์ด ๋จ์ผ ์กด์ ์ํ๋์ง ๊ฒ์ฆ
3. early_pfn์ด base_pfn๊ณผ ๋ค๋ฅด๋ฉด โ ์ฐจ์ด๋ถ(์ด๋ฏธ ์์ฝ๋ ๋ถ๋ถ)์ ๋นํธ๋งต์์ "์ฌ์ฉ ์ค"์ผ๋ก ํ์
4. ์คํจ ์ cleanup: ๋นํธ๋งต ํด์ + Buddy์ ํ์ด์ง ๋ฐํ
5. `cma_declare_contiguous_multi()` โ ๋ฉํฐ ๋ ์ธ์ง ์์ฝ (`mm/cma.c:528-711`)
int __init cma_declare_contiguous_multi(phys_addr_t total_size,
phys_addr_t align, unsigned int order_per_bit,
const char *name, struct cma **res_cma, int nid)
์ญํ : ๋จ์ผ ์ฐ์ ์์ญ ํ๋ณด์ ์คํจํ๋ฉด 4GB ์์ชฝ ํฐ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก๋ค์ ์์งํ์ฌ ๋ฉํฐ ๋ ์ธ์ง CMA๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
๋ถ๊ธฐ ๋ก์ง:
1. ๋จผ์ __cma_declare_contiguous_nid()๋ก ๋จ์ผ ๋ ์ธ์ง ์๋
2. -ENOSPC ์ธ ์คํจ โ ์ข
๋ฃ
3. for_each_free_mem_range()๋ก 4GB ์ ๋น ๋ฒ์ ์์ง
4. ํฌ๊ธฐ์ ์ ๋ ฌ ํ CMA_MAX_RANGES๊ฐ ์ ํ
5. ์ฃผ์์ ์ฌ์ ๋ ฌ โ ์์ฐจ์ ์ผ๋ก memblock_reserve() + cmr ์ด๊ธฐํ
ํธ์ถ ํ๋ฆ
CMA ์์ญ ์ด๊ธฐํ ํ๋ฆ
firmware/reserved-memory
โ
โผ
cma_declare_contiguous_nid() โ arch ์ฝ๋์์ ํธ์ถ
โ
โโโ __cma_declare_contiguous_nid()
โ โโโ cma_fixed_reserve() ๋๋ cma_alloc_mem()
โ โ โโโ memblock_alloc_range_nid()
โ โโโ cma_init_reserved_mem()
โ โโโ cma_new_area()
โ
โผ (core_initcall)
cma_init_reserved_areas()
โ
โโโ cma_activate_area() โ ๋นํธ๋งต + ์กด ๊ฒ์ฆ
โโโ bitmap_zalloc()
โโโ cma_validate_zones()
โโโ init_cma_reserved_pageblock()
โโโ set_bit(CMA_ACTIVATED)
CMA ํ ๋น/ํด์ ํ๋ฆ
์ฅ์น ๋๋ผ์ด๋ฒ (DMA, GPU, etc.)
โ
โผ
cma_alloc(cma, count, align, no_warn)
โ
โโโ cma_alloc_frozen()
โ โโโ __cma_alloc_frozen()
โ โโโ cma_range_alloc() โ ๋ ์ธ์ง๋ณ ๋ฐ๋ณต
โ โโโ bitmap_find_next_zero_area_off()
โ โโโ page_range_contiguous()
โ โโโ bitmap_set()
โ โโโ alloc_contig_frozen_range() โ Buddy์์ ๋๊ฒฐ
โ โโโ isolate_migratepages_block() ๋ฑ
โ
โผ ์ฌ์ฉ ์๋ฃ
cma_release(cma, pages, count)
โ
โโโ find_cma_memrange()
โโโ put_page_testzero() x count
โโโ __cma_release_frozen()
โโโ free_contig_frozen_range() โ Buddy์ ๋ฐํ
โโโ cma_clear_bitmap()
์กฐ๊ฑด๋ณ ๋น๊ต
CMA ์์ญ ์ ํ ๋น๊ต
| ๊ตฌ๋ถ | ๋จ์ผ ๋ ์ธ์ง | ๋ฉํฐ ๋ ์ธ์ง |
|---|---|---|
| **์ด๊ธฐํ ํจ์** | `cma_declare_contiguous_nid()` | `cma_declare_contiguous_multi()` |
| **๋ ์ธ์ง ์** | 1 | 2~8 (`CMA_MAX_RANGES`) |
| **์ฌ์ฉ ์๋๋ฆฌ์ค** | ๋ฉ๋ชจ๋ฆฌ ํ ์๋ ์์คํ | 4GB ์ large block ๋ถ์ฐ ์ |
| **๋นํธ๋งต** | ๋ ์ธ์ง๋น 1๊ฐ | ๋ ์ธ์ง๋ณ ๋ ๋ฆฝ ๋นํธ๋งต |
| **ํ ๋น ํ์** | ๋จ์ผ ๋นํธ๋งต ์ํ | ๋ ์ธ์ง ์์๋๋ก ํ์ |
| **๋ํ ์ฌ์ฉ์ฒ** | ๊ธฐ๋ณธ DMA ์์ญ | hugetlb CMA, ๋์ฉ๋ ๋์คํ๋ ์ด |
ํ ๋น ๊ฒฝ๋ก ๋น๊ต
| ๊ฒฝ๋ก | ํจ์ | ํน์ง |
|---|---|---|
| **์ผ๋ฐ ํ ๋น** | `cma_alloc()` | refcount ์ค์ , ๋๋ผ์ด๋ฒ์ฉ |
| **Frozen ํ ๋น** | `cma_alloc_frozen()` | refcount ์์ด ๋ฐํ |
| **Frozen Compound** | `cma_alloc_frozen_compound()` | `__GFP_COMP` ํฌํจ, huge page์ฉ |
| **์ด๊ธฐ ํ ๋น** | `cma_reserve_early()` | ๋ถํ ์ด๊ธฐ, ๋นํธ๋งต ์์, ๋จ์ผ ์ค๋ ๋ |
์ด๊ธฐํ ์์ ๋น๊ต
| ๋จ๊ณ | ํจ์ | ์์ |
|---|---|---|
| **๋ฉ๋ชจ๋ฆฌ ์์ฝ** | `cma_declare_contiguous_nid()` | arch ์ด๊ธฐํ (memblock ํ์ฑํ ํ) |
| **๋นํธ๋งต/๊ฒ์ฆ** | `cma_activate_area()` | `core_initcall` (slab ํ์ฑํ ํ) |
| **์ด๊ธฐ ํ ๋น** | `cma_reserve_early()` | `CMA_ACTIVATED` ์ด์ |
๊ด๋ จ ๋ฌธ์
DMA API๋ฅผ ํตํ CMA ์ฌ์ฉ
๋๋ถ๋ถ์ ๋๋ผ์ด๋ฒ๋ cma_alloc()์ ์ง์ ํธ์ถํ์ง ์๊ณ DMA API๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
/* ๋๋ผ์ด๋ฒ์์ DMA ๋ฒํผ ํ ๋น โ CMA๋ฅผ ํตํด ์๋ ์ฐ์ ํ๋ณด */
void *vaddr = dma_alloc_coherent(dev, size, &dma_handle, GFP_KERNEL);
/* ๋ฐํ ์ */
dma_free_coherent(dev, size, vaddr, dma_handle);
dma_alloc_coherent()๋ CONFIG_DMA_CMA๊ฐ ํ์ฑํ๋๋ฉด ๋ด๋ถ์ ์ผ๋ก CMA ์์ญ์์ ์ฐ์ ํ์ด์ง๋ฅผ ํ ๋นํฉ๋๋ค. ๋๋ผ์ด๋ฒ ๊ฐ๋ฐ์๋ CMA ์กด์ฌ ์ฌ๋ถ๋ฅผ ์ ํ์ ์์ด DMA API๋ง ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
๋ถํธ ํ๋ผ๋ฏธํฐ๋ก CMA ์์ญ ์ค์
์ปค๋ ๋ถํธ ํ๋ผ๋ฏธํฐ๋ก CMA ์์ญ ํฌ๊ธฐ์ ์์น๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
# ๊ธฐ๋ณธ CMA ์์ญ 256MB ์ค์
cma=256M
# ํน์ ๋ฌผ๋ฆฌ ์ฃผ์ ๋ฒ์์ 256MB CMA ์ค์
cma=256M@0-4G
# Device Tree์์ CMA ์ค์ (์๋ฒ ๋๋)
# reserved-memory {
# linux,cma {
# compatible = "shared-dma-pool";
# reusable;
# size = <0x10000000>; /* 256MB */
# };
# };
CMA vs HugeTLB ๋น๊ต
| ๊ตฌ๋ถ | CMA | HugeTLB |
|---|---|---|
| **ํ์ ํ์ฉ** | movable ํ์ด์ง๊ฐ ์ผ๋ฐ ๋ฉ๋ชจ๋ฆฌ๋ก ์ฌ์ฉ (๋ญ๋น ์์) | ์์ฝ ์ฆ์ ์ ์ฉ (์ผ๋ฐ ์ฌ์ฉ ๋ถ๊ฐ) |
| **์ ์ฐ์ฑ** | ๋์ โ ํ์ ์ ๋ง์ด๊ทธ๋ ์ด์ ์ผ๋ก ํ๋ณด | ๋ฎ์ โ ๋ฏธ๋ฆฌ ํ๋ณด๋ ๊ฒ๋ง ์ฌ์ฉ |
| **์คํจ ์์ธ** | unmovable ํ์ด์ง ์นจํฌ, ๋ง์ด๊ทธ๋ ์ด์ ํ์์์ | ์์ฝ ๋ถ์กฑ ์ ์ฆ์ ์คํจ |
| **์ ํฉํ ์ฉ๋** | DMA, ๋์คํ๋ ์ด ํ๋ ์๋ฒํผ, GPU | ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋์ฉ๋ ์บ์ |
| **์ปค๋ ํ๋ผ๋ฏธํฐ** | `cma=256M` | `hugepagesz=2M hugepages=128` |
CMA ์คํจ ์์ธ๊ณผ ๋์
CMA ํ ๋น์ด ์คํจํ๋ ๋ํ์ ์ธ ์์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1. unmovable ํ์ด์ง ์นจํฌ: slab ํ ๋น์, ํ์ด์ง ํ
์ด๋ธ ๋ฑ unmovable ํ์ด์ง๊ฐ CMA ์์ญ์ ์์นํ๋ฉด ๋ง์ด๊ทธ๋ ์ด์
์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ฌ์ ์ MIGRATE_CMA ํ์
์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
2. ๋ง์ด๊ทธ๋ ์ด์ ํ์์์: ๋๋์ movable ํ์ด์ง๋ฅผ ์ด๋ํด์ผ ํ ๋ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
3. ๋ฌผ๋ฆฌ์ ์ฐ์์ฑ ๋ถ์กฑ: ๋ฉํฐ ๋ ์ธ์ง ๊ตฌ์ฑ ์์๋ ๊ฐ ๋ ์ธ์ง ๋ด๋ถ์์ ์ฐ์ ์์ญ์ ํ๋ณดํ์ง ๋ชปํ ์ ์์ต๋๋ค.
# CMA ์์ญ์ unmovable ํ์ด์ง ์นจํฌ ํ์ธ
cat /proc/pagetypeinfo | grep -A2 "MIGRATE_CMA"
# CMA ์คํจ ์ dmesg ํ์ธ
dmesg | grep -i "cma"
์ฐธ๊ณ : minzkn.com๊ณผ์ ์ฐจ์ด
minzkn.com ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ฐ์ ํ์ด์ง์ "ํน์ ๋ฉ๋ชจ๋ฆฌ" ์น์ ์์ CMA๋ฅผ ๊ฐ๋ตํ ๋ค๋ฃน๋๋ค. minzkn์ CMA๋ฅผ "DMA ๋๋ฐ์ด์ค๋ฅผ ์ํ ๋์ฉ๋ ์ฐ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ํ ๋น"์ผ๋ก ์ค๋ช ํ๋ฉฐ, ๋ค์ ํต์ฌ ํฌ์ธํธ๋ฅผ ๊ฐ์กฐํฉ๋๋ค:
dma_alloc_coherent()๋ฅผ ํตํ ์๋ ์ฐ๊ฒฐ์ฐ๋ฆฌ ๋ฌธ์๋ ์ด๋ณด๋ค ๋ ์์ธํ๊ฒ ๋ฉํฐ ๋ ์ธ์ง ์ง์, ํ ๋น/ํด์ ๋ด๋ถ ํ๋ฆ, ์กด ๊ฒ์ฆ ๋ก์ง, cma_reserve_early ์ด๊ธฐ ํ ๋น ๋ฉ์ปค๋์ฆ์ ๋ถ์ํ๊ณ ์์ต๋๋ค.