From: Johannes Berg <[email protected]>

The __print_symbolic() could only ever print the core
drop reasons, since that's the way the infrastructure
works. Now that we have __print_sym() with all the
advantages mentioned in that commit, convert to that
and get all the drop reasons from all subsystems. As
we already have a list of them, that's really easy.

This is a little bit of .text (~100 bytes in my build)
and saves a lot of .data (~17k).

Signed-off-by: Johannes Berg <[email protected]>
---
v7: update the selftest accordingly
---
 include/net/dropreason.h                      |  5 +++
 include/trace/events/skb.h                    | 13 ++----
 net/core/skbuff.c                             | 43 +++++++++++++++++++
 .../selftests/net/openvswitch/openvswitch.sh  | 17 ++------
 4 files changed, 55 insertions(+), 23 deletions(-)

diff --git a/include/net/dropreason.h b/include/net/dropreason.h
index 1df60645fb27..dc4a60130c09 100644
--- a/include/net/dropreason.h
+++ b/include/net/dropreason.h
@@ -42,6 +42,11 @@ struct drop_reason_list {
 extern const struct drop_reason_list __rcu *
 drop_reasons_by_subsys[SKB_DROP_REASON_SUBSYS_NUM];
 
+#ifdef CONFIG_TRACEPOINTS
+const char *drop_reason_lookup(unsigned long long value);
+void drop_reason_show(struct seq_file *m);
+#endif
+
 void drop_reasons_register_subsys(enum skb_drop_reason_subsys subsys,
                                  const struct drop_reason_list *list);
 void drop_reasons_unregister_subsys(enum skb_drop_reason_subsys subsys);
diff --git a/include/trace/events/skb.h b/include/trace/events/skb.h
index 2945aa7fe9a7..991bf172a6ea 100644
--- a/include/trace/events/skb.h
+++ b/include/trace/events/skb.h
@@ -8,15 +8,9 @@
 #include <linux/skbuff.h>
 #include <linux/netdevice.h>
 #include <linux/tracepoint.h>
+#include <net/dropreason.h>
 
-#undef FN
-#define FN(reason)     TRACE_DEFINE_ENUM(SKB_DROP_REASON_##reason);
-DEFINE_DROP_REASON(FN, FN)
-
-#undef FN
-#undef FNe
-#define FN(reason)     { SKB_DROP_REASON_##reason, #reason },
-#define FNe(reason)    { SKB_DROP_REASON_##reason, #reason }
+TRACE_DEFINE_SYM_FNS(drop_reason, drop_reason_lookup, drop_reason_show);
 
 /*
  * Tracepoint for free an sk_buff:
@@ -47,8 +41,7 @@ TRACE_EVENT(kfree_skb,
        TP_printk("skbaddr=%p rx_sk=%p protocol=%u location=%pS reason: %s",
                  __entry->skbaddr, __entry->rx_sk, __entry->protocol,
                  __entry->location,
-                 __print_symbolic(__entry->reason,
-                                  DEFINE_DROP_REASON(FN, FNe)))
+                 __print_sym(__entry->reason, drop_reason))
 );
 
 #undef FN
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index dbbe10277d51..8c8f7a05dea4 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -154,6 +154,49 @@ drop_reasons_by_subsys[SKB_DROP_REASON_SUBSYS_NUM] = {
 };
 EXPORT_SYMBOL(drop_reasons_by_subsys);
 
+#ifdef CONFIG_TRACEPOINTS
+const char *drop_reason_lookup(unsigned long long value)
+{
+       unsigned long long subsys_id = value >> SKB_DROP_REASON_SUBSYS_SHIFT;
+       u32 reason = value & ~SKB_DROP_REASON_SUBSYS_MASK;
+       const struct drop_reason_list *subsys;
+
+       if (subsys_id >= SKB_DROP_REASON_SUBSYS_NUM)
+               return NULL;
+
+       subsys = rcu_dereference(drop_reasons_by_subsys[subsys_id]);
+       if (!subsys)
+               return NULL;
+       if (reason >= subsys->n_reasons)
+               return NULL;
+       return subsys->reasons[reason];
+}
+
+void drop_reason_show(struct seq_file *m)
+{
+       u32 subsys_id;
+
+       rcu_read_lock();
+       for (subsys_id = 0; subsys_id < SKB_DROP_REASON_SUBSYS_NUM; 
subsys_id++) {
+               const struct drop_reason_list *subsys;
+               u32 i;
+
+               subsys = rcu_dereference(drop_reasons_by_subsys[subsys_id]);
+               if (!subsys)
+                       continue;
+
+               for (i = 0; i < subsys->n_reasons; i++) {
+                       if (!subsys->reasons[i])
+                               continue;
+                       seq_printf(m, ", { %u, \"%s\" }",
+                                  (subsys_id << SKB_DROP_REASON_SUBSYS_SHIFT) 
| i,
+                                  subsys->reasons[i]);
+               }
+       }
+       rcu_read_unlock();
+}
+#endif
+
 /**
  * drop_reasons_register_subsys - register another drop reason subsystem
  * @subsys: the subsystem to register, must not be the core
diff --git a/tools/testing/selftests/net/openvswitch/openvswitch.sh 
b/tools/testing/selftests/net/openvswitch/openvswitch.sh
index a31f7fb6882d..9b8edfcd2d1a 100755
--- a/tools/testing/selftests/net/openvswitch/openvswitch.sh
+++ b/tools/testing/selftests/net/openvswitch/openvswitch.sh
@@ -234,7 +234,7 @@ ovs_drop_reason_count()
        local reason=$1
 
        local perf_output=`perf script -i ${ovs_dir}/perf.data -F 
trace:event,trace`
-       local pattern="skb:kfree_skb:.*reason: $reason"
+       local pattern="skb:kfree_skb:.*reason: $reason$"
 
        return `echo "$perf_output" | grep "$pattern" | wc -l`
 }
@@ -790,15 +790,6 @@ test_psample() {
 # - drop packets and verify the right drop reason is reported
 test_drop_reason() {
        which perf >/dev/null 2>&1 || return $ksft_skip
-       which pahole >/dev/null 2>&1 || return $ksft_skip
-
-       ovs_drop_subsys=$(pahole -C skb_drop_reason_subsys |
-                             awk '/OPENVSWITCH/ { print $3; }' |
-                             tr -d ,)
-       if [ -z "$ovs_drop_subsys" ]; then
-               info "failed to get OVS drop subsys ID"
-               return $ksft_skip
-       fi
 
        sbx_add "test_drop_reason" || return $?
 
@@ -842,7 +833,7 @@ test_drop_reason() {
                
"in_port(2),eth(),eth_type(0x0800),ipv4(src=172.31.110.20,proto=1),icmp()" 
'drop'
 
        ovs_drop_record_and_run "test_drop_reason" ip netns exec client ping -c 
2 172.31.110.20
-       ovs_drop_reason_count 0x${ovs_drop_subsys}0001 # OVS_DROP_FLOW_ACTION
+       ovs_drop_reason_count OVS_DROP_LAST_ACTION
        if [[ "$?" -ne "2" ]]; then
                info "Did not detect expected drops: $?"
                return 1
@@ -859,7 +850,7 @@ test_drop_reason() {
 
        ovs_drop_record_and_run \
             "test_drop_reason" ip netns exec client nc -i 1 -zuv 172.31.110.20 
6000
-       ovs_drop_reason_count 0x${ovs_drop_subsys}0004 # 
OVS_DROP_EXPLICIT_ACTION_ERROR
+       ovs_drop_reason_count OVS_DROP_EXPLICIT_WITH_ERROR
        if [[ "$?" -ne "1" ]]; then
                info "Did not detect expected explicit error drops: $?"
                return 1
@@ -867,7 +858,7 @@ test_drop_reason() {
 
        ovs_drop_record_and_run \
             "test_drop_reason" ip netns exec client nc -i 1 -zuv 172.31.110.20 
7000
-       ovs_drop_reason_count 0x${ovs_drop_subsys}0003 # 
OVS_DROP_EXPLICIT_ACTION
+       ovs_drop_reason_count OVS_DROP_EXPLICIT
        if [[ "$?" -ne "1" ]]; then
                info "Did not detect expected explicit drops: $?"
                return 1
-- 
2.55.0


Reply via email to