Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 52775b33 authored by Jakub Kicinski's avatar Jakub Kicinski Committed by Daniel Borkmann
Browse files

bpf: offload: report device information about offloaded maps



Tell user space about device on which the map was created.
Unfortunate reality of user ABI makes sharing this code
with program offload difficult but the information is the
same.

Signed-off-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parent 7a0ef693
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -586,6 +586,8 @@ void bpf_prog_offload_destroy(struct bpf_prog *prog);
int bpf_prog_offload_info_fill(struct bpf_prog_info *info,
int bpf_prog_offload_info_fill(struct bpf_prog_info *info,
			       struct bpf_prog *prog);
			       struct bpf_prog *prog);


int bpf_map_offload_info_fill(struct bpf_map_info *info, struct bpf_map *map);

int bpf_map_offload_lookup_elem(struct bpf_map *map, void *key, void *value);
int bpf_map_offload_lookup_elem(struct bpf_map *map, void *key, void *value);
int bpf_map_offload_update_elem(struct bpf_map *map,
int bpf_map_offload_update_elem(struct bpf_map *map,
				void *key, void *value, u64 flags);
				void *key, void *value, u64 flags);
+3 −0
Original line number Original line Diff line number Diff line
@@ -938,6 +938,9 @@ struct bpf_map_info {
	__u32 max_entries;
	__u32 max_entries;
	__u32 map_flags;
	__u32 map_flags;
	char  name[BPF_OBJ_NAME_LEN];
	char  name[BPF_OBJ_NAME_LEN];
	__u32 ifindex;
	__u64 netns_dev;
	__u64 netns_ino;
} __attribute__((aligned(8)));
} __attribute__((aligned(8)));


/* User bpf_sock_ops struct to access socket values and specify request ops
/* User bpf_sock_ops struct to access socket values and specify request ops
+55 −0
Original line number Original line Diff line number Diff line
@@ -413,6 +413,61 @@ int bpf_map_offload_get_next_key(struct bpf_map *map, void *key, void *next_key)
	return ret;
	return ret;
}
}


struct ns_get_path_bpf_map_args {
	struct bpf_offloaded_map *offmap;
	struct bpf_map_info *info;
};

static struct ns_common *bpf_map_offload_info_fill_ns(void *private_data)
{
	struct ns_get_path_bpf_map_args *args = private_data;
	struct ns_common *ns;
	struct net *net;

	rtnl_lock();
	down_read(&bpf_devs_lock);

	if (args->offmap->netdev) {
		args->info->ifindex = args->offmap->netdev->ifindex;
		net = dev_net(args->offmap->netdev);
		get_net(net);
		ns = &net->ns;
	} else {
		args->info->ifindex = 0;
		ns = NULL;
	}

	up_read(&bpf_devs_lock);
	rtnl_unlock();

	return ns;
}

int bpf_map_offload_info_fill(struct bpf_map_info *info, struct bpf_map *map)
{
	struct ns_get_path_bpf_map_args args = {
		.offmap	= map_to_offmap(map),
		.info	= info,
	};
	struct inode *ns_inode;
	struct path ns_path;
	void *res;

	res = ns_get_path_cb(&ns_path, bpf_map_offload_info_fill_ns, &args);
	if (IS_ERR(res)) {
		if (!info->ifindex)
			return -ENODEV;
		return PTR_ERR(res);
	}

	ns_inode = ns_path.dentry->d_inode;
	info->netns_dev = new_encode_dev(ns_inode->i_sb->s_dev);
	info->netns_ino = ns_inode->i_ino;
	path_put(&ns_path);

	return 0;
}

bool bpf_offload_dev_match(struct bpf_prog *prog, struct bpf_map *map)
bool bpf_offload_dev_match(struct bpf_prog *prog, struct bpf_map *map)
{
{
	struct bpf_offloaded_map *offmap;
	struct bpf_offloaded_map *offmap;
+6 −0
Original line number Original line Diff line number Diff line
@@ -1801,6 +1801,12 @@ static int bpf_map_get_info_by_fd(struct bpf_map *map,
	info.map_flags = map->map_flags;
	info.map_flags = map->map_flags;
	memcpy(info.name, map->name, sizeof(map->name));
	memcpy(info.name, map->name, sizeof(map->name));


	if (bpf_map_is_dev_bound(map)) {
		err = bpf_map_offload_info_fill(&info, map);
		if (err)
			return err;
	}

	if (copy_to_user(uinfo, &info, info_len) ||
	if (copy_to_user(uinfo, &info, info_len) ||
	    put_user(info_len, &uattr->info.info_len))
	    put_user(info_len, &uattr->info.info_len))
		return -EFAULT;
		return -EFAULT;
+3 −0
Original line number Original line Diff line number Diff line
@@ -938,6 +938,9 @@ struct bpf_map_info {
	__u32 max_entries;
	__u32 max_entries;
	__u32 map_flags;
	__u32 map_flags;
	char  name[BPF_OBJ_NAME_LEN];
	char  name[BPF_OBJ_NAME_LEN];
	__u32 ifindex;
	__u64 netns_dev;
	__u64 netns_ino;
} __attribute__((aligned(8)));
} __attribute__((aligned(8)));


/* User bpf_sock_ops struct to access socket values and specify request ops
/* User bpf_sock_ops struct to access socket values and specify request ops