Commit 96659828 authored by Amit Kumar Salecha's avatar Amit Kumar Salecha Committed by David S. Miller

qlcnic: cleanup skb allocation

No need to maintian separate state for alloced and freed skb.
This can be done by null check.
Signed-off-by: default avatarAmit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 406818ff
...@@ -381,7 +381,6 @@ struct qlcnic_rx_buffer { ...@@ -381,7 +381,6 @@ struct qlcnic_rx_buffer {
struct sk_buff *skb; struct sk_buff *skb;
u64 dma; u64 dma;
u16 ref_handle; u16 ref_handle;
u16 state;
}; };
/* Board types */ /* Board types */
...@@ -423,7 +422,6 @@ struct qlcnic_adapter_stats { ...@@ -423,7 +422,6 @@ struct qlcnic_adapter_stats {
u64 xmit_on; u64 xmit_on;
u64 xmit_off; u64 xmit_off;
u64 skb_alloc_failure; u64 skb_alloc_failure;
u64 null_skb;
u64 null_rxbuf; u64 null_rxbuf;
u64 rx_dma_map_error; u64 rx_dma_map_error;
u64 tx_dma_map_error; u64 tx_dma_map_error;
......
...@@ -69,8 +69,6 @@ static const struct qlcnic_stats qlcnic_gstrings_stats[] = { ...@@ -69,8 +69,6 @@ static const struct qlcnic_stats qlcnic_gstrings_stats[] = {
QLC_SIZEOF(stats.xmit_off), QLC_OFF(stats.xmit_off)}, QLC_SIZEOF(stats.xmit_off), QLC_OFF(stats.xmit_off)},
{"skb_alloc_failure", QLC_SIZEOF(stats.skb_alloc_failure), {"skb_alloc_failure", QLC_SIZEOF(stats.skb_alloc_failure),
QLC_OFF(stats.skb_alloc_failure)}, QLC_OFF(stats.skb_alloc_failure)},
{"null skb",
QLC_SIZEOF(stats.null_skb), QLC_OFF(stats.null_skb)},
{"null rxbuf", {"null rxbuf",
QLC_SIZEOF(stats.null_rxbuf), QLC_OFF(stats.null_rxbuf)}, QLC_SIZEOF(stats.null_rxbuf), QLC_OFF(stats.null_rxbuf)},
{"rx dma map error", QLC_SIZEOF(stats.rx_dma_map_error), {"rx dma map error", QLC_SIZEOF(stats.rx_dma_map_error),
......
...@@ -112,14 +112,15 @@ void qlcnic_release_rx_buffers(struct qlcnic_adapter *adapter) ...@@ -112,14 +112,15 @@ void qlcnic_release_rx_buffers(struct qlcnic_adapter *adapter)
rds_ring = &recv_ctx->rds_rings[ring]; rds_ring = &recv_ctx->rds_rings[ring];
for (i = 0; i < rds_ring->num_desc; ++i) { for (i = 0; i < rds_ring->num_desc; ++i) {
rx_buf = &(rds_ring->rx_buf_arr[i]); rx_buf = &(rds_ring->rx_buf_arr[i]);
if (rx_buf->state == QLCNIC_BUFFER_FREE) if (rx_buf->skb == NULL)
continue; continue;
pci_unmap_single(adapter->pdev, pci_unmap_single(adapter->pdev,
rx_buf->dma, rx_buf->dma,
rds_ring->dma_size, rds_ring->dma_size,
PCI_DMA_FROMDEVICE); PCI_DMA_FROMDEVICE);
if (rx_buf->skb != NULL)
dev_kfree_skb_any(rx_buf->skb); dev_kfree_skb_any(rx_buf->skb);
} }
} }
} }
...@@ -266,7 +267,6 @@ int qlcnic_alloc_sw_resources(struct qlcnic_adapter *adapter) ...@@ -266,7 +267,6 @@ int qlcnic_alloc_sw_resources(struct qlcnic_adapter *adapter)
list_add_tail(&rx_buf->list, list_add_tail(&rx_buf->list,
&rds_ring->free_list); &rds_ring->free_list);
rx_buf->ref_handle = i; rx_buf->ref_handle = i;
rx_buf->state = QLCNIC_BUFFER_FREE;
rx_buf++; rx_buf++;
} }
spin_lock_init(&rds_ring->lock); spin_lock_init(&rds_ring->lock);
...@@ -1281,14 +1281,12 @@ qlcnic_alloc_rx_skb(struct qlcnic_adapter *adapter, ...@@ -1281,14 +1281,12 @@ qlcnic_alloc_rx_skb(struct qlcnic_adapter *adapter,
dma_addr_t dma; dma_addr_t dma;
struct pci_dev *pdev = adapter->pdev; struct pci_dev *pdev = adapter->pdev;
buffer->skb = dev_alloc_skb(rds_ring->skb_size); skb = dev_alloc_skb(rds_ring->skb_size);
if (!buffer->skb) { if (!skb) {
adapter->stats.skb_alloc_failure++; adapter->stats.skb_alloc_failure++;
return -ENOMEM; return -ENOMEM;
} }
skb = buffer->skb;
skb_reserve(skb, 2); skb_reserve(skb, 2);
dma = pci_map_single(pdev, skb->data, dma = pci_map_single(pdev, skb->data,
...@@ -1297,13 +1295,11 @@ qlcnic_alloc_rx_skb(struct qlcnic_adapter *adapter, ...@@ -1297,13 +1295,11 @@ qlcnic_alloc_rx_skb(struct qlcnic_adapter *adapter,
if (pci_dma_mapping_error(pdev, dma)) { if (pci_dma_mapping_error(pdev, dma)) {
adapter->stats.rx_dma_map_error++; adapter->stats.rx_dma_map_error++;
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
buffer->skb = NULL;
return -ENOMEM; return -ENOMEM;
} }
buffer->skb = skb; buffer->skb = skb;
buffer->dma = dma; buffer->dma = dma;
buffer->state = QLCNIC_BUFFER_BUSY;
return 0; return 0;
} }
...@@ -1316,14 +1312,15 @@ static struct sk_buff *qlcnic_process_rxbuf(struct qlcnic_adapter *adapter, ...@@ -1316,14 +1312,15 @@ static struct sk_buff *qlcnic_process_rxbuf(struct qlcnic_adapter *adapter,
buffer = &rds_ring->rx_buf_arr[index]; buffer = &rds_ring->rx_buf_arr[index];
if (unlikely(buffer->skb == NULL)) {
WARN_ON(1);
return NULL;
}
pci_unmap_single(adapter->pdev, buffer->dma, rds_ring->dma_size, pci_unmap_single(adapter->pdev, buffer->dma, rds_ring->dma_size,
PCI_DMA_FROMDEVICE); PCI_DMA_FROMDEVICE);
skb = buffer->skb; skb = buffer->skb;
if (!skb) {
adapter->stats.null_skb++;
goto no_skb;
}
if (likely(adapter->rx_csum && cksum == STATUS_CKSUM_OK)) { if (likely(adapter->rx_csum && cksum == STATUS_CKSUM_OK)) {
adapter->stats.csummed++; adapter->stats.csummed++;
...@@ -1335,8 +1332,7 @@ static struct sk_buff *qlcnic_process_rxbuf(struct qlcnic_adapter *adapter, ...@@ -1335,8 +1332,7 @@ static struct sk_buff *qlcnic_process_rxbuf(struct qlcnic_adapter *adapter,
skb->dev = adapter->netdev; skb->dev = adapter->netdev;
buffer->skb = NULL; buffer->skb = NULL;
no_skb:
buffer->state = QLCNIC_BUFFER_FREE;
return skb; return skb;
} }
...@@ -1511,7 +1507,7 @@ qlcnic_process_rcv_ring(struct qlcnic_host_sds_ring *sds_ring, int max) ...@@ -1511,7 +1507,7 @@ qlcnic_process_rcv_ring(struct qlcnic_host_sds_ring *sds_ring, int max)
WARN_ON(desc_cnt > 1); WARN_ON(desc_cnt > 1);
if (rxbuf) if (likely(rxbuf))
list_add_tail(&rxbuf->list, &sds_ring->free_list[ring]); list_add_tail(&rxbuf->list, &sds_ring->free_list[ring]);
else else
adapter->stats.null_rxbuf++; adapter->stats.null_rxbuf++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment