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");
>
>
>
prev parent 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