Commit 64cae2fb authored by David S. Miller's avatar David S. Miller
Browse files


Daniel Borkmann says:

====================
pull-request: bpf 2020-08-08

The following pull-request contains BPF updates for your *net* tree.

We've added 11 non-merge commits during the last 2 day(s) which contain
a total of 24 files changed, 216 insertions(+), 135 deletions(-).

The main changes are:

1) Fix UAPI for BPF map iterator before it gets frozen to allow for more
   extensions/customization in future, from Yonghong Song.

2) Fix selftests build to undo verbose build output, from Andrii Nakryiko.

3) Fix inlining compilation error on bpf_do_trace_printk() due to variable
   argument lists, from Stanislav Fomichev.

4) Fix an uninitialized pointer warning at btf__parse_raw() in libbpf,
   from Daniel T. Lee.

5) Fix several compilation warnings in selftests with regards to ignoring
   return value, from Jianlin Lv.

6) Fix interruptions by switching off timeout for BPF tests, from Jiri Benc.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 7ee24926 b8c1a309
Loading
Loading
Loading
Loading
+0 −11
Original line number Diff line number Diff line
@@ -246,17 +246,6 @@ program is loaded the kernel will print warning message, so
this helper is only useful for experiments and prototypes.
Tracing BPF programs are root only.

Q: bpf_trace_printk() helper warning
------------------------------------
Q: When bpf_trace_printk() helper is used the kernel prints nasty
warning message. Why is that?

A: This is done to nudge program authors into better interfaces when
programs need to pass data to user space. Like bpf_perf_event_output()
can be used to efficiently stream data via perf ring buffer.
BPF maps can be used for asynchronous data sharing between kernel
and user space. bpf_trace_printk() should only be used for debugging.

Q: New functionality via kernel modules?
----------------------------------------
Q: Can BPF functionality such as new program or map types, new
+6 −4
Original line number Diff line number Diff line
@@ -1214,15 +1214,17 @@ struct bpf_iter_aux_info {
	struct bpf_map *map;
};

