kernel: bpf: devmap: Create __dev_map_alloc_node
* Like in fca16e5107
Change-Id: I95915b56f381c8f5851b6e7827eed6064aefe586
This commit is contained in:
@@ -437,12 +437,35 @@ static int dev_map_delete_elem(struct bpf_map *map, void *key)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct bpf_dtab_netdev *__dev_map_alloc_node(struct net *net,
|
||||||
|
struct bpf_dtab *dtab,
|
||||||
|
u32 ifindex,
|
||||||
|
unsigned int idx)
|
||||||
|
{
|
||||||
|
gfp_t gfp = GFP_ATOMIC | __GFP_NOWARN;
|
||||||
|
struct bpf_dtab_netdev *dev;
|
||||||
|
|
||||||
|
dev = kmalloc_node(sizeof(*dev), gfp, dtab->map.numa_node);
|
||||||
|
if (!dev)
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
|
dev->dev = dev_get_by_index(net, ifindex);
|
||||||
|
if (!dev->dev) {
|
||||||
|
kfree(dev);
|
||||||
|
return ERR_PTR(-EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
dev->bit = idx;
|
||||||
|
dev->dtab = dtab;
|
||||||
|
|
||||||
|
return dev;
|
||||||
|
}
|
||||||
|
|
||||||
static int dev_map_update_elem(struct bpf_map *map, void *key, void *value,
|
static int dev_map_update_elem(struct bpf_map *map, void *key, void *value,
|
||||||
u64 map_flags)
|
u64 map_flags)
|
||||||
{
|
{
|
||||||
struct bpf_dtab *dtab = container_of(map, struct bpf_dtab, map);
|
struct bpf_dtab *dtab = container_of(map, struct bpf_dtab, map);
|
||||||
struct net *net = current->nsproxy->net_ns;
|
struct net *net = current->nsproxy->net_ns;
|
||||||
gfp_t gfp = GFP_ATOMIC | __GFP_NOWARN;
|
|
||||||
struct bpf_dtab_netdev *dev, *old_dev;
|
struct bpf_dtab_netdev *dev, *old_dev;
|
||||||
u32 i = *(u32 *)key;
|
u32 i = *(u32 *)key;
|
||||||
u32 ifindex = *(u32 *)value;
|
u32 ifindex = *(u32 *)value;
|
||||||
@@ -457,26 +480,9 @@ static int dev_map_update_elem(struct bpf_map *map, void *key, void *value,
|
|||||||
if (!ifindex) {
|
if (!ifindex) {
|
||||||
dev = NULL;
|
dev = NULL;
|
||||||
} else {
|
} else {
|
||||||
dev = kmalloc_node(sizeof(*dev), gfp, map->numa_node);
|
dev = __dev_map_alloc_node(net, dtab, ifindex, i);
|
||||||
if (!dev)
|
if (IS_ERR(dev))
|
||||||
return -ENOMEM;
|
return PTR_ERR(dev);
|
||||||
|
|
||||||
dev->bulkq = __alloc_percpu_gfp(sizeof(*dev->bulkq),
|
|
||||||
sizeof(void *), gfp);
|
|
||||||
if (!dev->bulkq) {
|
|
||||||
kfree(dev);
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
dev->dev = dev_get_by_index(net, ifindex);
|
|
||||||
if (!dev->dev) {
|
|
||||||
free_percpu(dev->bulkq);
|
|
||||||
kfree(dev);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
dev->bit = i;
|
|
||||||
dev->dtab = dtab;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Use call_rcu() here to ensure rcu critical sections have completed
|
/* Use call_rcu() here to ensure rcu critical sections have completed
|
||||||
|
|||||||
Reference in New Issue
Block a user