ํ๋์จ์ด ์ค๋ฅ ์ฃผ์ (HWPoison)
๊ฐ์ (Overview)
Linux ์ปค๋์ ํ๋์จ์ด ์ค๋ฅ ์ฃผ์
๋ฉ์ปค๋์ฆ์ ์ค์ ๋ฉ๋ชจ๋ฆฌ ํ๋์จ์ด ์ค๋ฅ(MCE: Machine Check Exception)๋ฅผ ์๋ฎฌ๋ ์ด์
ํ์ฌ ํ
์คํธํ๋ ๊ธฐ๋ฅ์
๋๋ค. hwpoison-inject.c ๋ชจ๋์ debugfs ์ธํฐํ์ด์ค๋ฅผ ํตํด ์์์ ํ์ด์ง ํ๋ ์ ๋ฒํธ(PFN)์ ํ๋์จ์ด ์ค๋ฅ๋ฅผ ์ฃผ์
ํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ์ด๋ ์ฃผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ค๋ฅ ๋ณต๊ตฌ ์์คํ
์ ํ
์คํธ ๋ฐ ๋๋ฒ๊น
์ ์ฌ์ฉ๋ฉ๋๋ค.
์ด ๋ฉ์ปค๋์ฆ์ ์ค์ ํ๋์จ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ์ปค๋์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ํ์ธํ ์ ์๋ ์ค์ํ ๋๊ตฌ์
๋๋ค. memory_failure() ํจ์๋ ์ค์ ํ๋์จ์ด ์ค๋ฅ ์ฒ๋ฆฌ์ ํต์ฌ์ผ๋ก, ์ค๋ฅ๊ฐ ๋ฐ์ํ ํ์ด์ง๋ฅผ ๋ณต๊ตฌํ๊ฑฐ๋ ๊ด๋ จ ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํ๋ ๋ฑ์ ๋์์ ์ํํฉ๋๋ค.
corrupt-pfn๊ณผ unpoison-pfn์ ํ๋์จ์ด ์ํ๋ฅผ ์ง์ ๋ฐ๊พธ์ง ์๋ ์ํํธ์จ์ด ์์ค ์ธํฐํ์ด์ค๋ผ์, ์ฅ์น ์ค๋ฅ๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ๋ ์ฃผ์
๊ณผ ํด์ ๋ฅผ ๋ฐ๋ณตํด ๋ณผ ์ ์์ต๋๋ค.
์์ค ํ์ผ ๊ฒฝ๋ก:
โโโ mm/hwpoison-inject.c โ ํ๋์จ์ด ์ค๋ฅ ์ฃผ์
๋ชจ๋
โโโ mm/memory-failure.c โ ์ค์ ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ์ด
โโโ mm/internal.h โ ๋ด๋ถ ํจ์ ์ ์ธ
โโโ include/linux/page-flags.h โ PG_hwpoison ํ๋๊ทธ ์ ์
๋น ๋ฅธ ์ ๊ฒ ๋ช ๋ น
# hwpoison ๋ชจ๋ ์ํ ํ์ธ
lsmod | grep hwpoison
# debugfs hwpoison ๋๋ ํ ๋ฆฌ ํ์ธ
ls -la /sys/kernel/debug/hwpoison/
# ํ์ฌ ํํฐ ์ค์ ๊ฐ ํ์ธ
cat /sys/kernel/debug/hwpoison/corrupt-filter-enable
cat /sys/kernel/debug/hwpoison/corrupt-filter-dev-major
cat /sys/kernel/debug/hwpoison/corrupt-filter-dev-minor
cat /sys/kernel/debug/hwpoison/corrupt-filter-flags-mask
cat /sys/kernel/debug/hwpoison/corrupt-filter-flags-value
cat /sys/kernel/debug/hwpoison/corrupt-filter-memcg
# ํ๋์จ์ด ์ค๋ฅ ์ฃผ์
(PFN 0x12345์ ์ค๋ฅ ์ฃผ์
)
echo 0x12345 > /sys/kernel/debug/hwpoison/corrupt-pfn
# ์ค๋ฅ ์ฃผ์
ํํฐ ํ์ฑํ
echo 1 > /sys/kernel/debug/hwpoison/corrupt-filter-enable
# ๋๋ฐ์ด์ค ํํฐ ์ค์ (๋ฉ์ด์ ๋ฒํธ 8)
echo 8 > /sys/kernel/debug/hwpoison/corrupt-filter-dev-major
# ๋ฉ๋ชจ๋ฆฌ ๊ทธ๋ฃน ํํฐ ์ค์
echo 12345 > /sys/kernel/debug/hwpoison/corrupt-filter-memcg
# ์ค๋ฅ ํด์ (PFN 0x12345์ ์ค๋ฅ ํด์ )
echo 0x12345 > /sys/kernel/debug/hwpoison/unpoison-pfn
# ๋ฉ๋ชจ๋ฆฌ ์ค๋ฅ ์ด๋ ฅ ํ์ธ
dmesg | grep -i "memory failure"
# hwpoison ํ์ด์ง ์ ํ์ธ
cat /proc/meminfo | grep -i hwpoison
# ์ค์ ํ๋์จ์ด ์ค๋ฅ ๋ก๊ทธ ํ์ธ
dmesg | grep -i "mce\|machine check"
ํต์ฌ ์๋ฃ๊ตฌ์กฐ
1. `hwpoison_filter_enable` (mm/hwpoison-inject.c:14)
static u32 hwpoison_filter_enable;
// ํ๋์จ์ด ์ค๋ฅ ํํฐ ํ์ฑํ ์ํ
// 0: ํํฐ ๋นํ์ฑํ (๋ชจ๋ ํ์ด์ง์ ์ค๋ฅ ์ฃผ์
)
// 1: ํํฐ ํ์ฑํ (์ง์ ๋ ์กฐ๊ฑด์ ํ์ด์ง์๋ง ์ค๋ฅ ์ฃผ์
)
2. `hwpoison_filter_dev_major/minor` (mm/hwpoison-inject.c:15-16)
static u32 hwpoison_filter_dev_major = ~0U;
static u32 hwpoison_filter_dev_minor = ~0U;
// ๋๋ฐ์ด์ค ๋ฒํธ ํํฐ (๋ฉ์ด์ /๋ง์ด๋ ๋ฒํธ)
// ~0U: ํํฐ ๋ฏธ์ค์ (๋ชจ๋ ๋๋ฐ์ด์ค ํ์ฉ)
3. `hwpoison_filter_flags_mask/value` (mm/hwpoison-inject.c:17-18)
static u64 hwpoison_filter_flags_mask;
static u64 hwpoison_filter_flags_value;
// ํ์ด์ง ํ๋๊ทธ ํํฐ
// mask: ๊ฒ์ฌํ ํ๋๊ทธ ๋ง์คํฌ
// value: ์ผ์นํด์ผ ํ๋ ํ๋๊ทธ ๊ฐ
4. `hwpoison_filter_memcg` (mm/hwpoison-inject.c:68)
static u64 hwpoison_filter_memcg;
// ๋ฉ๋ชจ๋ฆฌ cgroup ํํฐ
// 0: ํํฐ ๋ฏธ์ค์ (๋ชจ๋ cgroup ํ์ฉ)
// non-zero: ์ง์ ๋ cgroup์ ํ์ด์ง์๋ง ์ค๋ฅ ์ฃผ์
5. `PG_hwpoison` (include/linux/page-flags.h:118)
PG_hwpoison, /* ํ๋์จ์ด๋ก ์์๋ ํ์ด์ง. ์๋์ง ๋ง ๊ฒ */
// ํ์ด์ง ํ๋๊ทธ ์ค ํ๋๋ก, ํ๋์จ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ ํ์ด์ง์ ์ค์ ๋จ
6. `PG_has_hwpoisoned` (include/linux/page-flags.h:192)
PG_has_hwpoisoned = PG_active,
// ๋ณตํฉ ํ์ด์ง(THP ๋ฑ) ๋ด์ hwpoison๋ ์๋ธํ์ด์ง๊ฐ ํ๋ ์ด์ ์์์ ๋ํ๋
ํต์ฌ ํจ์
1. `hwpoison_inject()` (mm/hwpoison-inject.c:102-142)
static int hwpoison_inject(void *data, u64 val)
{
unsigned long pfn = val;
struct page *p;
struct folio *folio;
int err;
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
if (!pfn_valid(pfn))
return -ENXIO;
p = pfn_to_page(pfn);
folio = page_folio(p);
if (!hwpoison_filter_enable)
goto inject;
shake_folio(folio);
/* ๋น-LRU ํ์ด์ง๋ free page๋ฅผ ์ ์ธํ๊ณ ์ง์ํ์ง ์๋๋ค. */
if (!folio_test_lru(folio) && !folio_test_hugetlb(folio) &&
!is_free_buddy_page(p))
return 0;
/* ๋์ ์์ ์๋ง PG_hwpoison์ด ์กํ๋๋ก ๋จผ์ ๋์จํ ๊ฒ์ฌ๋ฅผ ํ๋ค. */
err = hwpoison_filter(&folio->page);
if (err)
return 0;
inject:
pr_info("Injecting memory failure at pfn %#lx\n", pfn);
err = memory_failure(pfn, MF_SW_SIMULATED);
return (err == -EOPNOTSUPP) ? 0 : err;
}
// debugfs๋ฅผ ํตํด ํ๋์จ์ด ์ค๋ฅ๋ฅผ ์ฃผ์
ํ๋ ํจ์
// PFN: ์ฃผ์
ํ ํ์ด์ง ํ๋ ์ ๋ฒํธ
// MF_SW_SIMULATED: ์ํํธ์จ์ด ์๋ฎฌ๋ ์ด์
ํ๋๊ทธ
2. `hwpoison_filter()` (mm/hwpoison-inject.c:83-98)
static int hwpoison_filter(struct page *p)
{
if (!hwpoison_filter_enable)
return 0;
if (hwpoison_filter_dev(p))
return -EINVAL;
if (hwpoison_filter_flags(p))
return -EINVAL;
if (hwpoison_filter_task(p))
return -EINVAL;
return 0;
}
// ํ์ด์ง๊ฐ ์ค์ ๋ ํํฐ ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ๊ฒ์ฌ
// 0: ํํฐ ํต๊ณผ (์ค๋ฅ ์ฃผ์
ํ์ฉ)
// -EINVAL: ํํฐ ์คํจ (์ค๋ฅ ์ฃผ์
๊ฑฐ๋ถ)
3. `memory_failure()` (mm/memory-failure.c:2388-2558)
try_memory_failure_hugetlb()๋ HugeTLB๋ฅผ ๋จผ์ ๋ถ๊ธฐํ๊ณ , take_page_off_buddy()๋ free buddy page๋ฅผ ๋ณ๋๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์ผ๋ฐ ํ์ด์ง๋ hwpoison_user_mappings()๋ก ๋งคํ์ ์ ๋ฆฌํ ๋ค identify_page_state()๋ก ์ต์ข
ํ์ ์ ๋ด๋ฆฝ๋๋ค.
try_again:
res = try_memory_failure_hugetlb(pfn, flags, &hugetlb);
if (hugetlb)
goto unlock_mutex;
if (TestSetPageHWPoison(p)) {
res = -EHWPOISON;
if (flags & MF_ACTION_REQUIRED)
res = kill_accessing_process(current, pfn, flags);
if (flags & MF_COUNT_INCREASED)
put_page(p);
action_result(pfn, MF_MSG_ALREADY_POISONED, MF_FAILED);
goto unlock_mutex;
}
res = get_hwpoison_page(p, flags);
if (!res) {
if (is_free_buddy_page(p)) {
if (take_page_off_buddy(p)) {
page_ref_inc(p);
res = MF_RECOVERED;
} else {
if (retry) {
ClearPageHWPoison(p);
retry = false;
goto try_again;
}
res = MF_FAILED;
}
res = action_result(pfn, MF_MSG_BUDDY, res);
} else {
res = action_result(pfn, MF_MSG_KERNEL_HIGH_ORDER, MF_IGNORED);
}
goto unlock_mutex;
} else if (res < 0) {
res = action_result(pfn, MF_MSG_GET_HWPOISON, MF_IGNORED);
goto unlock_mutex;
}
folio = page_folio(p);
folio_lock(folio);
if (hwpoison_filter(p)) {
ClearPageHWPoison(p);
folio_unlock(folio);
folio_put(folio);
res = -EOPNOTSUPP;
goto unlock_mutex;
}
folio_unlock(folio);
if (folio_test_large(folio)) {
const int new_order = min_order_for_split(folio);
int err;
folio_set_has_hwpoisoned(folio);
err = try_to_split_thp_page(p, new_order, false);
if (err || new_order) {
folio = page_folio(p);
res = -EHWPOISON;
kill_procs_now(p, pfn, flags, folio);
put_page(p);
action_result(pfn, MF_MSG_UNSPLIT_THP, MF_FAILED);
goto unlock_mutex;
}
VM_BUG_ON_PAGE(!page_count(p), p);
folio = page_folio(p);
}
shake_folio(folio);
folio_lock(folio);
WARN_ON(folio_test_large(folio));
page_flags = folio->flags.f;
if (!folio_test_lru(folio) && !folio_test_writeback(folio))
goto identify_page_state;
folio_wait_writeback(folio);
if (!hwpoison_user_mappings(folio, p, pfn, flags)) {
res = action_result(pfn, MF_MSG_UNMAP_FAILED, MF_FAILED);
goto unlock_page;
}
if (folio_test_lru(folio) && !folio_test_swapcache(folio) &&
folio->mapping == NULL) {
res = action_result(pfn, MF_MSG_TRUNCATED_LRU, MF_IGNORED);
goto unlock_page;
}
identify_page_state:
res = identify_page_state(pfn, p, page_flags);
mutex_unlock(&mf_mutex);
return res;
unlock_page:
folio_unlock(folio);
unlock_mutex:
mutex_unlock(&mf_mutex);
return res;
}
4. `hwpoison_unpoison()` (mm/hwpoison-inject.c:144-150)
static int hwpoison_unpoison(void *data, u64 val)
{
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
return unpoison_memory(val);
}
// hwpoison ์ํ๋ฅผ ํด์ ํ๋ ํจ์
// val: ํด์ ํ ํ์ด์ง ํ๋ ์ ๋ฒํธ
5. `pfn_inject_init()` (mm/hwpoison-inject.c:162-200)
static int __init pfn_inject_init(void)
{
hwpoison_dir = debugfs_create_dir("hwpoison", NULL);
/* ์๋ poison/unpoison ์ธํฐํ์ด์ค๋ ํ๋์จ์ด ์ํ๋ฅผ ์ง์ ๋ฐ๊พธ์ง ์๋๋ค. */
/* ํ๋์จ์ด ์ง์์ด ์์ด๋ ์ํํธ์จ์ด ์์ค ํ
์คํธ์ ์ฌ์ฉํ ์ ์๋ค. */
debugfs_create_file("corrupt-pfn", 0200, hwpoison_dir, NULL,
&hwpoison_fops);
debugfs_create_file("unpoison-pfn", 0200, hwpoison_dir, NULL,
&unpoison_fops);
debugfs_create_u32("corrupt-filter-enable", 0600, hwpoison_dir,
&hwpoison_filter_enable);
debugfs_create_u32("corrupt-filter-dev-major", 0600, hwpoison_dir,
&hwpoison_filter_dev_major);
debugfs_create_u32("corrupt-filter-dev-minor", 0600, hwpoison_dir,
&hwpoison_filter_dev_minor);
debugfs_create_u64("corrupt-filter-flags-mask", 0600, hwpoison_dir,
&hwpoison_filter_flags_mask);
debugfs_create_u64("corrupt-filter-flags-value", 0600, hwpoison_dir,
&hwpoison_filter_flags_value);
#ifdef CONFIG_MEMCG
debugfs_create_u64("corrupt-filter-memcg", 0600, hwpoison_dir,
&hwpoison_filter_memcg);
#endif
hwpoison_filter_register(hwpoison_filter);
return 0;
}
// ๋ชจ๋ ์ด๊ธฐํ ํจ์ - debugfs ์ธํฐํ์ด์ค ์์ฑ
ํธ์ถ ํ๋ฆ
1. hwpoison_inject() โ debugfs ์ฐ๊ธฐ ํธ๋ฆฌ๊ฑฐ
โโโ capable(CAP_SYS_ADMIN) ํ์ธ
โโโ pfn_valid(pfn) ํ์ธ
โโโ pfn_to_page(pfn) โ ํ์ด์ง ๋ณํ
โโโ hwpoison_filter_enable ํ์ธ
โ โโโ shake_folio(folio) โ ํ์ด์ง ์บ์์์ ์ ๊ฑฐ
โ โโโ folio_test_lru()/folio_test_hugetlb()/is_free_buddy_page() ๊ฒ์ฌ
โ โโโ hwpoison_filter() โ ํํฐ ์กฐ๊ฑด ๊ฒ์ฌ
โโโ memory_failure(pfn, MF_SW_SIMULATED) โ ์ค์ ์ค๋ฅ ์ฒ๋ฆฌ
2. memory_failure() โ ์ค์ ์ค๋ฅ ์ฒ๋ฆฌ
โโโ mutex_lock(&mf_mutex) โ ์ ์ญ ๋ฎคํ
์ค ํ๋
โโโ pfn_to_online_page(pfn) โ ์จ๋ผ์ธ ํ์ด์ง ํ์ธ
โโโ try_memory_failure_hugetlb() โ HugeTLB ํ์ด์ง ์ฒ๋ฆฌ
โโโ TestSetPageHWPoison(p) โ hwpoison ํ๋๊ทธ ์ค์
โโโ get_hwpoison_page() โ ํ์ด์ง ์ฐธ์กฐ ์นด์ดํธ ์ฆ๊ฐ
โโโ hwpoison_filter(p) โ ํํฐ ์ฌ๊ฒ์ฌ
โโโ folio_test_large(folio) โ THP ๋ถํ ์ฒ๋ฆฌ
โโโ shake_folio(folio) โ ํ์ด์ง ์บ์์์ ์ ๊ฑฐ
โโโ hwpoison_user_mappings() โ ์ฌ์ฉ์ ๋งคํ ํด์
โโโ action_result() โ ๊ฒฐ๊ณผ ๊ธฐ๋ก
3. hwpoison_filter() โ ํํฐ ์ฒดํฌ
โโโ hwpoison_filter_dev(p) โ ๋๋ฐ์ด์ค ๋ฒํธ ๊ฒ์ฌ
โโโ hwpoison_filter_flags(p) โ ํ์ด์ง ํ๋๊ทธ ๊ฒ์ฌ
โโโ hwpoison_filter_task(p) โ ๋ฉ๋ชจ๋ฆฌ cgroup ๊ฒ์ฌ
memory_failure()๋ ํ์ฌ ํ์ด์ง ํ๋๊ทธ๋ฅผ ๋จผ์ ํ์ธํ๊ณ , ๋ถ๋ฅ๊ฐ ์ถฉ๋ถํ์ง ์์ผ๋ฉด ์ ์ฅํด ๋ page_flags ์ค๋
์ท์ผ๋ก ๋ค์ ํ์ ํฉ๋๋ค.
์กฐ๊ฑด๋ณ ๋น๊ต
1. hwpoison ์ฃผ์ ๊ฒฝ๋ก ๋น๊ต
| ์กฐ๊ฑด | hwpoison_inject | memory_failure | ๋น๊ณ |
|---|---|---|---|
| ํธ๋ฆฌ๊ฑฐ | debugfs ์ฐ๊ธฐ | ํ๋์จ์ด MCE | ์ํํธ์จ์ด vs ํ๋์จ์ด |
| ๊ถํ | CAP_SYS_ADMIN | ์ปค๋ ๋ด๋ถ | ์ฌ์ฉ์ ๊ณต๊ฐ vs ์ปค๋ ๊ณต๊ฐ |
| ๋์ | ์์ PFN | ์ค๋ฅ ๊ฐ์ง๋ ํ์ด์ง | ์ ํ์ vs ์๋ |
| ํ๋๊ทธ | MF_SW_SIMULATED | MF_ACTION_REQUIRED ๋ฑ | ์๋ฎฌ๋ ์ด์ vs ์ค์ |
2. ํํฐ ๋์ ๋น๊ต
| ํํฐ ํ์ | ์ค์ ํ์ผ | ๋์ | ๋น๊ณ |
|---|---|---|---|
| ๋๋ฐ์ด์ค | corrupt-filter-dev-major/minor | ํน์ ๋๋ฐ์ด์ค์ ํ์ด์ง๋ง ์ค๋ฅ ์ฃผ์ | ํ์ผ ์์คํ ๊ด๋ จ |
| ํ๋๊ทธ | corrupt-filter-flags-mask/value | ํน์ ํ๋๊ทธ๋ฅผ ๊ฐ์ง ํ์ด์ง๋ง ์ค๋ฅ ์ฃผ์ | ํ์ด์ง ์ํ ๊ธฐ๋ฐ |
| ๋ฉ๋ชจ๋ฆฌ cgroup | corrupt-filter-memcg | ํน์ cgroup์ ํ์ด์ง๋ง ์ค๋ฅ ์ฃผ์ | ํ๋ก์ธ์ค ๊ฒฉ๋ฆฌ |
| ์ ์ฒด | corrupt-filter-enable | ํํฐ ์ ์ฒด ํ์ฑํ/๋นํ์ฑํ | ์ค์์น ์ญํ |
3. ํ์ด์ง ์ํ๋ณ ์ฒ๋ฆฌ
| ํ์ด์ง ์ํ | ์ฒ๋ฆฌ ๋ฐฉ์ | ํจ์ | ๋น๊ณ |
|---|---|---|---|
| LRU ํ์ด์ง | hwpoison ์ฒ๋ฆฌ | hwpoison_user_mappings() | ์ผ๋ฐ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง |
| HugeTLB ํ์ด์ง | ํน์ ์ฒ๋ฆฌ | try_memory_failure_hugetlb() | Huge Page ์ง์ |
| ๋น-LRU ๊ณ ์ฐจ ํ์ด์ง | ์ค๋ฅ ๋ฌด์ | action_result(MF_MSG_KERNEL_HIGH_ORDER, MF_IGNORED) | ์ปค๋์ด ์ง์ ์ฐ๋ ํ์ด์ง |
| free ํ์ด์ง | buddy์์ ์ ๊ฑฐ | take_page_off_buddy() | ๋น ํ์ด์ง ์ฒ๋ฆฌ |
๊ด๋ จ ๋ฌธ์
์ฐธ๊ณ ์ฌํญ
1. hwpoison ์ฃผ์ ์๋๋ฆฌ์ค
# ์๋๋ฆฌ์ค 1: ํน์ ํ์ด์ง์ ์ค๋ฅ ์ฃผ์
echo 0x100000 > /sys/kernel/debug/hwpoison/corrupt-pfn
# ์๋๋ฆฌ์ค 2: ๋๋ฐ์ด์ค ํํฐ์ ํจ๊ป ์ค๋ฅ ์ฃผ์
echo 1 > /sys/kernel/debug/hwpoison/corrupt-filter-enable
echo 8 > /sys/kernel/debug/hwpoison/corrupt-filter-dev-major
echo 0x100000 > /sys/kernel/debug/hwpoison/corrupt-pfn
# ์๋๋ฆฌ์ค 3: ๋ฉ๋ชจ๋ฆฌ cgroup ํํฐ์ ํจ๊ป ์ค๋ฅ ์ฃผ์
echo 1 > /sys/kernel/debug/hwpoison/corrupt-filter-enable
echo 12345 > /sys/kernel/debug/hwpoison/corrupt-filter-memcg
echo 0x100000 > /sys/kernel/debug/hwpoison/corrupt-pfn
2. hwpoison ๋๋ฒ๊น ํ
# hwpoison ๊ด๋ จ ๋ก๊ทธ ์์ธ ํ์ธ
echo 8 > /proc/sys/kernel/printk
dmesg -w | grep -i "memory failure\|hwpoison\|mce"
# ํ์ด์ง ํ๋๊ทธ ํ์ธ (hwpoison ์ํ ํ์ธ)
cat /proc/kpageflags | grep -i hwpoison
# ๋ฉ๋ชจ๋ฆฌ ์ค๋ฅ ์ด๋ ฅ ํ์ธ
cat /sys/devices/system/memory/soft_offline_page
# hwpoison ํ์ด์ง ์ ํ์ธ
cat /proc/vmstat | grep -i hwpoison
3. hwpoison๊ณผ ๊ด๋ จ๋ ์ปค๋ ์ปจํผ๊ทธ ์ต์
# CONFIG_MEMORY_FAILURE: ํ๋์จ์ด ์ค๋ฅ ์ฒ๋ฆฌ ํ์ฑํ
# CONFIG_HWPOISON_INJECT: hwpoison ์ฃผ์
๋ชจ๋ ํ์ฑํ
# CONFIG_MCE: Machine Check Exception ์ง์
# CONFIG_X86_MCE: x86 MCE ์ง์