return -EINVAL;
 
        old_dev = unrcu_pointer(xchg(&dtab->netdev_map[k], NULL));
-       if (old_dev)
+       if (old_dev) {
                call_rcu(&old_dev->rcu, __dev_map_entry_free);
+               atomic_dec((atomic_t *)&dtab->items);
+       }
        return 0;
 }
 
        old_dev = unrcu_pointer(xchg(&dtab->netdev_map[i], RCU_INITIALIZER(dev)));
        if (old_dev)
                call_rcu(&old_dev->rcu, __dev_map_entry_free);
+       else
+               atomic_inc((atomic_t *)&dtab->items);
 
        return 0;
 }
                                      __dev_map_hash_lookup_elem);
 }
 
+static u64 dev_map_mem_usage(const struct bpf_map *map)
+{
+       struct bpf_dtab *dtab = container_of(map, struct bpf_dtab, map);
+       u64 usage = sizeof(struct bpf_dtab);
+
+       if (map->map_type == BPF_MAP_TYPE_DEVMAP_HASH)
+               usage += (u64)dtab->n_buckets * sizeof(struct hlist_head);
+       else
+               usage += (u64)map->max_entries * sizeof(struct bpf_dtab_netdev *);
+       usage += atomic_read((atomic_t *)&dtab->items) *
+                        (u64)sizeof(struct bpf_dtab_netdev);
+       return usage;
+}
+
 BTF_ID_LIST_SINGLE(dev_map_btf_ids, struct, bpf_dtab)
 const struct bpf_map_ops dev_map_ops = {
        .map_meta_equal = bpf_map_meta_equal,
        .map_update_elem = dev_map_update_elem,
        .map_delete_elem = dev_map_delete_elem,
        .map_check_btf = map_check_no_btf,
+       .map_mem_usage = dev_map_mem_usage,
        .map_btf_id = &dev_map_btf_ids[0],
        .map_redirect = dev_map_redirect,
 };
        .map_update_elem = dev_map_hash_update_elem,
        .map_delete_elem = dev_map_hash_delete_elem,
        .map_check_btf = map_check_no_btf,
+       .map_mem_usage = dev_map_mem_usage,
        .map_btf_id = &dev_map_btf_ids[0],
        .map_redirect = dev_hash_map_redirect,
 };
                                if (!dev || netdev != dev->dev)
                                        continue;
                                odev = unrcu_pointer(cmpxchg(&dtab->netdev_map[i], RCU_INITIALIZER(dev), NULL));
-                               if (dev == odev)
+                               if (dev == odev) {
                                        call_rcu(&dev->rcu,
                                                 __dev_map_entry_free);
+                                       atomic_dec((atomic_t *)&dtab->items);
+                               }
                        }
                }
                rcu_read_unlock();