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

Commit bd601b6a authored by Jakub Kicinski's avatar Jakub Kicinski Committed by David S. Miller
Browse files

bpf: report offload info to user space



Extend struct bpf_prog_info to contain information about program
being bound to a device.  Since the netdev may get destroyed while
program still exists we need a flag to indicate the program is
loaded for a device, even if the device is gone.

Signed-off-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: default avatarSimon Horman <simon.horman@netronome.com>
Reviewed-by: default avatarQuentin Monnet <quentin.monnet@netronome.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ab3f0063
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -506,6 +506,7 @@ static inline int cpu_map_enqueue(struct bpf_cpu_map_entry *rcpu,

int bpf_prog_offload_compile(struct bpf_prog *prog);
void bpf_prog_offload_destroy(struct bpf_prog *prog);
u32 bpf_prog_offload_ifindex(struct bpf_prog *prog);

#if defined(CONFIG_NET) && defined(CONFIG_BPF_SYSCALL)
int bpf_prog_offload_init(struct bpf_prog *prog, union bpf_attr *attr);
+6 −0
Original line number Diff line number Diff line
@@ -895,6 +895,10 @@ enum sk_action {

#define BPF_TAG_SIZE	8

enum bpf_prog_status {
	BPF_PROG_STATUS_DEV_BOUND	= (1 << 0),
};

struct bpf_prog_info {
	__u32 type;
	__u32 id;
@@ -908,6 +912,8 @@ struct bpf_prog_info {
	__u32 nr_map_ids;
	__aligned_u64 map_ids;
	char name[BPF_OBJ_NAME_LEN];
	__u32 ifindex;
	__u32 status;
} __attribute__((aligned(8)));

struct bpf_map_info {
+12 −0
Original line number Diff line number Diff line
@@ -144,6 +144,18 @@ int bpf_prog_offload_compile(struct bpf_prog *prog)
	return bpf_prog_offload_translate(prog);
}

u32 bpf_prog_offload_ifindex(struct bpf_prog *prog)
{
	struct bpf_dev_offload *offload = prog->aux->offload;
	u32 ifindex;

	rtnl_lock();
	ifindex = offload->netdev ? offload->netdev->ifindex : 0;
	rtnl_unlock();

	return ifindex;
}

const struct bpf_prog_ops bpf_offload_prog_ops = {
};

+5 −0
Original line number Diff line number Diff line
@@ -1592,6 +1592,11 @@ static int bpf_prog_get_info_by_fd(struct bpf_prog *prog,
			return -EFAULT;
	}

	if (bpf_prog_is_dev_bound(prog->aux)) {
		info.status |= BPF_PROG_STATUS_DEV_BOUND;
		info.ifindex = bpf_prog_offload_ifindex(prog);
	}

done:
	if (copy_to_user(uinfo, &info, info_len) ||
	    put_user(info_len, &uattr->info.info_len))