struct btf *base_btf;
        u32 start_id; /* first type ID in this BTF (0 for base BTF) */
        u32 start_str_off; /* first string offset (0 for base BTF) */
+       char name[MODULE_NAME_LEN];
+       bool kernel_btf;
 };
 
 enum verifier_phase {
 
        btf->data = __start_BTF;
        btf->data_size = __stop_BTF - __start_BTF;
+       btf->kernel_btf = true;
+       snprintf(btf->name, sizeof(btf->name), "vmlinux");
 
        err = btf_parse_hdr(env);
        if (err)
 
        bpf_struct_ops_init(btf, log);
 
-       btf_verifier_env_free(env);
        refcount_set(&btf->refcnt, 1);
+
+       err = btf_alloc_id(btf);
+       if (err)
+               goto errout;
+
+       btf_verifier_env_free(env);
        return btf;
 
 errout:
        struct bpf_btf_info info;
        u32 info_copy, btf_copy;
        void __user *ubtf;
-       u32 uinfo_len;
+       char __user *uname;
+       u32 uinfo_len, uname_len, name_len;
+       int ret = 0;
 
        uinfo = u64_to_user_ptr(attr->info.info);
        uinfo_len = attr->info.info_len;
                return -EFAULT;
        info.btf_size = btf->data_size;
 
+       info.kernel_btf = btf->kernel_btf;
+
+       uname = u64_to_user_ptr(info.name);
+       uname_len = info.name_len;
+       if (!uname ^ !uname_len)
+               return -EINVAL;
+
+       name_len = strlen(btf->name);
+       info.name_len = name_len;
+
+       if (uname) {
+               if (uname_len >= name_len + 1) {
+                       if (copy_to_user(uname, btf->name, name_len + 1))
+                               return -EFAULT;
+               } else {
+                       char zero = '\0';
+
+                       if (copy_to_user(uname, btf->name, uname_len - 1))
+                               return -EFAULT;
+                       if (put_user(zero, uname + uname_len - 1))
+                               return -EFAULT;
+                       /* let user-space know about too short buffer */
+                       ret = -ENOSPC;
+               }
+       }
+
        if (copy_to_user(uinfo, &info, info_copy) ||
            put_user(info_copy, &uattr->info.info_len))
                return -EFAULT;
 
-       return 0;
+       return ret;
 }
 
 int btf_get_fd_by_id(u32 id)