diff options
Diffstat (limited to 'tools/lib/bpf/libbpf.c')
| -rw-r--r-- | tools/lib/bpf/libbpf.c | 27 | 
1 files changed, 20 insertions, 7 deletions
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 4751936831d7..32e6b6bc6f7d 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -90,6 +90,7 @@ static const char *libbpf_strerror_table[NR_ERRNO] = {  	[ERRCODE_OFFSET(VERIFY)]	= "Kernel verifier blocks program loading",  	[ERRCODE_OFFSET(PROG2BIG)]	= "Program too big",  	[ERRCODE_OFFSET(KVER)]		= "Incorrect kernel version", +	[ERRCODE_OFFSET(PROGTYPE)]	= "Kernel doesn't support this program type",  };  int libbpf_strerror(int err, char *buf, size_t size) @@ -926,15 +927,27 @@ load_program(enum bpf_prog_type type, struct bpf_insn *insns,  		pr_warning("-- BEGIN DUMP LOG ---\n");  		pr_warning("\n%s\n", log_buf);  		pr_warning("-- END LOG --\n"); +	} else if (insns_cnt >= BPF_MAXINSNS) { +		pr_warning("Program too large (%d insns), at most %d insns\n", +			   insns_cnt, BPF_MAXINSNS); +		ret = -LIBBPF_ERRNO__PROG2BIG;  	} else { -		if (insns_cnt >= BPF_MAXINSNS) { -			pr_warning("Program too large (%d insns), at most %d insns\n", -				   insns_cnt, BPF_MAXINSNS); -			ret = -LIBBPF_ERRNO__PROG2BIG; -		} else if (log_buf) { -			pr_warning("log buffer is empty\n"); -			ret = -LIBBPF_ERRNO__KVER; +		/* Wrong program type? */ +		if (type != BPF_PROG_TYPE_KPROBE) { +			int fd; + +			fd = bpf_load_program(BPF_PROG_TYPE_KPROBE, insns, +					      insns_cnt, license, kern_version, +					      NULL, 0); +			if (fd >= 0) { +				close(fd); +				ret = -LIBBPF_ERRNO__PROGTYPE; +				goto out; +			}  		} + +		if (log_buf) +			ret = -LIBBPF_ERRNO__KVER;  	}  out:  | 
