/* KASAN still think the page is in-use, so skip it. */
kasan_disable_current();
memset(kasan_reset_tag(addr), PAGE_POISON, PAGE_SIZE);
kasan_enable_current();
kunmap_local(addr);
}
void __kernel_poison_pages(struct page *page, int n)
{ int i;
for (i = 0; i < n; i++)
poison_page(page + i);
}
staticbool single_bit_flip(unsignedchar a, unsignedchar b)
{ unsignedchar error = a ^ b;
start = memchr_inv(mem, PAGE_POISON, bytes); if (!start) return;
for (end = mem + bytes - 1; end > start; end--) { if (*end != PAGE_POISON) break;
}
if (!__ratelimit(&ratelimit)) return; elseif (start == end && single_bit_flip(*start, PAGE_POISON))
pr_err("pagealloc: single bit error\n"); else
pr_err("pagealloc: memory corruption\n");
addr = kmap_local_page(page);
kasan_disable_current(); /* * Page poisoning when enabled poisons each and every page * that is freed to buddy. Thus no extra check is done to * see if a page was poisoned.
*/
check_poison_mem(page, kasan_reset_tag(addr), PAGE_SIZE);
kasan_enable_current();
kunmap_local(addr);
}
void __kernel_unpoison_pages(struct page *page, int n)
{ int i;
for (i = 0; i < n; i++)
unpoison_page(page + i);
}
#ifndef CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC void __kernel_map_pages(struct page *page, int numpages, int enable)
{ /* This function does nothing, all work is done via poison pages */
} #endif
Messung V0.5
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.