diff options
author | Daniel Borkmann <dborkman@redhat.com> | 2013-06-28 13:49:40 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-07-02 02:22:13 -0400 |
commit | bb33381d0c97cdee25f2cdab540b6e2bd16fa03b (patch) | |
tree | a4def6ec9f554908e07efa8671ca52f60f9a2a18 /net/sctp/sm_sideeffect.c | |
parent | 1067964305df131ede2c08c2f3c9b3892640f1c6 (diff) |
net: sctp: rework debugging framework to use pr_debug and friends
We should get rid of all own SCTP debug printk macros and use the ones
that the kernel offers anyway instead. This makes the code more readable
and conform to the kernel code, and offers all the features of dynamic
debbuging that pr_debug() et al has, such as only turning on/off portions
of debug messages at runtime through debugfs. The runtime cost of having
CONFIG_DYNAMIC_DEBUG enabled, but none of the debug statements printing,
is negligible [1]. If kernel debugging is completly turned off, then these
statements will also compile into "empty" functions.
While we're at it, we also need to change the Kconfig option as it /now/
only refers to the ifdef'ed code portions in outqueue.c that enable further
debugging/tracing of SCTP transaction fields. Also, since SCTP_ASSERT code
was enabled with this Kconfig option and has now been removed, we
transform those code parts into WARNs resp. where appropriate BUG_ONs so
that those bugs can be more easily detected as probably not many people
have SCTP debugging permanently turned on.
To turn on all SCTP debugging, the following steps are needed:
# mount -t debugfs none /sys/kernel/debug
# echo -n 'module sctp +p' > /sys/kernel/debug/dynamic_debug/control
This can be done more fine-grained on a per file, per line basis and others
as described in [2].
[1] https://www.kernel.org/doc/ols/2009/ols2009-pages-39-46.pdf
[2] Documentation/dynamic-debug-howto.txt
Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sctp/sm_sideeffect.c')
-rw-r--r-- | net/sctp/sm_sideeffect.c | 96 |
1 files changed, 40 insertions, 56 deletions
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index ff91f47b0239..cf6f84518222 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c | |||
@@ -257,7 +257,7 @@ void sctp_generate_t3_rtx_event(unsigned long peer) | |||
257 | 257 | ||
258 | sctp_bh_lock_sock(asoc->base.sk); | 258 | sctp_bh_lock_sock(asoc->base.sk); |
259 | if (sock_owned_by_user(asoc->base.sk)) { | 259 | if (sock_owned_by_user(asoc->base.sk)) { |
260 | SCTP_DEBUG_PRINTK("%s:Sock is busy.\n", __func__); | 260 | pr_debug("%s: sock is busy\n", __func__); |
261 | 261 | ||
262 | /* Try again later. */ | 262 | /* Try again later. */ |
263 | if (!mod_timer(&transport->T3_rtx_timer, jiffies + (HZ/20))) | 263 | if (!mod_timer(&transport->T3_rtx_timer, jiffies + (HZ/20))) |
@@ -297,9 +297,8 @@ static void sctp_generate_timeout_event(struct sctp_association *asoc, | |||
297 | 297 | ||
298 | sctp_bh_lock_sock(asoc->base.sk); | 298 | sctp_bh_lock_sock(asoc->base.sk); |
299 | if (sock_owned_by_user(asoc->base.sk)) { | 299 | if (sock_owned_by_user(asoc->base.sk)) { |
300 | SCTP_DEBUG_PRINTK("%s:Sock is busy: timer %d\n", | 300 | pr_debug("%s: sock is busy: timer %d\n", __func__, |
301 | __func__, | 301 | timeout_type); |
302 | timeout_type); | ||
303 | 302 | ||
304 | /* Try again later. */ | 303 | /* Try again later. */ |
305 | if (!mod_timer(&asoc->timers[timeout_type], jiffies + (HZ/20))) | 304 | if (!mod_timer(&asoc->timers[timeout_type], jiffies + (HZ/20))) |
@@ -377,7 +376,7 @@ void sctp_generate_heartbeat_event(unsigned long data) | |||
377 | 376 | ||
378 | sctp_bh_lock_sock(asoc->base.sk); | 377 | sctp_bh_lock_sock(asoc->base.sk); |
379 | if (sock_owned_by_user(asoc->base.sk)) { | 378 | if (sock_owned_by_user(asoc->base.sk)) { |
380 | SCTP_DEBUG_PRINTK("%s:Sock is busy.\n", __func__); | 379 | pr_debug("%s: sock is busy\n", __func__); |
381 | 380 | ||
382 | /* Try again later. */ | 381 | /* Try again later. */ |
383 | if (!mod_timer(&transport->hb_timer, jiffies + (HZ/20))) | 382 | if (!mod_timer(&transport->hb_timer, jiffies + (HZ/20))) |
@@ -415,7 +414,7 @@ void sctp_generate_proto_unreach_event(unsigned long data) | |||
415 | 414 | ||
416 | sctp_bh_lock_sock(asoc->base.sk); | 415 | sctp_bh_lock_sock(asoc->base.sk); |
417 | if (sock_owned_by_user(asoc->base.sk)) { | 416 | if (sock_owned_by_user(asoc->base.sk)) { |
418 | SCTP_DEBUG_PRINTK("%s:Sock is busy.\n", __func__); | 417 | pr_debug("%s: sock is busy\n", __func__); |
419 | 418 | ||
420 | /* Try again later. */ | 419 | /* Try again later. */ |
421 | if (!mod_timer(&transport->proto_unreach_timer, | 420 | if (!mod_timer(&transport->proto_unreach_timer, |
@@ -521,11 +520,9 @@ static void sctp_do_8_2_transport_strike(sctp_cmd_seq_t *commands, | |||
521 | 520 | ||
522 | if (transport->state != SCTP_INACTIVE && | 521 | if (transport->state != SCTP_INACTIVE && |
523 | (transport->error_count > transport->pathmaxrxt)) { | 522 | (transport->error_count > transport->pathmaxrxt)) { |
524 | SCTP_DEBUG_PRINTK_IPADDR("transport_strike:association %p", | 523 | pr_debug("%s: association:%p transport addr:%pISpc failed\n", |
525 | " transport IP: port:%d failed.\n", | 524 | __func__, asoc, &transport->ipaddr.sa); |
526 | asoc, | 525 | |
527 | (&transport->ipaddr), | ||
528 | ntohs(transport->ipaddr.v4.sin_port)); | ||
529 | sctp_assoc_control_transport(asoc, transport, | 526 | sctp_assoc_control_transport(asoc, transport, |
530 | SCTP_TRANSPORT_DOWN, | 527 | SCTP_TRANSPORT_DOWN, |
531 | SCTP_FAILED_THRESHOLD); | 528 | SCTP_FAILED_THRESHOLD); |
@@ -804,8 +801,7 @@ static void sctp_cmd_new_state(sctp_cmd_seq_t *cmds, | |||
804 | 801 | ||
805 | asoc->state = state; | 802 | asoc->state = state; |
806 | 803 | ||
807 | SCTP_DEBUG_PRINTK("sctp_cmd_new_state: asoc %p[%s]\n", | 804 | pr_debug("%s: asoc:%p[%s]\n", __func__, asoc, sctp_state_tbl[state]); |
808 | asoc, sctp_state_tbl[state]); | ||
809 | 805 | ||
810 | if (sctp_style(sk, TCP)) { | 806 | if (sctp_style(sk, TCP)) { |
811 | /* Change the sk->sk_state of a TCP-style socket that has | 807 | /* Change the sk->sk_state of a TCP-style socket that has |
@@ -1017,15 +1013,11 @@ static void sctp_cmd_t1_timer_update(struct sctp_association *asoc, | |||
1017 | asoc->timeouts[timer] = asoc->max_init_timeo; | 1013 | asoc->timeouts[timer] = asoc->max_init_timeo; |
1018 | } | 1014 | } |
1019 | asoc->init_cycle++; | 1015 | asoc->init_cycle++; |
1020 | SCTP_DEBUG_PRINTK( | 1016 | |
1021 | "T1 %s Timeout adjustment" | 1017 | pr_debug("%s: T1[%s] timeout adjustment init_err_counter:%d" |
1022 | " init_err_counter: %d" | 1018 | " cycle:%d timeout:%ld\n", __func__, name, |
1023 | " cycle: %d" | 1019 | asoc->init_err_counter, asoc->init_cycle, |
1024 | " timeout: %ld\n", | 1020 | asoc->timeouts[timer]); |
1025 | name, | ||
1026 | asoc->init_err_counter, | ||
1027 | asoc->init_cycle, | ||
1028 | asoc->timeouts[timer]); | ||
1029 | } | 1021 | } |
1030 | 1022 | ||
1031 | } | 1023 | } |
@@ -1080,23 +1072,19 @@ static void sctp_cmd_send_asconf(struct sctp_association *asoc) | |||
1080 | * main flow of sctp_do_sm() to keep attention focused on the real | 1072 | * main flow of sctp_do_sm() to keep attention focused on the real |
1081 | * functionality there. | 1073 | * functionality there. |
1082 | */ | 1074 | */ |
1083 | #define DEBUG_PRE \ | 1075 | #define debug_pre_sfn() \ |
1084 | SCTP_DEBUG_PRINTK("sctp_do_sm prefn: " \ | 1076 | pr_debug("%s[pre-fn]: ep:%p, %s, %s, asoc:%p[%s], %s\n", __func__, \ |
1085 | "ep %p, %s, %s, asoc %p[%s], %s\n", \ | 1077 | ep, sctp_evttype_tbl[event_type], (*debug_fn)(subtype), \ |
1086 | ep, sctp_evttype_tbl[event_type], \ | 1078 | asoc, sctp_state_tbl[state], state_fn->name) |
1087 | (*debug_fn)(subtype), asoc, \ | 1079 | |
1088 | sctp_state_tbl[state], state_fn->name) | 1080 | #define debug_post_sfn() \ |
1089 | 1081 | pr_debug("%s[post-fn]: asoc:%p, status:%s\n", __func__, asoc, \ | |
1090 | #define DEBUG_POST \ | 1082 | sctp_status_tbl[status]) |
1091 | SCTP_DEBUG_PRINTK("sctp_do_sm postfn: " \ | 1083 | |
1092 | "asoc %p, status: %s\n", \ | 1084 | #define debug_post_sfx() \ |
1093 | asoc, sctp_status_tbl[status]) | 1085 | pr_debug("%s[post-sfx]: error:%d, asoc:%p[%s]\n", __func__, error, \ |
1094 | 1086 | asoc, sctp_state_tbl[(asoc && sctp_id2assoc(ep->base.sk, \ | |
1095 | #define DEBUG_POST_SFX \ | 1087 | sctp_assoc2id(asoc))) ? asoc->state : SCTP_STATE_CLOSED]) |
1096 | SCTP_DEBUG_PRINTK("sctp_do_sm post sfx: error %d, asoc %p[%s]\n", \ | ||
1097 | error, asoc, \ | ||
1098 | sctp_state_tbl[(asoc && sctp_id2assoc(ep->base.sk, \ | ||
1099 | sctp_assoc2id(asoc)))?asoc->state:SCTP_STATE_CLOSED]) | ||
1100 | 1088 | ||
1101 | /* | 1089 | /* |
1102 | * This is the master state machine processing function. | 1090 | * This is the master state machine processing function. |
@@ -1116,7 +1104,6 @@ int sctp_do_sm(struct net *net, sctp_event_t event_type, sctp_subtype_t subtype, | |||
1116 | sctp_disposition_t status; | 1104 | sctp_disposition_t status; |
1117 | int error = 0; | 1105 | int error = 0; |
1118 | typedef const char *(printfn_t)(sctp_subtype_t); | 1106 | typedef const char *(printfn_t)(sctp_subtype_t); |
1119 | |||
1120 | static printfn_t *table[] = { | 1107 | static printfn_t *table[] = { |
1121 | NULL, sctp_cname, sctp_tname, sctp_oname, sctp_pname, | 1108 | NULL, sctp_cname, sctp_tname, sctp_oname, sctp_pname, |
1122 | }; | 1109 | }; |
@@ -1129,21 +1116,18 @@ int sctp_do_sm(struct net *net, sctp_event_t event_type, sctp_subtype_t subtype, | |||
1129 | 1116 | ||
1130 | sctp_init_cmd_seq(&commands); | 1117 | sctp_init_cmd_seq(&commands); |
1131 | 1118 | ||
1132 | DEBUG_PRE; | 1119 | debug_pre_sfn(); |
1133 | status = (*state_fn->fn)(net, ep, asoc, subtype, event_arg, &commands); | 1120 | status = (*state_fn->fn)(net, ep, asoc, subtype, event_arg, &commands); |
1134 | DEBUG_POST; | 1121 | debug_post_sfn(); |
1135 | 1122 | ||
1136 | error = sctp_side_effects(event_type, subtype, state, | 1123 | error = sctp_side_effects(event_type, subtype, state, |
1137 | ep, asoc, event_arg, status, | 1124 | ep, asoc, event_arg, status, |
1138 | &commands, gfp); | 1125 | &commands, gfp); |
1139 | DEBUG_POST_SFX; | 1126 | debug_post_sfx(); |
1140 | 1127 | ||
1141 | return error; | 1128 | return error; |
1142 | } | 1129 | } |
1143 | 1130 | ||
1144 | #undef DEBUG_PRE | ||
1145 | #undef DEBUG_POST | ||
1146 | |||
1147 | /***************************************************************** | 1131 | /***************************************************************** |
1148 | * This the master state function side effect processing function. | 1132 | * This the master state function side effect processing function. |
1149 | *****************************************************************/ | 1133 | *****************************************************************/ |
@@ -1172,9 +1156,9 @@ static int sctp_side_effects(sctp_event_t event_type, sctp_subtype_t subtype, | |||
1172 | 1156 | ||
1173 | switch (status) { | 1157 | switch (status) { |
1174 | case SCTP_DISPOSITION_DISCARD: | 1158 | case SCTP_DISPOSITION_DISCARD: |
1175 | SCTP_DEBUG_PRINTK("Ignored sctp protocol event - state %d, " | 1159 | pr_debug("%s: ignored sctp protocol event - state:%d, " |
1176 | "event_type %d, event_id %d\n", | 1160 | "event_type:%d, event_id:%d\n", __func__, state, |
1177 | state, event_type, subtype.chunk); | 1161 | event_type, subtype.chunk); |
1178 | break; | 1162 | break; |
1179 | 1163 | ||
1180 | case SCTP_DISPOSITION_NOMEM: | 1164 | case SCTP_DISPOSITION_NOMEM: |
@@ -1425,18 +1409,18 @@ static int sctp_cmd_interpreter(sctp_event_t event_type, | |||
1425 | 1409 | ||
1426 | case SCTP_CMD_CHUNK_ULP: | 1410 | case SCTP_CMD_CHUNK_ULP: |
1427 | /* Send a chunk to the sockets layer. */ | 1411 | /* Send a chunk to the sockets layer. */ |
1428 | SCTP_DEBUG_PRINTK("sm_sideff: %s %p, %s %p.\n", | 1412 | pr_debug("%s: sm_sideff: chunk_up:%p, ulpq:%p\n", |
1429 | "chunk_up:", cmd->obj.chunk, | 1413 | __func__, cmd->obj.chunk, &asoc->ulpq); |
1430 | "ulpq:", &asoc->ulpq); | 1414 | |
1431 | sctp_ulpq_tail_data(&asoc->ulpq, cmd->obj.chunk, | 1415 | sctp_ulpq_tail_data(&asoc->ulpq, cmd->obj.chunk, |
1432 | GFP_ATOMIC); | 1416 | GFP_ATOMIC); |
1433 | break; | 1417 | break; |
1434 | 1418 | ||
1435 | case SCTP_CMD_EVENT_ULP: | 1419 | case SCTP_CMD_EVENT_ULP: |
1436 | /* Send a notification to the sockets layer. */ | 1420 | /* Send a notification to the sockets layer. */ |
1437 | SCTP_DEBUG_PRINTK("sm_sideff: %s %p, %s %p.\n", | 1421 | pr_debug("%s: sm_sideff: event_up:%p, ulpq:%p\n", |
1438 | "event_up:",cmd->obj.ulpevent, | 1422 | __func__, cmd->obj.ulpevent, &asoc->ulpq); |
1439 | "ulpq:",&asoc->ulpq); | 1423 | |
1440 | sctp_ulpq_tail_event(&asoc->ulpq, cmd->obj.ulpevent); | 1424 | sctp_ulpq_tail_event(&asoc->ulpq, cmd->obj.ulpevent); |
1441 | break; | 1425 | break; |
1442 | 1426 | ||
@@ -1601,7 +1585,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type, | |||
1601 | break; | 1585 | break; |
1602 | 1586 | ||
1603 | case SCTP_CMD_REPORT_BAD_TAG: | 1587 | case SCTP_CMD_REPORT_BAD_TAG: |
1604 | SCTP_DEBUG_PRINTK("vtag mismatch!\n"); | 1588 | pr_debug("%s: vtag mismatch!\n", __func__); |
1605 | break; | 1589 | break; |
1606 | 1590 | ||
1607 | case SCTP_CMD_STRIKE: | 1591 | case SCTP_CMD_STRIKE: |