diff options
author | Omar Sandoval <osandov@fb.com> | 2018-08-22 00:55:20 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-08-22 13:52:46 -0400 |
commit | 23c85094fe1895caefdd19ef624ee687ec5f4507 (patch) | |
tree | 13a0d0b93980e585384310a021b3772dc37b9e54 /fs/proc/kcore.c | |
parent | eff4345e7fba0aac8665f00e8599b36946d9aaec (diff) |
proc/kcore: add vmcoreinfo note to /proc/kcore
The vmcoreinfo information is useful for runtime debugging tools, not just
for crash dumps. A lot of this information can be determined by other
means, but this is much more convenient, and it only adds a page at most
to the file.
Link: http://lkml.kernel.org/r/fddbcd08eed76344863303878b12de1c1e2a04b6.1531953780.git.osandov@fb.com
Signed-off-by: Omar Sandoval <osandov@fb.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Cc: Bhupesh Sharma <bhsharma@redhat.com>
Cc: Eric Biederman <ebiederm@xmission.com>
Cc: James Morse <james.morse@arm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/proc/kcore.c')
-rw-r--r-- | fs/proc/kcore.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/fs/proc/kcore.c b/fs/proc/kcore.c index 758c14e46a44..80464432dfe6 100644 --- a/fs/proc/kcore.c +++ b/fs/proc/kcore.c | |||
@@ -10,6 +10,7 @@ | |||
10 | * Safe accesses to vmalloc/direct-mapped discontiguous areas, Kanoj Sarcar <kanoj@sgi.com> | 10 | * Safe accesses to vmalloc/direct-mapped discontiguous areas, Kanoj Sarcar <kanoj@sgi.com> |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <linux/crash_core.h> | ||
13 | #include <linux/mm.h> | 14 | #include <linux/mm.h> |
14 | #include <linux/proc_fs.h> | 15 | #include <linux/proc_fs.h> |
15 | #include <linux/kcore.h> | 16 | #include <linux/kcore.h> |
@@ -81,10 +82,13 @@ static size_t get_kcore_size(int *nphdr, size_t *phdrs_len, size_t *notes_len, | |||
81 | } | 82 | } |
82 | 83 | ||
83 | *phdrs_len = *nphdr * sizeof(struct elf_phdr); | 84 | *phdrs_len = *nphdr * sizeof(struct elf_phdr); |
84 | *notes_len = (3 * (sizeof(struct elf_note) + ALIGN(sizeof(CORE_STR), 4)) + | 85 | *notes_len = (4 * sizeof(struct elf_note) + |
86 | 3 * ALIGN(sizeof(CORE_STR), 4) + | ||
87 | VMCOREINFO_NOTE_NAME_BYTES + | ||
85 | ALIGN(sizeof(struct elf_prstatus), 4) + | 88 | ALIGN(sizeof(struct elf_prstatus), 4) + |
86 | ALIGN(sizeof(struct elf_prpsinfo), 4) + | 89 | ALIGN(sizeof(struct elf_prpsinfo), 4) + |
87 | ALIGN(arch_task_struct_size, 4)); | 90 | ALIGN(arch_task_struct_size, 4) + |
91 | ALIGN(vmcoreinfo_size, 4)); | ||
88 | *data_offset = PAGE_ALIGN(sizeof(struct elfhdr) + *phdrs_len + | 92 | *data_offset = PAGE_ALIGN(sizeof(struct elfhdr) + *phdrs_len + |
89 | *notes_len); | 93 | *notes_len); |
90 | return *data_offset + size; | 94 | return *data_offset + size; |
@@ -406,6 +410,16 @@ read_kcore(struct file *file, char __user *buffer, size_t buflen, loff_t *fpos) | |||
406 | sizeof(prpsinfo)); | 410 | sizeof(prpsinfo)); |
407 | append_kcore_note(notes, &i, CORE_STR, NT_TASKSTRUCT, current, | 411 | append_kcore_note(notes, &i, CORE_STR, NT_TASKSTRUCT, current, |
408 | arch_task_struct_size); | 412 | arch_task_struct_size); |
413 | /* | ||
414 | * vmcoreinfo_size is mostly constant after init time, but it | ||
415 | * can be changed by crash_save_vmcoreinfo(). Racing here with a | ||
416 | * panic on another CPU before the machine goes down is insanely | ||
417 | * unlikely, but it's better to not leave potential buffer | ||
418 | * overflows lying around, regardless. | ||
419 | */ | ||
420 | append_kcore_note(notes, &i, VMCOREINFO_NOTE_NAME, 0, | ||
421 | vmcoreinfo_data, | ||
422 | min(vmcoreinfo_size, notes_len - i)); | ||
409 | 423 | ||
410 | tsz = min_t(size_t, buflen, notes_offset + notes_len - *fpos); | 424 | tsz = min_t(size_t, buflen, notes_offset + notes_len - *fpos); |
411 | if (copy_to_user(buffer, notes + *fpos - notes_offset, tsz)) { | 425 | if (copy_to_user(buffer, notes + *fpos - notes_offset, tsz)) { |