bna: Fix for TX queue
Change Details: - Call netif_wake_queue() if we have freed up sufficient elements at the end of completion processing - Add netif_queue_stopped counter back to bnad_drv_stats {} - Get netif_queue_stopped value from stack - Remove BUG_ON() on value returned by pci_unmap_addr() Signed-off-by: Debashis Dutt <ddutt@brocade.com> Signed-off-by: Rasesh Mody <rmody@brocade.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
886f7fedb0
commit
f7c0fa4cd5
@@ -109,7 +109,7 @@ static void
|
|||||||
bnad_free_all_txbufs(struct bnad *bnad,
|
bnad_free_all_txbufs(struct bnad *bnad,
|
||||||
struct bna_tcb *tcb)
|
struct bna_tcb *tcb)
|
||||||
{
|
{
|
||||||
u16 unmap_cons;
|
u32 unmap_cons;
|
||||||
struct bnad_unmap_q *unmap_q = tcb->unmap_q;
|
struct bnad_unmap_q *unmap_q = tcb->unmap_q;
|
||||||
struct bnad_skb_unmap *unmap_array;
|
struct bnad_skb_unmap *unmap_array;
|
||||||
struct sk_buff *skb = NULL;
|
struct sk_buff *skb = NULL;
|
||||||
@@ -244,7 +244,7 @@ bnad_tx_free_tasklet(unsigned long bnad_ptr)
|
|||||||
{
|
{
|
||||||
struct bnad *bnad = (struct bnad *)bnad_ptr;
|
struct bnad *bnad = (struct bnad *)bnad_ptr;
|
||||||
struct bna_tcb *tcb;
|
struct bna_tcb *tcb;
|
||||||
u32 acked;
|
u32 acked = 0;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
for (i = 0; i < bnad->num_tx; i++) {
|
for (i = 0; i < bnad->num_tx; i++) {
|
||||||
@@ -263,6 +263,20 @@ bnad_tx_free_tasklet(unsigned long bnad_ptr)
|
|||||||
smp_mb__before_clear_bit();
|
smp_mb__before_clear_bit();
|
||||||
clear_bit(BNAD_TXQ_FREE_SENT, &tcb->flags);
|
clear_bit(BNAD_TXQ_FREE_SENT, &tcb->flags);
|
||||||
}
|
}
|
||||||
|
if (unlikely(!test_bit(BNAD_TXQ_TX_STARTED,
|
||||||
|
&tcb->flags)))
|
||||||
|
continue;
|
||||||
|
if (netif_queue_stopped(bnad->netdev)) {
|
||||||
|
if (acked && netif_carrier_ok(bnad->netdev) &&
|
||||||
|
BNA_QE_FREE_CNT(tcb, tcb->q_depth) >=
|
||||||
|
BNAD_NETIF_WAKE_THRESHOLD) {
|
||||||
|
netif_wake_queue(bnad->netdev);
|
||||||
|
/* TODO */
|
||||||
|
/* Counters for individual TxQs? */
|
||||||
|
BNAD_UPDATE_CTR(bnad,
|
||||||
|
netif_queue_wakeup);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -334,8 +348,6 @@ bnad_free_all_rxbufs(struct bnad *bnad, struct bna_rcb *rcb)
|
|||||||
skb = unmap_q->unmap_array[unmap_cons].skb;
|
skb = unmap_q->unmap_array[unmap_cons].skb;
|
||||||
if (!skb)
|
if (!skb)
|
||||||
continue;
|
continue;
|
||||||
BUG_ON(!(pci_unmap_addr(
|
|
||||||
&unmap_q->unmap_array[unmap_cons], dma_addr)));
|
|
||||||
unmap_q->unmap_array[unmap_cons].skb = NULL;
|
unmap_q->unmap_array[unmap_cons].skb = NULL;
|
||||||
pci_unmap_single(bnad->pcidev, pci_unmap_addr(&unmap_q->
|
pci_unmap_single(bnad->pcidev, pci_unmap_addr(&unmap_q->
|
||||||
unmap_array[unmap_cons],
|
unmap_array[unmap_cons],
|
||||||
|
@@ -126,6 +126,7 @@ struct bnad_completion {
|
|||||||
struct bnad_drv_stats {
|
struct bnad_drv_stats {
|
||||||
u64 netif_queue_stop;
|
u64 netif_queue_stop;
|
||||||
u64 netif_queue_wakeup;
|
u64 netif_queue_wakeup;
|
||||||
|
u64 netif_queue_stopped;
|
||||||
u64 tso4;
|
u64 tso4;
|
||||||
u64 tso6;
|
u64 tso6;
|
||||||
u64 tso_err;
|
u64 tso_err;
|
||||||
@@ -308,8 +309,10 @@ extern void bnad_cleanup_rx(struct bnad *bnad, uint rx_id);
|
|||||||
extern void bnad_dim_timer_start(struct bnad *bnad);
|
extern void bnad_dim_timer_start(struct bnad *bnad);
|
||||||
|
|
||||||
/* Statistics */
|
/* Statistics */
|
||||||
extern void bnad_netdev_qstats_fill(struct bnad *bnad, struct rtnl_link_stats64 *stats);
|
extern void bnad_netdev_qstats_fill(struct bnad *bnad,
|
||||||
extern void bnad_netdev_hwstats_fill(struct bnad *bnad, struct rtnl_link_stats64 *stats);
|
struct rtnl_link_stats64 *stats);
|
||||||
|
extern void bnad_netdev_hwstats_fill(struct bnad *bnad,
|
||||||
|
struct rtnl_link_stats64 *stats);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MACROS
|
* MACROS
|
||||||
|
@@ -68,6 +68,7 @@ static char *bnad_net_stats_strings[BNAD_ETHTOOL_STATS_NUM] = {
|
|||||||
|
|
||||||
"netif_queue_stop",
|
"netif_queue_stop",
|
||||||
"netif_queue_wakeup",
|
"netif_queue_wakeup",
|
||||||
|
"netif_queue_stopped",
|
||||||
"tso4",
|
"tso4",
|
||||||
"tso6",
|
"tso6",
|
||||||
"tso_err",
|
"tso_err",
|
||||||
@@ -1180,6 +1181,9 @@ bnad_get_ethtool_stats(struct net_device *netdev, struct ethtool_stats *stats,
|
|||||||
|
|
||||||
bi = sizeof(*net_stats64) / sizeof(u64);
|
bi = sizeof(*net_stats64) / sizeof(u64);
|
||||||
|
|
||||||
|
/* Get netif_queue_stopped from stack */
|
||||||
|
bnad->stats.drv_stats.netif_queue_stopped = netif_queue_stopped(netdev);
|
||||||
|
|
||||||
/* Fill driver stats into ethtool buffers */
|
/* Fill driver stats into ethtool buffers */
|
||||||
stats64 = (u64 *)&bnad->stats.drv_stats;
|
stats64 = (u64 *)&bnad->stats.drv_stats;
|
||||||
for (i = 0; i < sizeof(struct bnad_drv_stats) / sizeof(u64); i++)
|
for (i = 0; i < sizeof(struct bnad_drv_stats) / sizeof(u64); i++)
|
||||||
|
Reference in New Issue
Block a user