netxen: optimize tx handling
netxen driver allows limited number of threads simultaneously posting skb's in tx ring. If transmit slot is unavailable, driver calls schedule() or loops in xmit_frame(). This patch returns TX_BUSY and lets the stack reschedule the packet if transmit slot is unavailable. Also removes unnecessary check for tx timeout in the driver itself, the network stack does that anyway. Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
committed by
Jeff Garzik
parent
72b0a7a8a4
commit
53a01e00f8
@ -1248,7 +1248,6 @@ int netxen_process_cmd_ring(unsigned long data)
|
||||
struct pci_dev *pdev;
|
||||
struct netxen_skb_frag *frag;
|
||||
u32 i;
|
||||
struct sk_buff *skb = NULL;
|
||||
int done;
|
||||
|
||||
spin_lock(&adapter->tx_lock);
|
||||
@ -1278,9 +1277,8 @@ int netxen_process_cmd_ring(unsigned long data)
|
||||
while ((last_consumer != consumer) && (count1 < MAX_STATUS_HANDLE)) {
|
||||
buffer = &adapter->cmd_buf_arr[last_consumer];
|
||||
pdev = adapter->pdev;
|
||||
frag = &buffer->frag_array[0];
|
||||
skb = buffer->skb;
|
||||
if (skb && (cmpxchg(&buffer->skb, skb, 0) == skb)) {
|
||||
if (buffer->skb) {
|
||||
frag = &buffer->frag_array[0];
|
||||
pci_unmap_single(pdev, frag->dma, frag->length,
|
||||
PCI_DMA_TODEVICE);
|
||||
frag->dma = 0ULL;
|
||||
@ -1293,8 +1291,8 @@ int netxen_process_cmd_ring(unsigned long data)
|
||||
}
|
||||
|
||||
adapter->stats.skbfreed++;
|
||||
dev_kfree_skb_any(skb);
|
||||
skb = NULL;
|
||||
dev_kfree_skb_any(buffer->skb);
|
||||
buffer->skb = NULL;
|
||||
} else if (adapter->proc_cmd_buf_counter == 1) {
|
||||
adapter->stats.txnullskb++;
|
||||
}
|
||||
|
Reference in New Issue
Block a user