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/outqueue.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/outqueue.c')
-rw-r--r-- | net/sctp/outqueue.c | 160 |
1 files changed, 70 insertions, 90 deletions
diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c index be35e2dbcc9a..511b3b35d609 100644 --- a/net/sctp/outqueue.c +++ b/net/sctp/outqueue.c | |||
@@ -299,10 +299,10 @@ int sctp_outq_tail(struct sctp_outq *q, struct sctp_chunk *chunk) | |||
299 | struct net *net = sock_net(q->asoc->base.sk); | 299 | struct net *net = sock_net(q->asoc->base.sk); |
300 | int error = 0; | 300 | int error = 0; |
301 | 301 | ||
302 | SCTP_DEBUG_PRINTK("sctp_outq_tail(%p, %p[%s])\n", | 302 | pr_debug("%s: outq:%p, chunk:%p[%s]\n", __func__, q, chunk, |
303 | q, chunk, chunk && chunk->chunk_hdr ? | 303 | chunk && chunk->chunk_hdr ? |
304 | sctp_cname(SCTP_ST_CHUNK(chunk->chunk_hdr->type)) | 304 | sctp_cname(SCTP_ST_CHUNK(chunk->chunk_hdr->type)) : |
305 | : "Illegal Chunk"); | 305 | "illegal chunk"); |
306 | 306 | ||
307 | /* If it is data, queue it up, otherwise, send it | 307 | /* If it is data, queue it up, otherwise, send it |
308 | * immediately. | 308 | * immediately. |
@@ -328,10 +328,10 @@ int sctp_outq_tail(struct sctp_outq *q, struct sctp_chunk *chunk) | |||
328 | break; | 328 | break; |
329 | 329 | ||
330 | default: | 330 | default: |
331 | SCTP_DEBUG_PRINTK("outqueueing (%p, %p[%s])\n", | 331 | pr_debug("%s: outqueueing: outq:%p, chunk:%p[%s])\n", |
332 | q, chunk, chunk && chunk->chunk_hdr ? | 332 | __func__, q, chunk, chunk && chunk->chunk_hdr ? |
333 | sctp_cname(SCTP_ST_CHUNK(chunk->chunk_hdr->type)) | 333 | sctp_cname(SCTP_ST_CHUNK(chunk->chunk_hdr->type)) : |
334 | : "Illegal Chunk"); | 334 | "illegal chunk"); |
335 | 335 | ||
336 | sctp_outq_tail_data(q, chunk); | 336 | sctp_outq_tail_data(q, chunk); |
337 | if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED) | 337 | if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED) |
@@ -460,14 +460,10 @@ void sctp_retransmit_mark(struct sctp_outq *q, | |||
460 | } | 460 | } |
461 | } | 461 | } |
462 | 462 | ||
463 | SCTP_DEBUG_PRINTK("%s: transport: %p, reason: %d, " | 463 | pr_debug("%s: transport:%p, reason:%d, cwnd:%d, ssthresh:%d, " |
464 | "cwnd: %d, ssthresh: %d, flight_size: %d, " | 464 | "flight_size:%d, pba:%d\n", __func__, transport, reason, |
465 | "pba: %d\n", __func__, | 465 | transport->cwnd, transport->ssthresh, transport->flight_size, |
466 | transport, reason, | 466 | transport->partial_bytes_acked); |
467 | transport->cwnd, transport->ssthresh, | ||
468 | transport->flight_size, | ||
469 | transport->partial_bytes_acked); | ||
470 | |||
471 | } | 467 | } |
472 | 468 | ||
473 | /* Mark all the eligible packets on a transport for retransmission and force | 469 | /* Mark all the eligible packets on a transport for retransmission and force |
@@ -1014,19 +1010,13 @@ static int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout) | |||
1014 | sctp_transport_burst_limited(transport); | 1010 | sctp_transport_burst_limited(transport); |
1015 | } | 1011 | } |
1016 | 1012 | ||
1017 | SCTP_DEBUG_PRINTK("sctp_outq_flush(%p, %p[%s]), ", | 1013 | pr_debug("%s: outq:%p, chunk:%p[%s], tx-tsn:0x%x skb->head:%p " |
1018 | q, chunk, | 1014 | "skb->users:%d\n", |
1019 | chunk && chunk->chunk_hdr ? | 1015 | __func__, q, chunk, chunk && chunk->chunk_hdr ? |
1020 | sctp_cname(SCTP_ST_CHUNK( | 1016 | sctp_cname(SCTP_ST_CHUNK(chunk->chunk_hdr->type)) : |
1021 | chunk->chunk_hdr->type)) | 1017 | "illegal chunk", ntohl(chunk->subh.data_hdr->tsn), |
1022 | : "Illegal Chunk"); | 1018 | chunk->skb ? chunk->skb->head : NULL, chunk->skb ? |
1023 | 1019 | atomic_read(&chunk->skb->users) : -1); | |
1024 | SCTP_DEBUG_PRINTK("TX TSN 0x%x skb->head " | ||
1025 | "%p skb->users %d.\n", | ||
1026 | ntohl(chunk->subh.data_hdr->tsn), | ||
1027 | chunk->skb ?chunk->skb->head : NULL, | ||
1028 | chunk->skb ? | ||
1029 | atomic_read(&chunk->skb->users) : -1); | ||
1030 | 1020 | ||
1031 | /* Add the chunk to the packet. */ | 1021 | /* Add the chunk to the packet. */ |
1032 | status = sctp_packet_transmit_chunk(packet, chunk, 0); | 1022 | status = sctp_packet_transmit_chunk(packet, chunk, 0); |
@@ -1038,10 +1028,10 @@ static int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout) | |||
1038 | /* We could not append this chunk, so put | 1028 | /* We could not append this chunk, so put |
1039 | * the chunk back on the output queue. | 1029 | * the chunk back on the output queue. |
1040 | */ | 1030 | */ |
1041 | SCTP_DEBUG_PRINTK("sctp_outq_flush: could " | 1031 | pr_debug("%s: could not transmit tsn:0x%x, status:%d\n", |
1042 | "not transmit TSN: 0x%x, status: %d\n", | 1032 | __func__, ntohl(chunk->subh.data_hdr->tsn), |
1043 | ntohl(chunk->subh.data_hdr->tsn), | 1033 | status); |
1044 | status); | 1034 | |
1045 | sctp_outq_head_data(q, chunk); | 1035 | sctp_outq_head_data(q, chunk); |
1046 | goto sctp_flush_out; | 1036 | goto sctp_flush_out; |
1047 | break; | 1037 | break; |
@@ -1284,11 +1274,10 @@ int sctp_outq_sack(struct sctp_outq *q, struct sctp_chunk *chunk) | |||
1284 | 1274 | ||
1285 | sctp_generate_fwdtsn(q, sack_ctsn); | 1275 | sctp_generate_fwdtsn(q, sack_ctsn); |
1286 | 1276 | ||
1287 | SCTP_DEBUG_PRINTK("%s: sack Cumulative TSN Ack is 0x%x.\n", | 1277 | pr_debug("%s: sack cumulative tsn ack:0x%x\n", __func__, sack_ctsn); |
1288 | __func__, sack_ctsn); | 1278 | pr_debug("%s: cumulative tsn ack of assoc:%p is 0x%x, " |
1289 | SCTP_DEBUG_PRINTK("%s: Cumulative TSN Ack of association, " | 1279 | "advertised peer ack point:0x%x\n", __func__, asoc, ctsn, |
1290 | "%p is 0x%x. Adv peer ack point: 0x%x\n", | 1280 | asoc->adv_peer_ack_point); |
1291 | __func__, asoc, ctsn, asoc->adv_peer_ack_point); | ||
1292 | 1281 | ||
1293 | /* See if all chunks are acked. | 1282 | /* See if all chunks are acked. |
1294 | * Make sure the empty queue handler will get run later. | 1283 | * Make sure the empty queue handler will get run later. |
@@ -1304,7 +1293,7 @@ int sctp_outq_sack(struct sctp_outq *q, struct sctp_chunk *chunk) | |||
1304 | goto finish; | 1293 | goto finish; |
1305 | } | 1294 | } |
1306 | 1295 | ||
1307 | SCTP_DEBUG_PRINTK("sack queue is empty.\n"); | 1296 | pr_debug("%s: sack queue is empty\n", __func__); |
1308 | finish: | 1297 | finish: |
1309 | return q->empty; | 1298 | return q->empty; |
1310 | } | 1299 | } |
@@ -1348,7 +1337,7 @@ static void sctp_check_transmitted(struct sctp_outq *q, | |||
1348 | 1337 | ||
1349 | /* These state variables are for coherent debug output. --xguo */ | 1338 | /* These state variables are for coherent debug output. --xguo */ |
1350 | 1339 | ||
1351 | #if SCTP_DEBUG | 1340 | #ifdef CONFIG_SCTP_DBG_TSNS |
1352 | __u32 dbg_ack_tsn = 0; /* An ACKed TSN range starts here... */ | 1341 | __u32 dbg_ack_tsn = 0; /* An ACKed TSN range starts here... */ |
1353 | __u32 dbg_last_ack_tsn = 0; /* ...and finishes here. */ | 1342 | __u32 dbg_last_ack_tsn = 0; /* ...and finishes here. */ |
1354 | __u32 dbg_kept_tsn = 0; /* An un-ACKed range starts here... */ | 1343 | __u32 dbg_kept_tsn = 0; /* An un-ACKed range starts here... */ |
@@ -1359,7 +1348,7 @@ static void sctp_check_transmitted(struct sctp_outq *q, | |||
1359 | * -1: We need to initialize. | 1348 | * -1: We need to initialize. |
1360 | */ | 1349 | */ |
1361 | int dbg_prt_state = -1; | 1350 | int dbg_prt_state = -1; |
1362 | #endif /* SCTP_DEBUG */ | 1351 | #endif /* CONFIG_SCTP_DBG_TSNS */ |
1363 | 1352 | ||
1364 | sack_ctsn = ntohl(sack->cum_tsn_ack); | 1353 | sack_ctsn = ntohl(sack->cum_tsn_ack); |
1365 | 1354 | ||
@@ -1483,7 +1472,7 @@ static void sctp_check_transmitted(struct sctp_outq *q, | |||
1483 | list_add_tail(lchunk, &tlist); | 1472 | list_add_tail(lchunk, &tlist); |
1484 | } | 1473 | } |
1485 | 1474 | ||
1486 | #if SCTP_DEBUG | 1475 | #ifdef CONFIG_SCTP_DBG_TSNS |
1487 | switch (dbg_prt_state) { | 1476 | switch (dbg_prt_state) { |
1488 | case 0: /* last TSN was ACKed */ | 1477 | case 0: /* last TSN was ACKed */ |
1489 | if (dbg_last_ack_tsn + 1 == tsn) { | 1478 | if (dbg_last_ack_tsn + 1 == tsn) { |
@@ -1497,42 +1486,39 @@ static void sctp_check_transmitted(struct sctp_outq *q, | |||
1497 | /* Display the end of the | 1486 | /* Display the end of the |
1498 | * current range. | 1487 | * current range. |
1499 | */ | 1488 | */ |
1500 | SCTP_DEBUG_PRINTK_CONT("-%08x", | 1489 | pr_cont("-%08x", dbg_last_ack_tsn); |
1501 | dbg_last_ack_tsn); | ||
1502 | } | 1490 | } |
1503 | 1491 | ||
1504 | /* Start a new range. */ | 1492 | /* Start a new range. */ |
1505 | SCTP_DEBUG_PRINTK_CONT(",%08x", tsn); | 1493 | pr_cont(",%08x", tsn); |
1506 | dbg_ack_tsn = tsn; | 1494 | dbg_ack_tsn = tsn; |
1507 | break; | 1495 | break; |
1508 | 1496 | ||
1509 | case 1: /* The last TSN was NOT ACKed. */ | 1497 | case 1: /* The last TSN was NOT ACKed. */ |
1510 | if (dbg_last_kept_tsn != dbg_kept_tsn) { | 1498 | if (dbg_last_kept_tsn != dbg_kept_tsn) { |
1511 | /* Display the end of current range. */ | 1499 | /* Display the end of current range. */ |
1512 | SCTP_DEBUG_PRINTK_CONT("-%08x", | 1500 | pr_cont("-%08x", dbg_last_kept_tsn); |
1513 | dbg_last_kept_tsn); | ||
1514 | } | 1501 | } |
1515 | 1502 | ||
1516 | SCTP_DEBUG_PRINTK_CONT("\n"); | 1503 | pr_cont("\n"); |
1517 | |||
1518 | /* FALL THROUGH... */ | 1504 | /* FALL THROUGH... */ |
1519 | default: | 1505 | default: |
1520 | /* This is the first-ever TSN we examined. */ | 1506 | /* This is the first-ever TSN we examined. */ |
1521 | /* Start a new range of ACK-ed TSNs. */ | 1507 | /* Start a new range of ACK-ed TSNs. */ |
1522 | SCTP_DEBUG_PRINTK("ACKed: %08x", tsn); | 1508 | pr_debug("ACKed: %08x", tsn); |
1509 | |||
1523 | dbg_prt_state = 0; | 1510 | dbg_prt_state = 0; |
1524 | dbg_ack_tsn = tsn; | 1511 | dbg_ack_tsn = tsn; |
1525 | } | 1512 | } |
1526 | 1513 | ||
1527 | dbg_last_ack_tsn = tsn; | 1514 | dbg_last_ack_tsn = tsn; |
1528 | #endif /* SCTP_DEBUG */ | 1515 | #endif /* CONFIG_SCTP_DBG_TSNS */ |
1529 | 1516 | ||
1530 | } else { | 1517 | } else { |
1531 | if (tchunk->tsn_gap_acked) { | 1518 | if (tchunk->tsn_gap_acked) { |
1532 | SCTP_DEBUG_PRINTK("%s: Receiver reneged on " | 1519 | pr_debug("%s: receiver reneged on data TSN:0x%x\n", |
1533 | "data TSN: 0x%x\n", | 1520 | __func__, tsn); |
1534 | __func__, | 1521 | |
1535 | tsn); | ||
1536 | tchunk->tsn_gap_acked = 0; | 1522 | tchunk->tsn_gap_acked = 0; |
1537 | 1523 | ||
1538 | if (tchunk->transport) | 1524 | if (tchunk->transport) |
@@ -1552,7 +1538,7 @@ static void sctp_check_transmitted(struct sctp_outq *q, | |||
1552 | 1538 | ||
1553 | list_add_tail(lchunk, &tlist); | 1539 | list_add_tail(lchunk, &tlist); |
1554 | 1540 | ||
1555 | #if SCTP_DEBUG | 1541 | #ifdef CONFIG_SCTP_DBG_TSNS |
1556 | /* See the above comments on ACK-ed TSNs. */ | 1542 | /* See the above comments on ACK-ed TSNs. */ |
1557 | switch (dbg_prt_state) { | 1543 | switch (dbg_prt_state) { |
1558 | case 1: | 1544 | case 1: |
@@ -1560,50 +1546,47 @@ static void sctp_check_transmitted(struct sctp_outq *q, | |||
1560 | break; | 1546 | break; |
1561 | 1547 | ||
1562 | if (dbg_last_kept_tsn != dbg_kept_tsn) | 1548 | if (dbg_last_kept_tsn != dbg_kept_tsn) |
1563 | SCTP_DEBUG_PRINTK_CONT("-%08x", | 1549 | pr_cont("-%08x", dbg_last_kept_tsn); |
1564 | dbg_last_kept_tsn); | ||
1565 | 1550 | ||
1566 | SCTP_DEBUG_PRINTK_CONT(",%08x", tsn); | 1551 | pr_cont(",%08x", tsn); |
1567 | dbg_kept_tsn = tsn; | 1552 | dbg_kept_tsn = tsn; |
1568 | break; | 1553 | break; |
1569 | 1554 | ||
1570 | case 0: | 1555 | case 0: |
1571 | if (dbg_last_ack_tsn != dbg_ack_tsn) | 1556 | if (dbg_last_ack_tsn != dbg_ack_tsn) |
1572 | SCTP_DEBUG_PRINTK_CONT("-%08x", | 1557 | pr_cont("-%08x", dbg_last_ack_tsn); |
1573 | dbg_last_ack_tsn); | ||
1574 | SCTP_DEBUG_PRINTK_CONT("\n"); | ||
1575 | 1558 | ||
1559 | pr_cont("\n"); | ||
1576 | /* FALL THROUGH... */ | 1560 | /* FALL THROUGH... */ |
1577 | default: | 1561 | default: |
1578 | SCTP_DEBUG_PRINTK("KEPT: %08x",tsn); | 1562 | pr_debug("KEPT: %08x", tsn); |
1563 | |||
1579 | dbg_prt_state = 1; | 1564 | dbg_prt_state = 1; |
1580 | dbg_kept_tsn = tsn; | 1565 | dbg_kept_tsn = tsn; |
1581 | } | 1566 | } |
1582 | 1567 | ||
1583 | dbg_last_kept_tsn = tsn; | 1568 | dbg_last_kept_tsn = tsn; |
1584 | #endif /* SCTP_DEBUG */ | 1569 | #endif /* CONFIG_SCTP_DBG_TSNS */ |
1585 | } | 1570 | } |
1586 | } | 1571 | } |
1587 | 1572 | ||
1588 | #if SCTP_DEBUG | 1573 | #ifdef CONFIG_SCTP_DBG_TSNS |
1589 | /* Finish off the last range, displaying its ending TSN. */ | 1574 | /* Finish off the last range, displaying its ending TSN. */ |
1590 | switch (dbg_prt_state) { | 1575 | switch (dbg_prt_state) { |
1591 | case 0: | 1576 | case 0: |
1592 | if (dbg_last_ack_tsn != dbg_ack_tsn) { | 1577 | if (dbg_last_ack_tsn != dbg_ack_tsn) |
1593 | SCTP_DEBUG_PRINTK_CONT("-%08x\n", dbg_last_ack_tsn); | 1578 | pr_cont("-%08x\n", dbg_last_ack_tsn); |
1594 | } else { | 1579 | else |
1595 | SCTP_DEBUG_PRINTK_CONT("\n"); | 1580 | pr_cont("\n"); |
1596 | } | 1581 | break; |
1597 | break; | ||
1598 | |||
1599 | case 1: | 1582 | case 1: |
1600 | if (dbg_last_kept_tsn != dbg_kept_tsn) { | 1583 | if (dbg_last_kept_tsn != dbg_kept_tsn) |
1601 | SCTP_DEBUG_PRINTK_CONT("-%08x\n", dbg_last_kept_tsn); | 1584 | pr_cont("-%08x\n", dbg_last_kept_tsn); |
1602 | } else { | 1585 | else |
1603 | SCTP_DEBUG_PRINTK_CONT("\n"); | 1586 | pr_cont("\n"); |
1604 | } | 1587 | break; |
1605 | } | 1588 | } |
1606 | #endif /* SCTP_DEBUG */ | 1589 | #endif /* CONFIG_SCTP_DBG_TSNS */ |
1607 | if (transport) { | 1590 | if (transport) { |
1608 | if (bytes_acked) { | 1591 | if (bytes_acked) { |
1609 | struct sctp_association *asoc = transport->asoc; | 1592 | struct sctp_association *asoc = transport->asoc; |
@@ -1676,9 +1659,9 @@ static void sctp_check_transmitted(struct sctp_outq *q, | |||
1676 | !list_empty(&tlist) && | 1659 | !list_empty(&tlist) && |
1677 | (sack_ctsn+2 == q->asoc->next_tsn) && | 1660 | (sack_ctsn+2 == q->asoc->next_tsn) && |
1678 | q->asoc->state < SCTP_STATE_SHUTDOWN_PENDING) { | 1661 | q->asoc->state < SCTP_STATE_SHUTDOWN_PENDING) { |
1679 | SCTP_DEBUG_PRINTK("%s: SACK received for zero " | 1662 | pr_debug("%s: sack received for zero window " |
1680 | "window probe: %u\n", | 1663 | "probe:%u\n", __func__, sack_ctsn); |
1681 | __func__, sack_ctsn); | 1664 | |
1682 | q->asoc->overall_error_count = 0; | 1665 | q->asoc->overall_error_count = 0; |
1683 | transport->error_count = 0; | 1666 | transport->error_count = 0; |
1684 | } | 1667 | } |
@@ -1739,10 +1722,8 @@ static void sctp_mark_missing(struct sctp_outq *q, | |||
1739 | count_of_newacks, tsn)) { | 1722 | count_of_newacks, tsn)) { |
1740 | chunk->tsn_missing_report++; | 1723 | chunk->tsn_missing_report++; |
1741 | 1724 | ||
1742 | SCTP_DEBUG_PRINTK( | 1725 | pr_debug("%s: tsn:0x%x missing counter:%d\n", |
1743 | "%s: TSN 0x%x missing counter: %d\n", | 1726 | __func__, tsn, chunk->tsn_missing_report); |
1744 | __func__, tsn, | ||
1745 | chunk->tsn_missing_report); | ||
1746 | } | 1727 | } |
1747 | } | 1728 | } |
1748 | /* | 1729 | /* |
@@ -1762,11 +1743,10 @@ static void sctp_mark_missing(struct sctp_outq *q, | |||
1762 | if (do_fast_retransmit) | 1743 | if (do_fast_retransmit) |
1763 | sctp_retransmit(q, transport, SCTP_RTXR_FAST_RTX); | 1744 | sctp_retransmit(q, transport, SCTP_RTXR_FAST_RTX); |
1764 | 1745 | ||
1765 | SCTP_DEBUG_PRINTK("%s: transport: %p, cwnd: %d, " | 1746 | pr_debug("%s: transport:%p, cwnd:%d, ssthresh:%d, " |
1766 | "ssthresh: %d, flight_size: %d, pba: %d\n", | 1747 | "flight_size:%d, pba:%d\n", __func__, transport, |
1767 | __func__, transport, transport->cwnd, | 1748 | transport->cwnd, transport->ssthresh, |
1768 | transport->ssthresh, transport->flight_size, | 1749 | transport->flight_size, transport->partial_bytes_acked); |
1769 | transport->partial_bytes_acked); | ||
1770 | } | 1750 | } |
1771 | } | 1751 | } |
1772 | 1752 | ||