return 0;
 }
 
-bool bpf_prog_map_compatible(struct bpf_map *map,
-                            const struct bpf_prog *fp)
+static bool __bpf_prog_map_compatible(struct bpf_map *map,
+                                     const struct bpf_prog *fp)
 {
        enum bpf_prog_type prog_type = resolve_prog_type(fp);
        bool ret;
        if (fp->kprobe_override)
                return false;
 
-       /* XDP programs inserted into maps are not guaranteed to run on
-        * a particular netdev (and can run outside driver context entirely
-        * in the case of devmap and cpumap). Until device checks
-        * are implemented, prohibit adding dev-bound programs to program maps.
-        */
-       if (bpf_prog_is_dev_bound(aux))
-               return false;
-
        spin_lock(&map->owner.lock);
        if (!map->owner.type) {
                /* There's no owner yet where we could check for
        return ret;
 }
 
+bool bpf_prog_map_compatible(struct bpf_map *map, const struct bpf_prog *fp)
+{
+       /* XDP programs inserted into maps are not guaranteed to run on
+        * a particular netdev (and can run outside driver context entirely
+        * in the case of devmap and cpumap). Until device checks
+        * are implemented, prohibit adding dev-bound programs to program maps.
+        */
+       if (bpf_prog_is_dev_bound(fp->aux))
+               return false;
+
+       return __bpf_prog_map_compatible(map, fp);
+}
+
 static int bpf_check_tail_call(const struct bpf_prog *fp)
 {
        struct bpf_prog_aux *aux = fp->aux;
                if (!map_type_contains_progs(map))
                        continue;
 
-               if (!bpf_prog_map_compatible(map, fp)) {
+               if (!__bpf_prog_map_compatible(map, fp)) {
                        ret = -EINVAL;
                        goto out;
                }