mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	bpf: Add function to extract program source info
Prepare a function for use in future patches that can extract the file info, line info, and the source line number for a given BPF program provided it's program counter. Only the basename of the file path is provided, given it can be excessively long in some cases. This will be used in later patches to print source info to the BPF stream. Reviewed-by: Emil Tsalapatis <emil@etsalapatis.com> Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com> Link: https://lore.kernel.org/r/20250703204818.925464-4-memxor@gmail.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
		
							parent
							
								
									5ab154f146
								
							
						
					
					
						commit
						0e521efaf3
					
				
					 2 changed files with 50 additions and 0 deletions
				
			
		|  | @ -3661,4 +3661,7 @@ static inline bool bpf_is_subprog(const struct bpf_prog *prog) | |||
| 	return prog->aux->func_idx != 0; | ||||
| } | ||||
| 
 | ||||
| int bpf_prog_get_file_line(struct bpf_prog *prog, unsigned long ip, const char **filep, | ||||
| 			   const char **linep, int *nump); | ||||
| 
 | ||||
| #endif /* _LINUX_BPF_H */ | ||||
|  |  | |||
|  | @ -3213,3 +3213,50 @@ EXPORT_SYMBOL(bpf_stats_enabled_key); | |||
| 
 | ||||
| EXPORT_TRACEPOINT_SYMBOL_GPL(xdp_exception); | ||||
| EXPORT_TRACEPOINT_SYMBOL_GPL(xdp_bulk_tx); | ||||
| 
 | ||||
| #ifdef CONFIG_BPF_SYSCALL | ||||
| 
 | ||||
| int bpf_prog_get_file_line(struct bpf_prog *prog, unsigned long ip, const char **filep, | ||||
| 			   const char **linep, int *nump) | ||||
| { | ||||
| 	int idx = -1, insn_start, insn_end, len; | ||||
| 	struct bpf_line_info *linfo; | ||||
| 	void **jited_linfo; | ||||
| 	struct btf *btf; | ||||
| 
 | ||||
| 	btf = prog->aux->btf; | ||||
| 	linfo = prog->aux->linfo; | ||||
| 	jited_linfo = prog->aux->jited_linfo; | ||||
| 
 | ||||
| 	if (!btf || !linfo || !jited_linfo) | ||||
| 		return -EINVAL; | ||||
| 	len = prog->aux->func ? prog->aux->func[prog->aux->func_idx]->len : prog->len; | ||||
| 
 | ||||
| 	linfo = &prog->aux->linfo[prog->aux->linfo_idx]; | ||||
| 	jited_linfo = &prog->aux->jited_linfo[prog->aux->linfo_idx]; | ||||
| 
 | ||||
| 	insn_start = linfo[0].insn_off; | ||||
| 	insn_end = insn_start + len; | ||||
| 
 | ||||
| 	for (int i = 0; i < prog->aux->nr_linfo && | ||||
| 	     linfo[i].insn_off >= insn_start && linfo[i].insn_off < insn_end; i++) { | ||||
| 		if (jited_linfo[i] >= (void *)ip) | ||||
| 			break; | ||||
| 		idx = i; | ||||
| 	} | ||||
| 
 | ||||
| 	if (idx == -1) | ||||
| 		return -ENOENT; | ||||
| 
 | ||||
| 	/* Get base component of the file path. */ | ||||
| 	*filep = btf_name_by_offset(btf, linfo[idx].file_name_off); | ||||
| 	*filep = kbasename(*filep); | ||||
| 	/* Obtain the source line, and strip whitespace in prefix. */ | ||||
| 	*linep = btf_name_by_offset(btf, linfo[idx].line_off); | ||||
| 	while (isspace(**linep)) | ||||
| 		*linep += 1; | ||||
| 	*nump = BPF_LINE_INFO_LINE_NUM(linfo[idx].line_col); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Kumar Kartikeya Dwivedi
						Kumar Kartikeya Dwivedi