forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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 <[email protected]> Cc: Alexey Dobriyan <[email protected]> Cc: Bhupesh Sharma <[email protected]> Cc: Eric Biederman <[email protected]> Cc: James Morse <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
- Loading branch information
Showing
4 changed files
with
21 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,6 +10,7 @@ | |
* Safe accesses to vmalloc/direct-mapped discontiguous areas, Kanoj Sarcar <[email protected]> | ||
*/ | ||
|
||
#include <linux/crash_core.h> | ||
#include <linux/mm.h> | ||
#include <linux/proc_fs.h> | ||
#include <linux/kcore.h> | ||
|
@@ -81,10 +82,13 @@ static size_t get_kcore_size(int *nphdr, size_t *phdrs_len, size_t *notes_len, | |
} | ||
|
||
*phdrs_len = *nphdr * sizeof(struct elf_phdr); | ||
*notes_len = (3 * (sizeof(struct elf_note) + ALIGN(sizeof(CORE_STR), 4)) + | ||
*notes_len = (4 * sizeof(struct elf_note) + | ||
3 * ALIGN(sizeof(CORE_STR), 4) + | ||
VMCOREINFO_NOTE_NAME_BYTES + | ||
ALIGN(sizeof(struct elf_prstatus), 4) + | ||
ALIGN(sizeof(struct elf_prpsinfo), 4) + | ||
ALIGN(arch_task_struct_size, 4)); | ||
ALIGN(arch_task_struct_size, 4) + | ||
ALIGN(vmcoreinfo_size, 4)); | ||
*data_offset = PAGE_ALIGN(sizeof(struct elfhdr) + *phdrs_len + | ||
*notes_len); | ||
return *data_offset + size; | ||
|
@@ -406,6 +410,16 @@ read_kcore(struct file *file, char __user *buffer, size_t buflen, loff_t *fpos) | |
sizeof(prpsinfo)); | ||
append_kcore_note(notes, &i, CORE_STR, NT_TASKSTRUCT, current, | ||
arch_task_struct_size); | ||
/* | ||
* vmcoreinfo_size is mostly constant after init time, but it | ||
* can be changed by crash_save_vmcoreinfo(). Racing here with a | ||
* panic on another CPU before the machine goes down is insanely | ||
* unlikely, but it's better to not leave potential buffer | ||
* overflows lying around, regardless. | ||
*/ | ||
append_kcore_note(notes, &i, VMCOREINFO_NOTE_NAME, 0, | ||
vmcoreinfo_data, | ||
min(vmcoreinfo_size, notes_len - i)); | ||
|
||
tsz = min_t(size_t, buflen, notes_offset + notes_len - *fpos); | ||
if (copy_to_user(buffer, notes + *fpos - notes_offset, tsz)) { | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters