From: Pan Bian <bianpan2...@163.com> Date: Wed, 28 Nov 2018 16:09:45 +0800
> @@ -2754,6 +2754,7 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, > int budget) > netif_err(pdata, rx_err, netdev, > "error in received packet\n"); > dev_kfree_skb(skb); > + skb = NULL; > goto next_packet; > } > > @@ -2806,6 +2807,7 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, > int budget) > netif_err(pdata, rx_err, netdev, > "packet length exceeds configured MTU\n"); > dev_kfree_skb(skb); > + skb = NULL; > goto next_packet; > } > > -- > 2.7.4 If either of these two cases are executed, it means that it must be the case that: !last || context_next is FALSE, therefore the conditional in the tail code of this function: /* Check if we need to save state before leaving */ if (received && (!last || context_next)) { rdata = XGBE_GET_DESC_DATA(ring, ring->cur); rdata->state_saved = 1; rdata->state.skb = skb; rdata->state.len = len; rdata->state.error = error; } will not trigger, and therefore we will not record the free'd SKB. And if we iterate the loop again, it is guaranteed that 'skb' will be set to a new packet or NULL. So there is no problem here.