Skip to content

Commit 121c667

Browse files
cappe987davem330
authored andcommitted
net: microchip: sparx5: correctly free skb in xmit
consume_skb on transmitted, kfree_skb on dropped, do not free on TX_BUSY. Previously the xmit function could return -EBUSY without freeing, which supposedly is interpreted as a drop. And was using kfree on successfully transmitted packets. sparx5_fdma_xmit and sparx5_inject returns error code, where -EBUSY indicates TX_BUSY and any other error code indicates dropped. Fixes: f3cad26 ("net: sparx5: add hostmode with phylink support") Signed-off-by: Casper Andersson <[email protected]> Reviewed-by: Horatiu Vultur <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent fbf33f5 commit 121c667

File tree

2 files changed

+25
-18
lines changed

2 files changed

+25
-18
lines changed

drivers/net/ethernet/microchip/sparx5/sparx5_fdma.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ int sparx5_fdma_xmit(struct sparx5 *sparx5, u32 *ifh, struct sk_buff *skb)
317317
next_dcb_hw = sparx5_fdma_next_dcb(tx, tx->curr_entry);
318318
db_hw = &next_dcb_hw->db[0];
319319
if (!(db_hw->status & FDMA_DCB_STATUS_DONE))
320-
tx->dropped++;
320+
return -EINVAL;
321321
db = list_first_entry(&tx->db_list, struct sparx5_db, list);
322322
list_move_tail(&db->list, &tx->db_list);
323323
next_dcb_hw->nextptr = FDMA_DCB_INVALID_DATA;

drivers/net/ethernet/microchip/sparx5/sparx5_packet.c

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -234,9 +234,8 @@ netdev_tx_t sparx5_port_xmit_impl(struct sk_buff *skb, struct net_device *dev)
234234
sparx5_set_port_ifh(ifh, port->portno);
235235

236236
if (sparx5->ptp && skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) {
237-
ret = sparx5_ptp_txtstamp_request(port, skb);
238-
if (ret)
239-
return ret;
237+
if (sparx5_ptp_txtstamp_request(port, skb) < 0)
238+
return NETDEV_TX_BUSY;
240239

241240
sparx5_set_port_ifh_rew_op(ifh, SPARX5_SKB_CB(skb)->rew_op);
242241
sparx5_set_port_ifh_pdu_type(ifh, SPARX5_SKB_CB(skb)->pdu_type);
@@ -250,23 +249,31 @@ netdev_tx_t sparx5_port_xmit_impl(struct sk_buff *skb, struct net_device *dev)
250249
else
251250
ret = sparx5_inject(sparx5, ifh, skb, dev);
252251

253-
if (ret == NETDEV_TX_OK) {
254-
stats->tx_bytes += skb->len;
255-
stats->tx_packets++;
252+
if (ret == -EBUSY)
253+
goto busy;
254+
if (ret < 0)
255+
goto drop;
256256

257-
if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP &&
258-
SPARX5_SKB_CB(skb)->rew_op == IFH_REW_OP_TWO_STEP_PTP)
259-
return ret;
257+
stats->tx_bytes += skb->len;
258+
stats->tx_packets++;
259+
sparx5->tx.packets++;
260260

261-
dev_kfree_skb_any(skb);
262-
} else {
263-
stats->tx_dropped++;
261+
if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP &&
262+
SPARX5_SKB_CB(skb)->rew_op == IFH_REW_OP_TWO_STEP_PTP)
263+
return NETDEV_TX_OK;
264264

265-
if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP &&
266-
SPARX5_SKB_CB(skb)->rew_op == IFH_REW_OP_TWO_STEP_PTP)
267-
sparx5_ptp_txtstamp_release(port, skb);
268-
}
269-
return ret;
265+
dev_consume_skb_any(skb);
266+
return NETDEV_TX_OK;
267+
drop:
268+
stats->tx_dropped++;
269+
sparx5->tx.dropped++;
270+
dev_kfree_skb_any(skb);
271+
return NETDEV_TX_OK;
272+
busy:
273+
if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP &&
274+
SPARX5_SKB_CB(skb)->rew_op == IFH_REW_OP_TWO_STEP_PTP)
275+
sparx5_ptp_txtstamp_release(port, skb);
276+
return NETDEV_TX_BUSY;
270277
}
271278

272279
static enum hrtimer_restart sparx5_injection_timeout(struct hrtimer *tmr)

0 commit comments

Comments
 (0)