typedef int (*bpf_iter_check_target_t)(struct bpf_prog *prog,
typedef int (*bpf_iter_attach_target_t)(struct bpf_prog *prog,
					union bpf_iter_link_info *linfo,
					struct bpf_iter_aux_info *aux);
typedef void (*bpf_iter_detach_target_t)(struct bpf_iter_aux_info *aux);

#define BPF_ITER_CTX_ARG_MAX 2
struct bpf_iter_reg {
	const char *target;
	bpf_iter_check_target_t check_target;
	bpf_iter_attach_target_t attach_target;
	bpf_iter_detach_target_t detach_target;
	u32 ctx_arg_info_size;
	enum bpf_iter_link_info req_linfo;
	struct bpf_ctx_arg_aux ctx_arg_info[BPF_ITER_CTX_ARG_MAX];
	const struct bpf_iter_seq_info *seq_info;
};
+8 −7
Original line number Diff line number Diff line
@@ -81,6 +81,12 @@ struct bpf_cgroup_storage_key {
	__u32	attach_type;		/* program attach type */
};

union bpf_iter_link_info {
	struct {
		__u32	map_fd;
	} map;
};

/* BPF syscall commands, see bpf(2) man-page for details. */
enum bpf_cmd {
	BPF_MAP_CREATE,
@@ -249,13 +255,6 @@ enum bpf_link_type {
	MAX_BPF_LINK_TYPE,
};

enum bpf_iter_link_info {
	BPF_ITER_LINK_UNSPEC = 0,
	BPF_ITER_LINK_MAP_FD = 1,

	MAX_BPF_ITER_LINK_INFO,
};

/* cgroup-bpf attach flags used in BPF_PROG_ATTACH command
 *
 * NONE(default): No further bpf programs allowed in the subtree.
@@ -623,6 +622,8 @@ union bpf_attr {
		};
		__u32		attach_type;	/* attach type */
		__u32		flags;		/* extra flags */
		__aligned_u64	iter_info;	/* extra bpf_iter_link_info */
		__u32		iter_info_len;	/* iter_info length */
	} link_create;

	struct { /* struct used by BPF_LINK_UPDATE command */
+29 −29
Original line number Diff line number Diff line
@@ -338,8 +338,8 @@ static void bpf_iter_link_release(struct bpf_link *link)
	struct bpf_iter_link *iter_link =
		container_of(link, struct bpf_iter_link, link);

	if (iter_link->aux.map)
		bpf_map_put_with_uref(iter_link->aux.map);
	if (iter_link->tinfo->reg_info->detach_target)
		iter_link->tinfo->reg_info->detach_target(&iter_link->aux);
}

static void bpf_iter_link_dealloc(struct bpf_link *link)
@@ -390,15 +390,35 @@ bool bpf_link_is_iter(struct bpf_link *link)

int bpf_iter_link_attach(const union bpf_attr *attr, struct bpf_prog *prog)
{
	union bpf_iter_link_info __user *ulinfo;
	struct bpf_link_primer link_primer;
	struct bpf_iter_target_info *tinfo;
	struct bpf_iter_aux_info aux = {};
	union bpf_iter_link_info linfo;
	struct bpf_iter_link *link;
	u32 prog_btf_id, target_fd;
	u32 prog_btf_id, linfo_len;
	bool existed = false;
	struct bpf_map *map;
	int err;

	if (attr->link_create.target_fd || attr->link_create.flags)
		return -EINVAL;

	memset(&linfo, 0, sizeof(union bpf_iter_link_info));

	ulinfo = u64_to_user_ptr(attr->link_create.iter_info);
	linfo_len = attr->link_create.iter_info_len;
	if (!ulinfo ^ !linfo_len)
		return -EINVAL;

	if (ulinfo) {
		err = bpf_check_uarg_tail_zero(ulinfo, sizeof(linfo),
					       linfo_len);
		if (err)
			return err;
		linfo_len = min_t(u32, linfo_len, sizeof(linfo));
		if (copy_from_user(&linfo, ulinfo, linfo_len))
			return -EFAULT;
	}

	prog_btf_id = prog->aux->attach_btf_id;
	mutex_lock(&targets_mutex);
	list_for_each_entry(tinfo, &targets, list) {
@@ -411,13 +431,6 @@ int bpf_iter_link_attach(const union bpf_attr *attr, struct bpf_prog *prog)
	if (!existed)
		return -ENOENT;

	/* Make sure user supplied flags are target expected. */
	target_fd = attr->link_create.target_fd;
	if (attr->link_create.flags != tinfo->reg_info->req_linfo)
		return -EINVAL;
	if (!attr->link_create.flags && target_fd)
		return -EINVAL;

	link = kzalloc(sizeof(*link), GFP_USER | __GFP_NOWARN);
	if (!link)
		return -ENOMEM;
@@ -431,28 +444,15 @@ int bpf_iter_link_attach(const union bpf_attr *attr, struct bpf_prog *prog)
		return err;
	}

	if (tinfo->reg_info->req_linfo == BPF_ITER_LINK_MAP_FD) {
		map = bpf_map_get_with_uref(target_fd);
		if (IS_ERR(map)) {
			err = PTR_ERR(map);
			goto cleanup_link;
		}

		aux.map = map;
		err = tinfo->reg_info->check_target(prog, &aux);
	if (tinfo->reg_info->attach_target) {
		err = tinfo->reg_info->attach_target(prog, &linfo, &link->aux);
		if (err) {
			bpf_map_put_with_uref(map);
			goto cleanup_link;
			bpf_link_cleanup(&link_primer);
			return err;
		}

		link->aux.map = map;
	}

	return bpf_link_settle(&link_primer);

cleanup_link:
	bpf_link_cleanup(&link_primer);
	return err;
}

static void init_seq_meta(struct bpf_iter_priv_data *priv_data,
+1 −1
Original line number Diff line number Diff line
@@ -1966,7 +1966,7 @@ void bpf_prog_array_delete_safe(struct bpf_prog_array *array,
 * @index: the index of the program to replace
 *
 * Skips over dummy programs, by not counting them, when calculating
 * the the position of the program to replace.
 * the position of the program to replace.
 *
 * Return:
 * * 0		- Success
Loading