Message ID | 20230730114951.74067-2-hffilwlqm@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | bpf, xdp: Add tracepoint to xdp attaching failure | expand |
On Sun, 30 Jul 2023 19:49:50 +0800 Leon Hwang wrote: > @@ -9472,6 +9473,7 @@ int bpf_xdp_link_attach(const union bpf_attr *attr, struct bpf_prog *prog) > struct bpf_link_primer link_primer; > struct bpf_xdp_link *link; > struct net_device *dev; > + struct netlink_ext_ack extack; This is not initialized. Also, while fixing that, move it up to maintain the line order by decreasing line length. > int err, fd; > > rtnl_lock(); > @@ -9497,12 +9499,13 @@ int bpf_xdp_link_attach(const union bpf_attr *attr, struct bpf_prog *prog) > goto unlock; > } > > - err = dev_xdp_attach_link(dev, NULL, link); > + err = dev_xdp_attach_link(dev, &extack, link); > rtnl_unlock(); > > if (err) { > link->dev = NULL; > bpf_link_cleanup(&link_primer); > + trace_bpf_xdp_link_attach_failed(extack._msg);
On 1/8/23 10:43, Jakub Kicinski wrote: > On Sun, 30 Jul 2023 19:49:50 +0800 Leon Hwang wrote: >> @@ -9472,6 +9473,7 @@ int bpf_xdp_link_attach(const union bpf_attr *attr, struct bpf_prog *prog) >> struct bpf_link_primer link_primer; >> struct bpf_xdp_link *link; >> struct net_device *dev; >> + struct netlink_ext_ack extack; > > This is not initialized. Also, while fixing that, move it up > to maintain the line order by decreasing line length. > Thank you for your reviewing. I'll fix it by initializing extack and moving the line to its appropriate position. Thanks, Leon >> int err, fd; >> >> rtnl_lock(); >> @@ -9497,12 +9499,13 @@ int bpf_xdp_link_attach(const union bpf_attr *attr, struct bpf_prog *prog) >> goto unlock; >> } >> >> - err = dev_xdp_attach_link(dev, NULL, link); >> + err = dev_xdp_attach_link(dev, &extack, link); >> rtnl_unlock(); >> >> if (err) { >> link->dev = NULL; >> bpf_link_cleanup(&link_primer); >> + trace_bpf_xdp_link_attach_failed(extack._msg);
diff --git a/include/trace/events/xdp.h b/include/trace/events/xdp.h index c40fc97f94171..cd89f1d5ce7b8 100644 --- a/include/trace/events/xdp.h +++ b/include/trace/events/xdp.h @@ -404,6 +404,23 @@ TRACE_EVENT(mem_return_failed, ) ); +TRACE_EVENT(bpf_xdp_link_attach_failed, + + TP_PROTO(const char *msg), + + TP_ARGS(msg), + + TP_STRUCT__entry( + __string(msg, msg) + ), + + TP_fast_assign( + __assign_str(msg, msg); + ), + + TP_printk("errmsg=%s", __get_str(msg)) +); + #endif /* _TRACE_XDP_H */ #include <trace/define_trace.h> diff --git a/net/core/dev.c b/net/core/dev.c index 8e7d0cb540cdb..49bed890f807e 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -133,6 +133,7 @@ #include <trace/events/net.h> #include <trace/events/skb.h> #include <trace/events/qdisc.h> +#include <trace/events/xdp.h> #include <linux/inetdevice.h> #include <linux/cpu_rmap.h> #include <linux/static_key.h> @@ -9472,6 +9473,7 @@ int bpf_xdp_link_attach(const union bpf_attr *attr, struct bpf_prog *prog) struct bpf_link_primer link_primer; struct bpf_xdp_link *link; struct net_device *dev; + struct netlink_ext_ack extack; int err, fd; rtnl_lock(); @@ -9497,12 +9499,13 @@ int bpf_xdp_link_attach(const union bpf_attr *attr, struct bpf_prog *prog) goto unlock; } - err = dev_xdp_attach_link(dev, NULL, link); + err = dev_xdp_attach_link(dev, &extack, link); rtnl_unlock(); if (err) { link->dev = NULL; bpf_link_cleanup(&link_primer); + trace_bpf_xdp_link_attach_failed(extack._msg); goto out_put_dev; }
When error happens in dev_xdp_attach(), it should have a way to tell users the error message like the netlink approach. To avoid breaking uapi, adding a tracepoint in bpf_xdp_link_attach() is an appropriate way to notify users the error message. Hence, bpf libraries are able to retrieve the error message by this tracepoint, and then report the error message to users. Signed-off-by: Leon Hwang <hffilwlqm@gmail.com> --- include/trace/events/xdp.h | 17 +++++++++++++++++ net/core/dev.c | 5 ++++- 2 files changed, 21 insertions(+), 1 deletion(-)