On Mon,  1 Feb 2021 15:12:19 -0300 Marcelo Ricardo Leitner wrote:
> Often userspace won't request the extack information, or they don't log it
> because of log level or so, and even when they do, sometimes it's not
> enough to know exactly what caused the error.
> 
> Netlink extack is the standard way of reporting erros with descriptive
> error messages. With a trace point on it, we then can know exactly where
> the error happened, regardless of userspace app. Also, we can even see if
> the err msg was overwritten.
> 
> The wrapper do_trace_netlink_extack() is because trace points shouldn't be
> called from .h files, as trace points are not that small, and the function
> call to do_trace_netlink_extack() on the macros is not protected by
> tracepoint_enabled() because the macros are called from modules, and this
> would require exporting some trace structs. As this is error path, it's
> better to export just the wrapper instead.
> 
> Signed-off-by: Marcelo Ricardo Leitner <marcelo.leit...@gmail.com>

> --- a/include/linux/netlink.h
> +++ b/include/linux/netlink.h
> @@ -6,11 +6,15 @@
>  #include <linux/capability.h>
>  #include <linux/skbuff.h>
>  #include <linux/export.h>
> +#include <linux/tracepoint.h>

Do we need the include...

>  #include <net/scm.h>
>  #include <uapi/linux/netlink.h>
>  
>  struct net;
>  
> +DECLARE_TRACEPOINT(netlink_extack);

... and the declaration? Seems to be a leftover.

> +void do_trace_netlink_extack(const char *msg);
> +
>  static inline struct nlmsghdr *nlmsg_hdr(const struct sk_buff *skb)
>  {
>       return (struct nlmsghdr *)skb->data;
> @@ -90,6 +94,8 @@ struct netlink_ext_ack {
>       static const char __msg[] = msg;                \
>       struct netlink_ext_ack *__extack = (extack);    \
>                                                       \
> +     do_trace_netlink_extack(__msg);                 \
> +                                                     \
>       if (__extack)                                   \
>               __extack->_msg = __msg;                 \
>  } while (0)
> @@ -110,6 +116,8 @@ struct netlink_ext_ack {
>       static const char __msg[] = msg;                        \
>       struct netlink_ext_ack *__extack = (extack);            \
>                                                               \
> +     do_trace_netlink_extack(__msg);                         \
> +                                                             \
>       if (__extack) {                                         \
>               __extack->_msg = __msg;                         \
>               __extack->bad_attr = (attr);                    \

Reply via email to