From: Jesper Dangaard Brouer <brouer@redhat.com>
To: Maciej Fijalkowski <maciejromanfijalkowski@gmail.com>
Cc: daniel@iogearbox.net, ast@kernel.org, netdev@vger.kernel.org,
jakub.kicinski@netronome.com, brouer@redhat.com,
"Björn Töpel" <bjorn.topel@intel.com>,
"Jean Hsiao" <jhsiao@redhat.com>
Subject: Re: [PATCH bpf-next 6/6] samples: bpf: Check the prog id before exiting
Date: Thu, 17 Jan 2019 12:36:50 +0100 [thread overview]
Message-ID: <20190117123650.646ccecb@redhat.com> (raw)
In-Reply-To: <20190117010115.18234-7-maciejromanfijalkowski@gmail.com>
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.
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");
--
Best regards,
Jesper Dangaard Brouer
MSc.CS, Principal Kernel Engineer at Red Hat
LinkedIn: http://www.linkedin.com/in/brouer
next prev parent reply other threads:[~2019-01-17 11:36 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 [this message]
2019-01-21 8:46 ` Maciej Fijałkowski
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=20190117123650.646ccecb@redhat.com \
--to=brouer@redhat.com \
--cc=ast@kernel.org \
--cc=bjorn.topel@intel.com \
--cc=daniel@iogearbox.net \
--cc=jakub.kicinski@netronome.com \
--cc=jhsiao@redhat.com \
--cc=maciejromanfijalkowski@gmail.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;
as well as URLs for NNTP newsgroup(s).