lib/buildid: rename build_id_parse() into build_id_parse_nofault()
Make it clear that build_id_parse() assumes that it can take no page fault by renaming it and current few users to build_id_parse_nofault(). Also add build_id_parse() stub which for now falls back to non-sleepable implementation, but will be changed in subsequent patches to take advantage of sleepable context. PROCMAP_QUERY ioctl() on /proc/<pid>/maps file is using build_id_parse() and will automatically take advantage of more reliable sleepable context implementation. Reviewed-by: Eduard Zingerman <eddyz87@gmail.com> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/r/20240829174232.3133883-6-andrii@kernel.org Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
4e9d360c4c
commit
45b8fc3096
@ -7,8 +7,8 @@
|
||||
#define BUILD_ID_SIZE_MAX 20
|
||||
|
||||
struct vm_area_struct;
|
||||
int build_id_parse(struct vm_area_struct *vma, unsigned char *build_id,
|
||||
__u32 *size);
|
||||
int build_id_parse(struct vm_area_struct *vma, unsigned char *build_id, __u32 *size);
|
||||
int build_id_parse_nofault(struct vm_area_struct *vma, unsigned char *build_id, __u32 *size);
|
||||
int build_id_parse_buf(const void *buf, unsigned char *build_id, u32 buf_size);
|
||||
|
||||
#if IS_ENABLED(CONFIG_STACKTRACE_BUILD_ID) || IS_ENABLED(CONFIG_VMCORE_INFO)
|
||||
|
@ -156,7 +156,7 @@ static void stack_map_get_build_id_offset(struct bpf_stack_build_id *id_offs,
|
||||
goto build_id_valid;
|
||||
}
|
||||
vma = find_vma(current->mm, ips[i]);
|
||||
if (!vma || build_id_parse(vma, id_offs[i].build_id, NULL)) {
|
||||
if (!vma || build_id_parse_nofault(vma, id_offs[i].build_id, NULL)) {
|
||||
/* per entry fall back to ips */
|
||||
id_offs[i].status = BPF_STACK_BUILD_ID_IP;
|
||||
id_offs[i].ip = ips[i];
|
||||
|
@ -8851,7 +8851,7 @@ got_name:
|
||||
mmap_event->event_id.header.size = sizeof(mmap_event->event_id) + size;
|
||||
|
||||
if (atomic_read(&nr_build_id_events))
|
||||
build_id_parse(vma, mmap_event->build_id, &mmap_event->build_id_size);
|
||||
build_id_parse_nofault(vma, mmap_event->build_id, &mmap_event->build_id_size);
|
||||
|
||||
perf_iterate_sb(perf_event_mmap_output,
|
||||
mmap_event,
|
||||
|
@ -293,10 +293,12 @@ static int get_build_id_64(struct freader *r, unsigned char *build_id, __u32 *si
|
||||
* @build_id: buffer to store build id, at least BUILD_ID_SIZE long
|
||||
* @size: returns actual build id size in case of success
|
||||
*
|
||||
* Return: 0 on success, -EINVAL otherwise
|
||||
* Assumes no page fault can be taken, so if relevant portions of ELF file are
|
||||
* not already paged in, fetching of build ID fails.
|
||||
*
|
||||
* Return: 0 on success; negative error, otherwise
|
||||
*/
|
||||
int build_id_parse(struct vm_area_struct *vma, unsigned char *build_id,
|
||||
__u32 *size)
|
||||
int build_id_parse_nofault(struct vm_area_struct *vma, unsigned char *build_id, __u32 *size)
|
||||
{
|
||||
const Elf32_Ehdr *ehdr;
|
||||
struct freader r;
|
||||
@ -335,6 +337,23 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse build ID of ELF file mapped to VMA
|
||||
* @vma: vma object
|
||||
* @build_id: buffer to store build id, at least BUILD_ID_SIZE long
|
||||
* @size: returns actual build id size in case of success
|
||||
*
|
||||
* Assumes faultable context and can cause page faults to bring in file data
|
||||
* into page cache.
|
||||
*
|
||||
* Return: 0 on success; negative error, otherwise
|
||||
*/
|
||||
int build_id_parse(struct vm_area_struct *vma, unsigned char *build_id, __u32 *size)
|
||||
{
|
||||
/* fallback to non-faultable version for now */
|
||||
return build_id_parse_nofault(vma, build_id, size);
|
||||
}
|
||||
|
||||
/**
|
||||
* build_id_parse_buf - Get build ID from a buffer
|
||||
* @buf: ELF note section(s) to parse
|
||||
|
Loading…
Reference in New Issue
Block a user