Skip to content
Navigation Menu
Toggle navigation
Sign in
In this repository
All GitHub Enterprise
↵
Jump to
↵
No suggested jump to results
In this repository
All GitHub Enterprise
↵
Jump to
↵
In this organization
All GitHub Enterprise
↵
Jump to
↵
In this repository
All GitHub Enterprise
↵
Jump to
↵
Sign in
Reseting focus
You signed in with another tab or window.
Reload
to refresh your session.
You signed out in another tab or window.
Reload
to refresh your session.
You switched accounts on another tab or window.
Reload
to refresh your session.
Dismiss alert
{{ message }}
mariux64
/
linux
Public
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Issues
2
Pull requests
0
Actions
Projects
0
Wiki
Security
Insights
Additional navigation options
Code
Issues
Pull requests
Actions
Projects
Wiki
Security
Insights
Files
6a11f75
Documentation
arch
block
crypto
drivers
firmware
fs
include
init
ipc
kernel
lib
mm
Kconfig
Kconfig.debug
Makefile
allocpercpu.c
backing-dev.c
bootmem.c
bounce.c
debug-pagealloc.c
dmapool.c
fadvise.c
failslab.c
filemap.c
filemap_xip.c
fremap.c
highmem.c
hugetlb.c
internal.h
maccess.c
madvise.c
memcontrol.c
memory.c
memory_hotplug.c
mempolicy.c
mempool.c
migrate.c
mincore.c
mlock.c
mm_init.c
mmap.c
mmu_notifier.c
mmzone.c
mprotect.c
mremap.c
msync.c
nommu.c
oom_kill.c
page-writeback.c
page_alloc.c
page_cgroup.c
page_io.c
page_isolation.c
pagewalk.c
pdflush.c
percpu.c
prio_tree.c
quicklist.c
readahead.c
rmap.c
shmem.c
shmem_acl.c
slab.c
slob.c
slub.c
sparse-vmemmap.c
sparse.c
swap.c
swap_state.c
swapfile.c
thrash.c
truncate.c
util.c
vmalloc.c
vmscan.c
vmstat.c
net
samples
scripts
security
sound
usr
virt
.gitignore
.mailmap
COPYING
CREDITS
Kbuild
MAINTAINERS
Makefile
README
REPORTING-BUGS
Breadcrumbs
linux
/
mm
/
debug-pagealloc.c
Blame
Blame
Latest commit
History
History
129 lines (107 loc) · 2.55 KB
Breadcrumbs
linux
/
mm
/
debug-pagealloc.c
Top
File metadata and controls
Code
Blame
129 lines (107 loc) · 2.55 KB
Raw
#include <linux/kernel.h> #include <linux/mm.h> #include <linux/page-debug-flags.h> #include <linux/poison.h> static inline void set_page_poison(struct page *page) { __set_bit(PAGE_DEBUG_FLAG_POISON, &page->debug_flags); } static inline void clear_page_poison(struct page *page) { __clear_bit(PAGE_DEBUG_FLAG_POISON, &page->debug_flags); } static inline bool page_poison(struct page *page) { return test_bit(PAGE_DEBUG_FLAG_POISON, &page->debug_flags); } static void poison_highpage(struct page *page) { /* * Page poisoning for highmem pages is not implemented. * * This can be called from interrupt contexts. * So we need to create a new kmap_atomic slot for this * application and it will need interrupt protection. */ } static void poison_page(struct page *page) { void *addr; if (PageHighMem(page)) { poison_highpage(page); return; } set_page_poison(page); addr = page_address(page); memset(addr, PAGE_POISON, PAGE_SIZE); } static void poison_pages(struct page *page, int n) { int i; for (i = 0; i < n; i++) poison_page(page + i); } static bool single_bit_flip(unsigned char a, unsigned char b) { unsigned char error = a ^ b; return error && !(error & (error - 1)); } static void check_poison_mem(unsigned char *mem, size_t bytes) { unsigned char *start; unsigned char *end; for (start = mem; start < mem + bytes; start++) { if (*start != PAGE_POISON) break; } if (start == mem + bytes) return; for (end = mem + bytes - 1; end > start; end--) { if (*end != PAGE_POISON) break; } if (!printk_ratelimit()) return; else if (start == end && single_bit_flip(*start, PAGE_POISON)) printk(KERN_ERR "pagealloc: single bit error\n"); else printk(KERN_ERR "pagealloc: memory corruption\n"); print_hex_dump(KERN_ERR, "", DUMP_PREFIX_ADDRESS, 16, 1, start, end - start + 1, 1); dump_stack(); } static void unpoison_highpage(struct page *page) { /* * See comment in poison_highpage(). * Highmem pages should not be poisoned for now */ BUG_ON(page_poison(page)); } static void unpoison_page(struct page *page) { if (PageHighMem(page)) { unpoison_highpage(page); return; } if (page_poison(page)) { void *addr = page_address(page); check_poison_mem(addr, PAGE_SIZE); clear_page_poison(page); } } static void unpoison_pages(struct page *page, int n) { int i; for (i = 0; i < n; i++) unpoison_page(page + i); } void kernel_map_pages(struct page *page, int numpages, int enable) { if (!debug_pagealloc_enabled) return; if (enable) unpoison_pages(page, numpages); else poison_pages(page, numpages); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
You can’t perform that action at this time.