qeth: remove EDDP
Performance measurements showed EDDP does not lower CPU costs but increase them. So we dump out EDDP code from qeth driver. Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
f61a0d0538
commit
64ef895798
@@ -21,7 +21,6 @@
|
||||
#include <linux/ip.h>
|
||||
|
||||
#include "qeth_core.h"
|
||||
#include "qeth_core_offl.h"
|
||||
|
||||
static int qeth_l2_set_offline(struct ccwgroup_device *);
|
||||
static int qeth_l2_stop(struct net_device *);
|
||||
@@ -634,8 +633,6 @@ static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
struct qeth_qdio_out_q *queue = card->qdio.out_qs
|
||||
[qeth_get_priority_queue(card, skb, ipv, cast_type)];
|
||||
int tx_bytes = skb->len;
|
||||
enum qeth_large_send_types large_send = QETH_LARGE_SEND_NO;
|
||||
struct qeth_eddp_context *ctx = NULL;
|
||||
int data_offset = -1;
|
||||
int elements_needed = 0;
|
||||
int hd_len = 0;
|
||||
@@ -655,14 +652,10 @@ static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
}
|
||||
netif_stop_queue(dev);
|
||||
|
||||
if (skb_is_gso(skb))
|
||||
large_send = QETH_LARGE_SEND_EDDP;
|
||||
|
||||
if (card->info.type == QETH_CARD_TYPE_OSN)
|
||||
hdr = (struct qeth_hdr *)skb->data;
|
||||
else {
|
||||
if ((card->info.type == QETH_CARD_TYPE_IQD) && (!large_send) &&
|
||||
(skb_shinfo(skb)->nr_frags == 0)) {
|
||||
if (card->info.type == QETH_CARD_TYPE_IQD) {
|
||||
new_skb = skb;
|
||||
data_offset = ETH_HLEN;
|
||||
hd_len = ETH_HLEN;
|
||||
@@ -689,62 +682,26 @@ static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
}
|
||||
}
|
||||
|
||||
if (large_send == QETH_LARGE_SEND_EDDP) {
|
||||
ctx = qeth_eddp_create_context(card, new_skb, hdr,
|
||||
skb->sk->sk_protocol);
|
||||
if (ctx == NULL) {
|
||||
QETH_DBF_MESSAGE(2, "could not create eddp context\n");
|
||||
goto tx_drop;
|
||||
}
|
||||
} else {
|
||||
elements = qeth_get_elements_no(card, (void *)hdr, new_skb,
|
||||
elements = qeth_get_elements_no(card, (void *)hdr, new_skb,
|
||||
elements_needed);
|
||||
if (!elements) {
|
||||
if (data_offset >= 0)
|
||||
kmem_cache_free(qeth_core_header_cache, hdr);
|
||||
goto tx_drop;
|
||||
}
|
||||
}
|
||||
|
||||
if ((large_send == QETH_LARGE_SEND_NO) &&
|
||||
(skb->ip_summed == CHECKSUM_PARTIAL)) {
|
||||
qeth_tx_csum(new_skb);
|
||||
if (card->options.performance_stats)
|
||||
card->perf_stats.tx_csum++;
|
||||
if (!elements) {
|
||||
if (data_offset >= 0)
|
||||
kmem_cache_free(qeth_core_header_cache, hdr);
|
||||
goto tx_drop;
|
||||
}
|
||||
|
||||
if (card->info.type != QETH_CARD_TYPE_IQD)
|
||||
rc = qeth_do_send_packet(card, queue, new_skb, hdr,
|
||||
elements, ctx);
|
||||
elements);
|
||||
else
|
||||
rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr,
|
||||
elements, ctx, data_offset, hd_len);
|
||||
elements, data_offset, hd_len);
|
||||
if (!rc) {
|
||||
card->stats.tx_packets++;
|
||||
card->stats.tx_bytes += tx_bytes;
|
||||
if (new_skb != skb)
|
||||
dev_kfree_skb_any(skb);
|
||||
if (card->options.performance_stats) {
|
||||
if (large_send != QETH_LARGE_SEND_NO) {
|
||||
card->perf_stats.large_send_bytes += tx_bytes;
|
||||
card->perf_stats.large_send_cnt++;
|
||||
}
|
||||
if (skb_shinfo(new_skb)->nr_frags > 0) {
|
||||
card->perf_stats.sg_skbs_sent++;
|
||||
/* nr_frags + skb->data */
|
||||
card->perf_stats.sg_frags_sent +=
|
||||
skb_shinfo(new_skb)->nr_frags + 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (ctx != NULL) {
|
||||
qeth_eddp_put_context(ctx);
|
||||
dev_kfree_skb_any(new_skb);
|
||||
}
|
||||
} else {
|
||||
if (ctx != NULL)
|
||||
qeth_eddp_put_context(ctx);
|
||||
|
||||
if (data_offset >= 0)
|
||||
kmem_cache_free(qeth_core_header_cache, hdr);
|
||||
|
||||
@@ -881,30 +838,8 @@ static void qeth_l2_remove_device(struct ccwgroup_device *cgdev)
|
||||
return;
|
||||
}
|
||||
|
||||
static int qeth_l2_ethtool_set_tso(struct net_device *dev, u32 data)
|
||||
{
|
||||
struct qeth_card *card = dev->ml_priv;
|
||||
|
||||
if (data) {
|
||||
if (card->options.large_send == QETH_LARGE_SEND_NO) {
|
||||
card->options.large_send = QETH_LARGE_SEND_EDDP;
|
||||
dev->features |= NETIF_F_TSO;
|
||||
}
|
||||
} else {
|
||||
dev->features &= ~NETIF_F_TSO;
|
||||
card->options.large_send = QETH_LARGE_SEND_NO;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct ethtool_ops qeth_l2_ethtool_ops = {
|
||||
.get_link = ethtool_op_get_link,
|
||||
.get_tx_csum = ethtool_op_get_tx_csum,
|
||||
.set_tx_csum = ethtool_op_set_tx_hw_csum,
|
||||
.get_sg = ethtool_op_get_sg,
|
||||
.set_sg = ethtool_op_set_sg,
|
||||
.get_tso = ethtool_op_get_tso,
|
||||
.set_tso = qeth_l2_ethtool_set_tso,
|
||||
.get_strings = qeth_core_get_strings,
|
||||
.get_ethtool_stats = qeth_core_get_ethtool_stats,
|
||||
.get_stats_count = qeth_core_get_stats_count,
|
||||
|
Reference in New Issue
Block a user