diff mbox

[net-next,02/10] 8139too: Call dev_kfree_skby_any instead of dev_kfree_skb.

Message ID 87fvmobfnr.fsf_-_@xmission.com
State Accepted, archived
Delegated to: David Miller
Headers show

Commit Message

Eric W. Biederman March 11, 2014, 9:15 p.m. UTC
Replace dev_kfree_skb with dev_kfree_skb_any in functions that can
be called in hard irq and other contexts.

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
---
 drivers/net/ethernet/realtek/8139too.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

Comments

Eric Dumazet March 12, 2014, 2:06 a.m. UTC | #1
On Tue, 2014-03-11 at 14:15 -0700, Eric W. Biederman wrote:
> Replace dev_kfree_skb with dev_kfree_skb_any in functions that can
> be called in hard irq and other contexts.
> 
> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
> ---
>  drivers/net/ethernet/realtek/8139too.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/ethernet/realtek/8139too.c b/drivers/net/ethernet/realtek/8139too.c
> index da5972eefdd2..8cb2f357026e 100644
> --- a/drivers/net/ethernet/realtek/8139too.c
> +++ b/drivers/net/ethernet/realtek/8139too.c
> @@ -1717,9 +1717,9 @@ static netdev_tx_t rtl8139_start_xmit (struct sk_buff *skb,
>  		if (len < ETH_ZLEN)
>  			memset(tp->tx_buf[entry], 0, ETH_ZLEN);
>  		skb_copy_and_csum_dev(skb, tp->tx_buf[entry]);
> -		dev_kfree_skb(skb);
> +		dev_kfree_skb_any(skb);
>  	} else {
> -		dev_kfree_skb(skb);
> +		dev_kfree_skb_any(skb);
>  		dev->stats.tx_dropped++;
>  		return NETDEV_TX_OK;
>  	}

Same u64_stats_fetch_begin_bh() problem for this driver to fetch TX
stats.



--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Francois Romieu March 12, 2014, 9:24 p.m. UTC | #2
Eric Dumazet <eric.dumazet@gmail.com> :
[...]
> Same u64_stats_fetch_begin_bh() problem for this driver to fetch TX
> stats.

Same problem for any NAPI context Tx completing driver that claims
netpoll support. For instance:
drivers/net/ethernet/emulex/benet
drivers/net/ethernet/intel/i40e
drivers/net/ethernet/intel/igb
drivers/net/ethernet/intel/ixgbe
drivers/net/ethernet/marvell/sky2.c
drivers/net/ethernet/neterion/vxge ?

Similar problem for the drivers below. They update Tx stats in start_xmit
and use u64_.*_bh:
drivers/net/ethernet/tile/tilepro.c
drivers/net/team/team.c
drivers/net/virtio_net.c
Eric Dumazet March 12, 2014, 10:01 p.m. UTC | #3
On Wed, 2014-03-12 at 22:24 +0100, Francois Romieu wrote:
> Eric Dumazet <eric.dumazet@gmail.com> :
> [...]
> > Same u64_stats_fetch_begin_bh() problem for this driver to fetch TX
> > stats.
> 
> Same problem for any NAPI context Tx completing driver that claims
> netpoll support. For instance:
> drivers/net/ethernet/emulex/benet
> drivers/net/ethernet/intel/i40e
> drivers/net/ethernet/intel/igb
> drivers/net/ethernet/intel/ixgbe
> drivers/net/ethernet/marvell/sky2.c
> drivers/net/ethernet/neterion/vxge ?
> 
> Similar problem for the drivers below. They update Tx stats in start_xmit
> and use u64_.*_bh:
> drivers/net/ethernet/tile/tilepro.c
> drivers/net/team/team.c
> drivers/net/virtio_net.c
> 

Yep, note that this issue is not caused by Eric patches, we need to take
care of this by providing u64_stats_fetch_{begin|retry}_irq() regardless
of how skb are freed.



--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Eric W. Biederman March 13, 2014, 9:08 p.m. UTC | #4
Eric Dumazet <eric.dumazet@gmail.com> writes:

> On Wed, 2014-03-12 at 22:24 +0100, Francois Romieu wrote:
>> Eric Dumazet <eric.dumazet@gmail.com> :
>> [...]
>> > Same u64_stats_fetch_begin_bh() problem for this driver to fetch TX
>> > stats.
>> 
>> Same problem for any NAPI context Tx completing driver that claims
>> netpoll support. For instance:
>> drivers/net/ethernet/emulex/benet
>> drivers/net/ethernet/intel/i40e
>> drivers/net/ethernet/intel/igb
>> drivers/net/ethernet/intel/ixgbe
>> drivers/net/ethernet/marvell/sky2.c
>> drivers/net/ethernet/neterion/vxge ?
>> 
>> Similar problem for the drivers below. They update Tx stats in start_xmit
>> and use u64_.*_bh:
>> drivers/net/ethernet/tile/tilepro.c
>> drivers/net/team/team.c
>> drivers/net/virtio_net.c
>> 
>
> Yep, note that this issue is not caused by Eric patches, we need to take
> care of this by providing u64_stats_fetch_{begin|retry}_irq() regardless
> of how skb are freed.

By my read of the code this is actually only a problem on 32bit
uniprocessor, and at worst it scrambles the reported nuumbers if we
happen to have a printk in irq context while we are fetching the stats.

Given the rest of the problems that I am fixing can corrupt things, and
can happen on any platform I am going to ignore this problem for now.

Eric

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/net/ethernet/realtek/8139too.c b/drivers/net/ethernet/realtek/8139too.c
index da5972eefdd2..8cb2f357026e 100644
--- a/drivers/net/ethernet/realtek/8139too.c
+++ b/drivers/net/ethernet/realtek/8139too.c
@@ -1717,9 +1717,9 @@  static netdev_tx_t rtl8139_start_xmit (struct sk_buff *skb,
 		if (len < ETH_ZLEN)
 			memset(tp->tx_buf[entry], 0, ETH_ZLEN);
 		skb_copy_and_csum_dev(skb, tp->tx_buf[entry]);
-		dev_kfree_skb(skb);
+		dev_kfree_skb_any(skb);
 	} else {
-		dev_kfree_skb(skb);
+		dev_kfree_skb_any(skb);
 		dev->stats.tx_dropped++;
 		return NETDEV_TX_OK;
 	}