bpf_object__create_maps(struct bpf_object *obj)
 {
        struct bpf_create_map_attr create_attr = {};
+       int nr_cpus = 0;
        unsigned int i;
        int err;
 
                create_attr.map_flags = def->map_flags;
                create_attr.key_size = def->key_size;
                create_attr.value_size = def->value_size;
-               create_attr.max_entries = def->max_entries;
+               if (def->type == BPF_MAP_TYPE_PERF_EVENT_ARRAY &&
+                   !def->max_entries) {
+                       if (!nr_cpus)
+                               nr_cpus = libbpf_num_possible_cpus();
+                       if (nr_cpus < 0) {
+                               pr_warning("failed to determine number of system CPUs: %d\n",
+                                          nr_cpus);
+                               err = nr_cpus;
+                               goto err_out;
+                       }
+                       pr_debug("map '%s': setting size to %d\n",
+                                map->name, nr_cpus);
+                       create_attr.max_entries = nr_cpus;
+               } else {
+                       create_attr.max_entries = def->max_entries;
+               }
                create_attr.btf_fd = 0;
                create_attr.btf_key_type_id = 0;
                create_attr.btf_value_type_id = 0;
                *pfd = bpf_create_map_xattr(&create_attr);
                if (*pfd < 0 && (create_attr.btf_key_type_id ||
                                 create_attr.btf_value_type_id)) {
-                       cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg));
+                       err = -errno;
+                       cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg));
                        pr_warning("Error in bpf_create_map_xattr(%s):%s(%d). Retrying without BTF.\n",
-                                  map->name, cp, errno);
+                                  map->name, cp, err);
                        create_attr.btf_fd = 0;
                        create_attr.btf_key_type_id = 0;
                        create_attr.btf_value_type_id = 0;
                if (*pfd < 0) {
                        size_t j;
 
-                       err = *pfd;
+                       err = -errno;
 err_out:
-                       cp = libbpf_strerror_r(errno, errmsg, sizeof(errmsg));
-                       pr_warning("failed to create map (name: '%s'): %s\n",
-                                  map->name, cp);
+                       cp = libbpf_strerror_r(err, errmsg, sizeof(errmsg));
+                       pr_warning("failed to create map (name: '%s'): %s(%d)\n",
+                                  map->name, cp, err);
                        for (j = 0; j < i; j++)
                                zclose(obj->maps[j].fd);
                        return err;