Skip to content

Commit

Permalink
ibmvnic: Free skb's in cases of failure in transmit
Browse files Browse the repository at this point in the history
When an error is encountered during transmit we need to free the
skb instead of returning TX_BUSY.

Signed-off-by: Thomas Falcon <tlfalcon@linux.vnet.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Thomas Falcon authored and David S. Miller committed Apr 24, 2017
1 parent 3ca1993 commit 7f5b030
Showing 1 changed file with 15 additions and 3 deletions.
18 changes: 15 additions & 3 deletions drivers/net/ethernet/ibm/ibmvnic.c
Original file line number Diff line number Diff line change
Expand Up @@ -908,9 +908,13 @@ static int ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
be32_to_cpu(adapter->login_rsp_buf->
off_txsubm_subcrqs));
if (adapter->migrated) {
if (!netif_subqueue_stopped(netdev, skb))
netif_stop_subqueue(netdev, queue_num);
dev_kfree_skb_any(skb);

tx_send_failed++;
tx_dropped++;
ret = NETDEV_TX_BUSY;
ret = NETDEV_TX_OK;
goto out;
}

Expand Down Expand Up @@ -976,11 +980,13 @@ static int ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
sizeof(tx_buff->indir_arr),
DMA_TO_DEVICE);
if (dma_mapping_error(dev, tx_buff->indir_dma)) {
dev_kfree_skb_any(skb);
tx_buff->skb = NULL;
if (!firmware_has_feature(FW_FEATURE_CMO))
dev_err(dev, "tx: unable to map descriptor array\n");
tx_map_failed++;
tx_dropped++;
ret = NETDEV_TX_BUSY;
ret = NETDEV_TX_OK;
goto out;
}
lpar_rc = send_subcrq_indirect(adapter, handle_array[queue_num],
Expand All @@ -999,9 +1005,15 @@ static int ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
else
tx_pool->consumer_index--;

dev_kfree_skb_any(skb);
tx_buff->skb = NULL;

if (lpar_rc == H_CLOSED)
netif_stop_subqueue(netdev, queue_num);

tx_send_failed++;
tx_dropped++;
ret = NETDEV_TX_BUSY;
ret = NETDEV_TX_OK;
goto out;
}

Expand Down

0 comments on commit 7f5b030

Please sign in to comment.