public inbox for netdev@vger.kernel.org
 help / color / mirror / Atom feed
From: "Maciej Fijałkowski" <maciejromanfijalkowski@gmail.com>
To: Jesper Dangaard Brouer <brouer@redhat.com>
Cc: "Daniel Borkmann" <borkmann@iogearbox.net>,
	"Björn Töpel" <bjorn.topel@intel.com>,
	"Alexei Starovoitov" <alexei.starovoitov@gmail.com>,
	"Jakub Kicinski" <jakub.kicinski@netronome.com>,
	"Jean Hsiao" <jhsiao@redhat.com>, netdev <netdev@vger.kernel.org>
Subject: Re: [PATCH bpf-next 6/6] samples: bpf: Check the prog id before exiting
Date: Mon, 21 Jan 2019 09:46:50 +0100	[thread overview]
Message-ID: <20190121094650.77df960a@maciek-lenovo> (raw)
In-Reply-To: <20190117123650.646ccecb@redhat.com>

Dnia 2019-01-17, o godz. 12:36:50
Jesper Dangaard Brouer <brouer@redhat.com> napisał(a):

> On Thu, 17 Jan 2019 02:01:15 +0100
> Maciej Fijalkowski <maciejromanfijalkowski@gmail.com> wrote:
> 
> > Check the program id within the signal handler on polling xdp samples
> > that were previously converted to libbpf usage. Avoid the situation of
> > unloading the program that was not attached by sample that is exiting.
> 
> I love that you are doing this work!  QA have already hit these kind of
> issues, and I've had to deal with figuring out why certain combination
> of QA testing was failing.
> 

Glad to hear that! This actually also came from our validation engineers, so it
seems this is a common issue. I have also seen some old email threads where you
were mentioning this problem.

> Bjørn and I are working on hashing out XDP programs per RXQ see[1].  I
> do think that this API:
>   bpf_get_link_xdp_id(ifindex, &curr_prog_id, xdp_flags);
> 
> Will be will be compatible with our proposed semantic[1], as this reads
> the "global-prog" (and later if match unloads the "global-prog").
>
> [1]
> https://github.com/xdp-project/xdp-project/blob/master/areas/core/xdp_per_rxq01.org#interface-semantics
> 
> > Signed-off-by: Maciej Fijalkowski <maciejromanfijalkowski@gmail.com>
> > Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
> > ---
> >  samples/bpf/xdp1_user.c             | 19 +++++++++++++++-
> >  samples/bpf/xdp_adjust_tail_user.c  | 25 +++++++++++++++++----
> >  samples/bpf/xdp_redirect_map_user.c | 37 ++++++++++++++++++++++++++++---
> >  samples/bpf/xdp_redirect_user.c     | 38 +++++++++++++++++++++++++++++---
> >  samples/bpf/xdp_router_ipv4_user.c  | 43
> > ++++++++++++++++++++++--------------- samples/bpf/xdp_rxq_info_user.c     |
> > 28 +++++++++++++++++++----- samples/bpf/xdp_sample_pkts_user.c  | 29
> > ++++++++++++++++++++----- samples/bpf/xdp_tx_iptunnel_user.c  | 23
> > +++++++++++++++++--- samples/bpf/xdpsock_user.c          | 18
> > +++++++++++++++- 9 files changed, 218 insertions(+), 42 deletions(-)
> > 
> > diff --git a/samples/bpf/xdp1_user.c b/samples/bpf/xdp1_user.c
> > index 505bce207165..3acc0e1d589a 100644
> > --- a/samples/bpf/xdp1_user.c
> > +++ b/samples/bpf/xdp1_user.c
> > @@ -23,10 +23,17 @@
> >  
> >  static int ifindex;
> >  static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
> > +static __u32 prog_id;
> >  
> >  static void int_exit(int sig)
> >  {
> > -	bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > +	__u32 curr_prog_id;
> > +
> > +	bpf_get_link_xdp_id(ifindex, &curr_prog_id, xdp_flags);
> > +	if (prog_id == curr_prog_id)
> > +		bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > +	else
> > +		printf("program on interface changed, not removing\n");
> >  	exit(0);
> >  }
> >  
> > @@ -74,11 +81,14 @@ int main(int argc, char **argv)
> >  	struct bpf_prog_load_attr prog_load_attr = {
> >  		.prog_type	= BPF_PROG_TYPE_XDP,
> >  	};
> > +	struct bpf_prog_info info = {};
> > +	__u32 info_len = sizeof(info);
> >  	const char *optstr = "FSN";
> >  	int prog_fd, map_fd, opt;
> >  	struct bpf_object *obj;
> >  	struct bpf_map *map;
> >  	char filename[256];
> > +	int err;
> >  
> >  	while ((opt = getopt(argc, argv, optstr)) != -1) {
> >  		switch (opt) {
> > @@ -139,6 +149,13 @@ int main(int argc, char **argv)
> >  		return 1;
> >  	}
> >  
> > +	err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
> > +	if (err) {
> > +		printf("can't get prog info - %s\n", strerror(errno));
> > +		return err;
> > +	}
> > +	prog_id = info.id;
> > +
> >  	poll_stats(map_fd, 2);
> >  
> >  	return 0;
> > diff --git a/samples/bpf/xdp_adjust_tail_user.c
> > b/samples/bpf/xdp_adjust_tail_user.c index 049bddf7778b..01fc700d6a0c 100644
> > --- a/samples/bpf/xdp_adjust_tail_user.c
> > +++ b/samples/bpf/xdp_adjust_tail_user.c
> > @@ -25,11 +25,19 @@
> >  
> >  static int ifindex = -1;
> >  static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
> > +static __u32 prog_id;
> >  
> >  static void int_exit(int sig)
> >  {
> > -	if (ifindex > -1)
> > -		bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > +	__u32 curr_prog_id;
> > +
> > +	if (ifindex > -1) {
> > +		bpf_get_link_xdp_id(ifindex, &curr_prog_id, xdp_flags);
> > +		if (prog_id == curr_prog_id)
> > +			bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > +		else
> > +			printf("program on interface changed, not
> > removing\n");
> > +	}
> >  	exit(0);
> >  }
> >  
> > @@ -72,11 +80,14 @@ int main(int argc, char **argv)
> >  	};
> >  	unsigned char opt_flags[256] = {};
> >  	const char *optstr = "i:T:SNFh";
> > +	struct bpf_prog_info info = {};
> > +	__u32 info_len = sizeof(info);
> >  	unsigned int kill_after_s = 0;
> >  	int i, prog_fd, map_fd, opt;
> >  	struct bpf_object *obj;
> >  	struct bpf_map *map;
> >  	char filename[256];
> > +	int err;
> >  
> >  	for (i = 0; i < strlen(optstr); i++)
> >  		if (optstr[i] != 'h' && 'a' <= optstr[i] && optstr[i] <=
> > 'z') @@ -146,9 +157,15 @@ int main(int argc, char **argv)
> >  		return 1;
> >  	}
> >  
> > -	poll_stats(map_fd, kill_after_s);
> > +	err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
> > +	if (err) {
> > +		printf("can't get prog info - %s\n", strerror(errno));
> > +		return 1;
> > +	}
> > +	prog_id = info.id;
> >  
> > -	bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > +	poll_stats(map_fd, kill_after_s);
> > +	int_exit(0);
> >  
> >  	return 0;
> >  }
> > diff --git a/samples/bpf/xdp_redirect_map_user.c
> > b/samples/bpf/xdp_redirect_map_user.c index 470e1a7e8810..cae7b9cead74
> > 100644 --- a/samples/bpf/xdp_redirect_map_user.c
> > +++ b/samples/bpf/xdp_redirect_map_user.c
> > @@ -29,15 +29,29 @@
> >  static int ifindex_in;
> >  static int ifindex_out;
> >  static bool ifindex_out_xdp_dummy_attached = true;
> > +static __u32 prog_id;
> > +static __u32 dummy_prog_id;
> >  
> >  static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
> >  static int rxcnt_map_fd;
> >  
> >  static void int_exit(int sig)
> >  {
> > -	bpf_set_link_xdp_fd(ifindex_in, -1, xdp_flags);
> > -	if (ifindex_out_xdp_dummy_attached)
> > -		bpf_set_link_xdp_fd(ifindex_out, -1, xdp_flags);
> > +	__u32 curr_prog_id;
> > +
> > +	bpf_get_link_xdp_id(ifindex_in, &curr_prog_id, xdp_flags);
> > +	if (prog_id == curr_prog_id)
> > +		bpf_set_link_xdp_fd(ifindex_in, -1, xdp_flags);
> > +	else
> > +		printf("program on iface IN changed, not removing\n");
> > +
> > +	if (ifindex_out_xdp_dummy_attached) {
> > +		bpf_get_link_xdp_id(ifindex_out, &curr_prog_id, xdp_flags);
> > +		if (dummy_prog_id == curr_prog_id)
> > +			bpf_set_link_xdp_fd(ifindex_out, -1, xdp_flags);
> > +		else
> > +			printf("program on iface OUT changed, not
> > removing\n");
> > +	}
> >  	exit(0);
> >  }
> >  
> > @@ -82,6 +96,8 @@ int main(int argc, char **argv)
> >  		.prog_type	= BPF_PROG_TYPE_XDP,
> >  	};
> >  	struct bpf_program *prog, *dummy_prog;
> > +	struct bpf_prog_info info = {};
> > +	__u32 info_len = sizeof(info);
> >  	int prog_fd, dummy_prog_fd;
> >  	const char *optstr = "FSN";
> >  	struct bpf_object *obj;
> > @@ -153,6 +169,13 @@ int main(int argc, char **argv)
> >  		return 1;
> >  	}
> >  
> > +	ret = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
> > +	if (ret) {
> > +		printf("can't get prog info - %s\n", strerror(errno));
> > +		return ret;
> > +	}
> > +	prog_id = info.id;
> > +
> >  	/* Loading dummy XDP prog on out-device */
> >  	if (bpf_set_link_xdp_fd(ifindex_out, dummy_prog_fd,
> >  			    (xdp_flags | XDP_FLAGS_UPDATE_IF_NOEXIST)) <
> > 0) { @@ -160,6 +183,14 @@ int main(int argc, char **argv)
> >  		ifindex_out_xdp_dummy_attached = false;
> >  	}
> >  
> > +	memset(&info, 0, sizeof(info));
> > +	ret = bpf_obj_get_info_by_fd(dummy_prog_fd, &info, &info_len);
> > +	if (ret) {
> > +		printf("can't get prog info - %s\n", strerror(errno));
> > +		return ret;
> > +	}
> > +	dummy_prog_id = info.id;
> > +
> >  	signal(SIGINT, int_exit);
> >  	signal(SIGTERM, int_exit);
> >  
> > diff --git a/samples/bpf/xdp_redirect_user.c
> > b/samples/bpf/xdp_redirect_user.c index be6058cda97c..230b1e5e7f61 100644
> > --- a/samples/bpf/xdp_redirect_user.c
> > +++ b/samples/bpf/xdp_redirect_user.c
> > @@ -29,15 +29,30 @@
> >  static int ifindex_in;
> >  static int ifindex_out;
> >  static bool ifindex_out_xdp_dummy_attached = true;
> > +static __u32 prog_id;
> > +static __u32 dummy_prog_id;
> >  
> >  static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
> >  static int rxcnt_map_fd;
> >  
> >  static void int_exit(int sig)
> >  {
> > -	bpf_set_link_xdp_fd(ifindex_in, -1, xdp_flags);
> > -	if (ifindex_out_xdp_dummy_attached)
> > -		bpf_set_link_xdp_fd(ifindex_out, -1, xdp_flags);
> > +	__u32 curr_prog_id;
> > +
> > +	bpf_get_link_xdp_id(ifindex_in, &curr_prog_id, xdp_flags);
> > +	if (prog_id == curr_prog_id)
> > +		bpf_set_link_xdp_fd(ifindex_in, -1, xdp_flags);
> > +	else
> > +		printf("program on iface IN changed, not removing\n");
> > +
> > +	if (ifindex_out_xdp_dummy_attached) {
> > +		bpf_get_link_xdp_id(ifindex_out, &curr_prog_id,
> > +				    xdp_flags);
> > +		if (dummy_prog_id == curr_prog_id)
> > +			bpf_set_link_xdp_fd(ifindex_out, -1, xdp_flags);
> > +		else
> > +			printf("program on iface OUT changed, not
> > removing\n");
> > +	}
> >  	exit(0);
> >  }
> >  
> > @@ -84,6 +99,8 @@ int main(int argc, char **argv)
> >  	};
> >  	struct bpf_program *prog, *dummy_prog;
> >  	int prog_fd, tx_port_map_fd, opt;
> > +	struct bpf_prog_info info = {};
> > +	__u32 info_len = sizeof(info);
> >  	const char *optstr = "FSN";
> >  	struct bpf_object *obj;
> >  	char filename[256];
> > @@ -154,6 +171,13 @@ int main(int argc, char **argv)
> >  		return 1;
> >  	}
> >  
> > +	ret = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
> > +	if (ret) {
> > +		printf("can't get prog info - %s\n", strerror(errno));
> > +		return ret;
> > +	}
> > +	prog_id = info.id;
> > +
> >  	/* Loading dummy XDP prog on out-device */
> >  	if (bpf_set_link_xdp_fd(ifindex_out, dummy_prog_fd,
> >  			    (xdp_flags | XDP_FLAGS_UPDATE_IF_NOEXIST)) <
> > 0) { @@ -161,6 +185,14 @@ int main(int argc, char **argv)
> >  		ifindex_out_xdp_dummy_attached = false;
> >  	}
> >  
> > +	memset(&info, 0, sizeof(info));
> > +	ret = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
> > +	if (ret) {
> > +		printf("can't get prog info - %s\n", strerror(errno));
> > +		return ret;
> > +	}
> > +	dummy_prog_id = info.id;
> > +
> >  	signal(SIGINT, int_exit);
> >  	signal(SIGTERM, int_exit);
> >  
> > diff --git a/samples/bpf/xdp_router_ipv4_user.c
> > b/samples/bpf/xdp_router_ipv4_user.c index 208d6a996478..3991bd42b20c 100644
> > --- a/samples/bpf/xdp_router_ipv4_user.c
> > +++ b/samples/bpf/xdp_router_ipv4_user.c
> > @@ -30,7 +30,8 @@
> >  
> >  int sock, sock_arp, flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
> >  static int total_ifindex;
> > -int *ifindex_list;
> > +static int *ifindex_list;
> > +static __u32 *prog_id_list;
> >  char buf[8192];
> >  static int lpm_map_fd;
> >  static int rxcnt_map_fd;
> > @@ -41,23 +42,26 @@ static int tx_port_map_fd;
> >  static int get_route_table(int rtm_family);
> >  static void int_exit(int sig)
> >  {
> > +	__u32 prog_id;
> >  	int i = 0;
> >  
> > -	for (i = 0; i < total_ifindex; i++)
> > -		bpf_set_link_xdp_fd(ifindex_list[i], -1, flags);
> > +	for (i = 0; i < total_ifindex; i++) {
> > +		bpf_get_link_xdp_id(ifindex_list[i], &prog_id, flags);
> > +		if (prog_id_list[i] == prog_id)
> > +			bpf_set_link_xdp_fd(ifindex_list[i], -1, flags);
> > +		else
> > +			printf("program on iface %d changed, not
> > removing\n",
> > +			       ifindex_list[i]);
> > +	}
> >  	exit(0);
> >  }
> >  
> >  static void close_and_exit(int sig)
> >  {
> > -	int i = 0;
> > -
> >  	close(sock);
> >  	close(sock_arp);
> >  
> > -	for (i = 0; i < total_ifindex; i++)
> > -		bpf_set_link_xdp_fd(ifindex_list[i], -1, flags);
> > -	exit(0);
> > +	int_exit(0);
> >  }
> >  
> >  /* Get the mac address of the interface given interface name */
> > @@ -186,13 +190,8 @@ static void read_route(struct nlmsghdr *nh, int nll)
> >  		route.iface_name = alloca(sizeof(char *) * IFNAMSIZ);
> >  		route.iface_name = if_indextoname(route.iface,
> > route.iface_name); route.mac = getmac(route.iface_name);
> > -		if (route.mac == -1) {
> > -			int i = 0;
> > -
> > -			for (i = 0; i < total_ifindex; i++)
> > -				bpf_set_link_xdp_fd(ifindex_list[i], -1,
> > flags);
> > -			exit(0);
> > -		}
> > +		if (route.mac == -1)
> > +			int_exit(0);
> >  		assert(bpf_map_update_elem(tx_port_map_fd,
> >  					   &route.iface, &route.iface, 0)
> > == 0); if (rtm_family == AF_INET) {
> > @@ -625,12 +624,14 @@ int main(int ac, char **argv)
> >  	struct bpf_prog_load_attr prog_load_attr = {
> >  		.prog_type	= BPF_PROG_TYPE_XDP,
> >  	};
> > +	struct bpf_prog_info info = {};
> > +	__u32 info_len = sizeof(info);
> >  	const char *optstr = "SF";
> >  	struct bpf_object *obj;
> >  	char filename[256];
> >  	char **ifname_list;
> >  	int prog_fd, opt;
> > -	int i = 1;
> > +	int err, i = 1;
> >  
> >  	snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
> >  	prog_load_attr.file = filename;
> > @@ -687,7 +688,7 @@ int main(int ac, char **argv)
> >  		return 1;
> >  	}
> >  
> > -	ifindex_list = (int *)malloc(total_ifindex * sizeof(int *));
> > +	ifindex_list = (int *)calloc(total_ifindex, sizeof(int *));
> >  	for (i = 0; i < total_ifindex; i++) {
> >  		ifindex_list[i] = if_nametoindex(ifname_list[i]);
> >  		if (!ifindex_list[i]) {
> > @@ -696,6 +697,7 @@ int main(int ac, char **argv)
> >  			return 1;
> >  		}
> >  	}
> > +	prog_id_list = (__u32 *)calloc(total_ifindex, sizeof(__u32 *));
> >  	for (i = 0; i < total_ifindex; i++) {
> >  		if (bpf_set_link_xdp_fd(ifindex_list[i], prog_fd, flags) <
> > 0) { printf("link set xdp fd failed\n");
> > @@ -706,6 +708,13 @@ int main(int ac, char **argv)
> >  
> >  			return 1;
> >  		}
> > +		err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
> > +		if (err) {
> > +			printf("can't get prog info - %s\n",
> > strerror(errno));
> > +			return err;
> > +		}
> > +		prog_id_list[i] = info.id;
> > +		memset(&info, 0, sizeof(info));
> >  		printf("Attached to %d\n", ifindex_list[i]);
> >  	}
> >  	signal(SIGINT, int_exit);
> > diff --git a/samples/bpf/xdp_rxq_info_user.c
> > b/samples/bpf/xdp_rxq_info_user.c index e7a98c2a440f..7602a54eeba6 100644
> > --- a/samples/bpf/xdp_rxq_info_user.c
> > +++ b/samples/bpf/xdp_rxq_info_user.c
> > @@ -29,6 +29,7 @@ static const char *__doc__ = " XDP RX-queue info extract
> > example\n\n" static int ifindex = -1;
> >  static char ifname_buf[IF_NAMESIZE];
> >  static char *ifname;
> > +static __u32 prog_id;
> >  
> >  static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
> >  
> > @@ -58,11 +59,19 @@ static const struct option long_options[] = {
> >  
> >  static void int_exit(int sig)
> >  {
> > -	fprintf(stderr,
> > -		"Interrupted: Removing XDP program on ifindex:%d
> > device:%s\n",
> > -		ifindex, ifname);
> > -	if (ifindex > -1)
> > -		bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > +	__u32 curr_prog_id;
> > +
> > +	if (ifindex > -1) {
> > +		bpf_get_link_xdp_id(ifindex, &curr_prog_id, xdp_flags);
> > +		if (prog_id == curr_prog_id) {
> > +			fprintf(stderr,
> > +				"Interrupted: Removing XDP program on
> > ifindex:%d device:%s\n",
> > +				ifindex, ifname);
> > +			bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > +		} else {
> > +			printf("program on interface changed, not
> > removing\n");
> > +		}
> > +	}
> >  	exit(EXIT_OK);
> >  }
> >  
> > @@ -447,6 +456,8 @@ int main(int argc, char **argv)
> >  	struct bpf_prog_load_attr prog_load_attr = {
> >  		.prog_type	= BPF_PROG_TYPE_XDP,
> >  	};
> > +	struct bpf_prog_info info = {};
> > +	__u32 info_len = sizeof(info);
> >  	int prog_fd, map_fd, opt, err;
> >  	bool use_separators = true;
> >  	struct config cfg = { 0 };
> > @@ -580,6 +591,13 @@ int main(int argc, char **argv)
> >  		return EXIT_FAIL_XDP;
> >  	}
> >  
> > +	err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
> > +	if (err) {
> > +		printf("can't get prog info - %s\n", strerror(errno));
> > +		return err;
> > +	}
> > +	prog_id = info.id;
> > +
> >  	stats_poll(interval, action, cfg_options);
> >  	return EXIT_OK;
> >  }
> > diff --git a/samples/bpf/xdp_sample_pkts_user.c
> > b/samples/bpf/xdp_sample_pkts_user.c index 362ad35b524d..dcf78fbc371e 100644
> > --- a/samples/bpf/xdp_sample_pkts_user.c
> > +++ b/samples/bpf/xdp_sample_pkts_user.c
> > @@ -24,25 +24,44 @@ static int pmu_fds[MAX_CPUS], if_idx;
> >  static struct perf_event_mmap_page *headers[MAX_CPUS];
> >  static char *if_name;
> >  static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
> > +static __u32 prog_id;
> >  
> >  static int do_attach(int idx, int fd, const char *name)
> >  {
> > +	struct bpf_prog_info info = {};
> > +	__u32 info_len = sizeof(info);
> >  	int err;
> >  
> >  	err = bpf_set_link_xdp_fd(idx, fd, xdp_flags);
> > -	if (err < 0)
> > +	if (err < 0) {
> >  		printf("ERROR: failed to attach program to %s\n", name);
> > +		return err;
> > +	}
> > +
> > +	err = bpf_obj_get_info_by_fd(fd, &info, &info_len);
> > +	if (err) {
> > +		printf("can't get prog info - %s\n", strerror(errno));
> > +		return err;
> > +	}
> > +	prog_id = info.id;
> >  
> >  	return err;
> >  }
> >  
> >  static int do_detach(int idx, const char *name)
> >  {
> > -	int err;
> > +	__u32 curr_prog_id;
> > +	int err = 0;
> >  
> > -	err = bpf_set_link_xdp_fd(idx, -1, 0);
> > -	if (err < 0)
> > -		printf("ERROR: failed to detach program from %s\n", name);
> > +	bpf_get_link_xdp_id(idx, &curr_prog_id, 0);
> > +
> > +	if (prog_id == curr_prog_id) {
> > +		err = bpf_set_link_xdp_fd(idx, -1, 0);
> > +		if (err < 0)
> > +			printf("ERROR: failed to detach prog from %s\n",
> > name);
> > +	} else {
> > +		printf("program on interface changed, not removing\n");
> > +	}
> >  
> >  	return err;
> >  }
> > diff --git a/samples/bpf/xdp_tx_iptunnel_user.c
> > b/samples/bpf/xdp_tx_iptunnel_user.c index e3de60930d27..4c1b9b14aa79 100644
> > --- a/samples/bpf/xdp_tx_iptunnel_user.c
> > +++ b/samples/bpf/xdp_tx_iptunnel_user.c
> > @@ -27,11 +27,19 @@
> >  static int ifindex = -1;
> >  static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
> >  static int rxcnt_map_fd;
> > +static __u32 prog_id;
> >  
> >  static void int_exit(int sig)
> >  {
> > -	if (ifindex > -1)
> > -		bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > +	__u32 curr_prog_id;
> > +
> > +	if (ifindex > -1) {
> > +		bpf_get_link_xdp_id(ifindex, &curr_prog_id, xdp_flags);
> > +		if (prog_id == curr_prog_id)
> > +			bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > +		else
> > +			printf("program on interface changed, not
> > removing\n");
> > +	}
> >  	exit(0);
> >  }
> >  
> > @@ -148,13 +156,15 @@ int main(int argc, char **argv)
> >  	int min_port = 0, max_port = 0, vip2tnl_map_fd;
> >  	const char *optstr = "i:a:p:s:d:m:T:P:FSNh";
> >  	unsigned char opt_flags[256] = {};
> > +	struct bpf_prog_info info = {};
> > +	__u32 info_len = sizeof(info);
> >  	unsigned int kill_after_s = 0;
> >  	struct iptnl_info tnl = {};
> >  	struct bpf_object *obj;
> >  	struct vip vip = {};
> >  	char filename[256];
> >  	int opt, prog_fd;
> > -	int i;
> > +	int i, err;
> >  
> >  	tnl.family = AF_UNSPEC;
> >  	vip.protocol = IPPROTO_TCP;
> > @@ -276,6 +286,13 @@ int main(int argc, char **argv)
> >  		return 1;
> >  	}
> >  
> > +	err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
> > +	if (err) {
> > +		printf("can't get prog info - %s\n", strerror(errno));
> > +		return err;
> > +	}
> > +	prog_id = info.id;
> > +
> >  	poll_stats(kill_after_s);
> >  
> >  	bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > diff --git a/samples/bpf/xdpsock_user.c b/samples/bpf/xdpsock_user.c
> > index 188723784768..d7fb74d9a223 100644
> > --- a/samples/bpf/xdpsock_user.c
> > +++ b/samples/bpf/xdpsock_user.c
> > @@ -76,6 +76,7 @@ static int opt_poll;
> >  static int opt_shared_packet_buffer;
> >  static int opt_interval = 1;
> >  static u32 opt_xdp_bind_flags;
> > +static __u32 prog_id;
> >  
> >  struct xdp_umem_uqueue {
> >  	u32 cached_prod;
> > @@ -631,9 +632,15 @@ static void *poller(void *arg)
> >  
> >  static void int_exit(int sig)
> >  {
> > +	__u32 curr_prog_id;
> > +
> >  	(void)sig;
> >  	dump_stats();
> > -	bpf_set_link_xdp_fd(opt_ifindex, -1, opt_xdp_flags);
> > +	bpf_get_link_xdp_id(opt_ifindex, &curr_prog_id, opt_xdp_flags);
> > +	if (prog_id == curr_prog_id)
> > +		bpf_set_link_xdp_fd(opt_ifindex, -1, opt_xdp_flags);
> > +	else
> > +		printf("program on interface changed, not removing\n");
> >  	exit(EXIT_SUCCESS);
> >  }
> >  
> > @@ -907,6 +914,8 @@ int main(int argc, char **argv)
> >  		.prog_type	= BPF_PROG_TYPE_XDP,
> >  	};
> >  	int prog_fd, qidconf_map, xsks_map;
> > +	struct bpf_prog_info info = {};
> > +	__u32 info_len = sizeof(info);
> >  	struct bpf_object *obj;
> >  	char xdp_filename[256];
> >  	struct bpf_map *map;
> > @@ -953,6 +962,13 @@ int main(int argc, char **argv)
> >  		exit(EXIT_FAILURE);
> >  	}
> >  
> > +	ret = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
> > +	if (ret) {
> > +		printf("can't get prog info - %s\n", strerror(errno));
> > +		return 1;
> > +	}
> > +	prog_id = info.id;
> > +
> >  	ret = bpf_map_update_elem(qidconf_map, &key, &opt_queue, 0);
> >  	if (ret) {
> >  		fprintf(stderr, "ERROR: bpf_map_update_elem qidconf\n");
> 
> 
> 


      reply	other threads:[~2019-01-21  8:46 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-17  1:01 [PATCH bpf-next 0/6] xdp: Avoid unloading xdp prog not attached by sample Maciej Fijalkowski
2019-01-17  1:01 ` [PATCH bpf-next 1/6] libbpf: Add a helper for retrieving a map fd for a given name Maciej Fijalkowski
2019-01-17  1:01 ` [PATCH bpf-next 2/6] samples: bpf: Convert XDP samples to libbpf usage Maciej Fijalkowski
2019-01-17 11:19   ` Jesper Dangaard Brouer
2019-01-17 11:26     ` [RFC bpf-next PATCH] samples/bpf: xdp_redirect_cpu have not need for read_trace_pipe Jesper Dangaard Brouer
2019-01-21  8:39       ` Maciej Fijałkowski
2019-01-25  8:22   ` [PATCH bpf-next 2/6] samples: bpf: Convert XDP samples to libbpf usage Jesper Dangaard Brouer
2019-01-17  1:01 ` [PATCH bpf-next 3/6] samples: bpf: Extend RLIMIT_MEMLOCK for xdp_{sample_pkts, router_ipv4} Maciej Fijalkowski
2019-01-17  1:01 ` [PATCH bpf-next 4/6] samples: bpf: Add a "force" flag to XDP samples Maciej Fijalkowski
2019-01-17  1:01 ` [PATCH bpf-next 5/6] libbpf: Add a support for getting xdp prog id on ifindex Maciej Fijalkowski
2019-01-17  1:01 ` [PATCH bpf-next 6/6] samples: bpf: Check the prog id before exiting Maciej Fijalkowski
2019-01-17 11:36   ` Jesper Dangaard Brouer
2019-01-21  8:46     ` Maciej Fijałkowski [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190121094650.77df960a@maciek-lenovo \
    --to=maciejromanfijalkowski@gmail.com \
    --cc=alexei.starovoitov@gmail.com \
    --cc=bjorn.topel@intel.com \
    --cc=borkmann@iogearbox.net \
    --cc=brouer@redhat.com \
    --cc=jakub.kicinski@netronome.com \
    --cc=jhsiao@redhat.com \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox