return -EINVAL;
 
        log_level = load_attr->log_level;
-       if (log_level > 2 || (log_level && !log_buf))
+       if (log_level > (4 | 2 | 1) || (log_level && !log_buf))
                return -EINVAL;
 
        name_len = load_attr->name ? strlen(load_attr->name) : 0;
 
 #define MAPS_RELAX_COMPAT      0x01
 
 /* Recommend log buffer size */
-#define BPF_LOG_BUF_SIZE (256 * 1024)
+#define BPF_LOG_BUF_SIZE (16 * 1024 * 1024) /* verifier maximum in kernels <= 5.1 */
 LIBBPF_API int
 bpf_load_program_xattr(const struct bpf_load_program_attr *load_attr,
                       char *log_buf, size_t log_buf_sz);
 
                };
        } *reloc_desc;
        int nr_reloc;
+       int log_level;
 
        struct {
                int nr;
 {
        struct bpf_load_program_attr load_attr;
        char *cp, errmsg[STRERR_BUFSIZE];
+       int log_buf_size = BPF_LOG_BUF_SIZE;
        char *log_buf;
        int ret;
 
        load_attr.line_info = prog->line_info;
        load_attr.line_info_rec_size = prog->line_info_rec_size;
        load_attr.line_info_cnt = prog->line_info_cnt;
+       load_attr.log_level = prog->log_level;
        if (!load_attr.insns || !load_attr.insns_cnt)
                return -EINVAL;
 
-       log_buf = malloc(BPF_LOG_BUF_SIZE);
+retry_load:
+       log_buf = malloc(log_buf_size);
        if (!log_buf)
                pr_warning("Alloc log buffer for bpf loader error, continue without log\n");
 
-       ret = bpf_load_program_xattr(&load_attr, log_buf, BPF_LOG_BUF_SIZE);
+       ret = bpf_load_program_xattr(&load_attr, log_buf, log_buf_size);
 
        if (ret >= 0) {
+               if (load_attr.log_level)
+                       pr_debug("verifier log:\n%s", log_buf);
                *pfd = ret;
                ret = 0;
                goto out;
        }
 
+       if (errno == ENOSPC) {
+               log_buf_size <<= 1;
+               free(log_buf);
+               goto retry_load;
+       }
        ret = -LIBBPF_ERRNO__LOAD;
        cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg));
        pr_warning("load bpf program failed: %s\n", cp);
                bpf_program__set_expected_attach_type(prog,
                                                      expected_attach_type);
 
+               prog->log_level = attr->log_level;
                if (!first_prog)
                        first_prog = prog;
        }