[PATCH] s390: lcs performance enhancements

[patch 1/2] s390: lcs performance enhancements

From: Klaus Wacker <kdwacker@de.ibm.com>
- When flood pinging (with large packet size) an LCS device,
about 90 % of all packets are dropped by driver.
- increased number of lcs IO buffers to 32.
- use netif_stop_queue/netif_wake_queue in lcs_start_xmit routine
- don't lock the whole xmit routine but just the piece of code where
tx_buffer is touched.

Signed-off-by: Frank Pavlic <fpavlic@de.ibm.com>

diffstat:
lcs.c | 31 +++++++++++++++++--------------
lcs.h | 2 +-
2 files changed, 18 insertions(+), 15 deletions(-)
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>

authored by Frank Pavlic and committed by Jeff Garzik 0d613a27 ca5b0ec8

+18 -15
+17 -14
drivers/s390/net/lcs.c
··· 98 98 return -ENOMEM; 99 99 } 100 100 debug_register_view(lcs_dbf_setup, &debug_hex_ascii_view); 101 - debug_set_level(lcs_dbf_setup, 4); 101 + debug_set_level(lcs_dbf_setup, 2); 102 102 debug_register_view(lcs_dbf_trace, &debug_hex_ascii_view); 103 - debug_set_level(lcs_dbf_trace, 4); 103 + debug_set_level(lcs_dbf_trace, 2); 104 104 return 0; 105 105 } 106 106 ··· 1292 1292 LCS_DBF_TEXT(4, trace, "setmulti"); 1293 1293 card = (struct lcs_card *) dev->priv; 1294 1294 1295 - if (!lcs_set_thread_start_bit(card, LCS_SET_MC_THREAD)) { 1295 + if (!lcs_set_thread_start_bit(card, LCS_SET_MC_THREAD)) 1296 1296 schedule_work(&card->kernel_thread_starter); 1297 - } 1298 1297 } 1299 1298 1300 1299 #endif /* CONFIG_IP_MULTICAST */ ··· 1458 1459 lcs_release_buffer(channel, buffer); 1459 1460 card = (struct lcs_card *) 1460 1461 ((char *) channel - offsetof(struct lcs_card, write)); 1462 + if (netif_queue_stopped(card->dev)) 1463 + netif_wake_queue(card->dev); 1461 1464 spin_lock(&card->lock); 1462 1465 card->tx_emitted--; 1463 1466 if (card->tx_emitted <= 0 && card->tx_buffer != NULL) ··· 1479 1478 struct net_device *dev) 1480 1479 { 1481 1480 struct lcs_header *header; 1481 + int rc = 0; 1482 1482 1483 1483 LCS_DBF_TEXT(5, trace, "hardxmit"); 1484 1484 if (skb == NULL) { ··· 1494 1492 card->stats.tx_carrier_errors++; 1495 1493 return 0; 1496 1494 } 1497 - if (netif_queue_stopped(dev) ) { 1498 - card->stats.tx_dropped++; 1499 - return -EBUSY; 1500 - } 1495 + netif_stop_queue(card->dev); 1496 + spin_lock(&card->lock); 1501 1497 if (card->tx_buffer != NULL && 1502 1498 card->tx_buffer->count + sizeof(struct lcs_header) + 1503 1499 skb->len + sizeof(u16) > LCS_IOBUFFERSIZE) ··· 1506 1506 card->tx_buffer = lcs_get_buffer(&card->write); 1507 1507 if (card->tx_buffer == NULL) { 1508 1508 card->stats.tx_dropped++; 1509 - return -EBUSY; 1509 + rc = -EBUSY; 1510 + goto out; 1510 1511 } 1511 1512 card->tx_buffer->callback = lcs_txbuffer_cb; 1512 1513 card->tx_buffer->count = 0; ··· 1519 1518 header->type = card->lan_type; 1520 1519 header->slot = card->portno; 1521 1520 memcpy(header + 1, skb->data, skb->len); 1521 + spin_unlock(&card->lock); 1522 1522 card->stats.tx_bytes += skb->len; 1523 1523 card->stats.tx_packets++; 1524 1524 dev_kfree_skb(skb); 1525 - if (card->tx_emitted <= 0) 1525 + netif_wake_queue(card->dev); 1526 + spin_lock(&card->lock); 1527 + if (card->tx_emitted <= 0 && card->tx_buffer != NULL) 1526 1528 /* If this is the first tx buffer emit it immediately. */ 1527 1529 __lcs_emit_txbuffer(card); 1528 - return 0; 1530 + out: 1531 + spin_unlock(&card->lock); 1532 + return rc; 1529 1533 } 1530 1534 1531 1535 static int ··· 1541 1535 1542 1536 LCS_DBF_TEXT(5, trace, "pktxmit"); 1543 1537 card = (struct lcs_card *) dev->priv; 1544 - spin_lock(&card->lock); 1545 1538 rc = __lcs_start_xmit(card, skb, dev); 1546 - spin_unlock(&card->lock); 1547 1539 return rc; 1548 1540 } 1549 1541 ··· 2323 2319 PRINT_ERR("Initialization failed\n"); 2324 2320 return rc; 2325 2321 } 2326 - 2327 2322 return 0; 2328 2323 } 2329 2324
+1 -1
drivers/s390/net/lcs.h
··· 95 95 */ 96 96 #define LCS_ILLEGAL_OFFSET 0xffff 97 97 #define LCS_IOBUFFERSIZE 0x5000 98 - #define LCS_NUM_BUFFS 8 /* needs to be power of 2 */ 98 + #define LCS_NUM_BUFFS 32 /* needs to be power of 2 */ 99 99 #define LCS_MAC_LENGTH 6 100 100 #define LCS_INVALID_PORT_NO -1 101 101 #define LCS_LANCMD_TIMEOUT_DEFAULT 5