Message ID | 20250212-airoha-fix-tso-v1-1-1652558a79b4@kernel.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Enable TSO for DSA ports on Airoha EN7581 SoC | expand |
On 2/12/2025 7:51 AM, Lorenzo Bianconi wrote: > For GSO packets, skb_cow_head() will reallocate the skb for TSO header > cloned skbs in airoha_dev_xmit(). For this reason, sinfo pointer can be > no more valid. Fix the issue relying on skb_shinfo() macro directly in > airoha_dev_xmit(). > This is not a user visible issue since we can't currently enable TSO for > DSA user ports since we are missing to initialize net_device > vlan_features field. > > Fixes: 23020f049327 ("net: airoha: Introduce ethernet support for EN7581 SoC") > Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> > --- > drivers/net/ethernet/mediatek/airoha_eth.c | 10 +++++----- > 1 file changed, 5 insertions(+), 5 deletions(-) > > diff --git a/drivers/net/ethernet/mediatek/airoha_eth.c b/drivers/net/ethernet/mediatek/airoha_eth.c > index 09f448f291240257c5748725848ede231c502fbd..aa5f220ddbcf9ca5bee1173114294cb3aec701c9 100644 > --- a/drivers/net/ethernet/mediatek/airoha_eth.c > +++ b/drivers/net/ethernet/mediatek/airoha_eth.c > @@ -2556,11 +2556,10 @@ static u16 airoha_dev_select_queue(struct net_device *dev, struct sk_buff *skb, > static netdev_tx_t airoha_dev_xmit(struct sk_buff *skb, > struct net_device *dev) > { > - struct skb_shared_info *sinfo = skb_shinfo(skb); > struct airoha_gdm_port *port = netdev_priv(dev); > + u32 nr_frags = 1 + skb_shinfo(skb)->nr_frags; > u32 msg0, msg1, len = skb_headlen(skb); > struct airoha_qdma *qdma = port->qdma; > - u32 nr_frags = 1 + sinfo->nr_frags; > struct netdev_queue *txq; > struct airoha_queue *q; > void *data = skb->data; > @@ -2583,8 +2582,9 @@ static netdev_tx_t airoha_dev_xmit(struct sk_buff *skb, > if (skb_cow_head(skb, 0)) > goto error; > > - if (sinfo->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) { > - __be16 csum = cpu_to_be16(sinfo->gso_size); > + if (skb_shinfo(skb)->gso_type & (SKB_GSO_TCPV4 | > + SKB_GSO_TCPV6)) { > + __be16 csum = cpu_to_be16(skb_shinfo(skb)->gso_size); > > tcp_hdr(skb)->check = (__force __sum16)csum; > msg0 |= FIELD_PREP(QDMA_ETH_TXMSG_TSO_MASK, 1); > @@ -2613,7 +2613,7 @@ static netdev_tx_t airoha_dev_xmit(struct sk_buff *skb, > for (i = 0; i < nr_frags; i++) { > struct airoha_qdma_desc *desc = &q->desc[index]; > struct airoha_queue_entry *e = &q->entry[index]; > - skb_frag_t *frag = &sinfo->frags[i]; > + skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; > dma_addr_t addr; > u32 val; > > Thanks for this change: Reviewed-by: Mateusz Polchlopek <mateusz.polchlopek@intel.com>
diff --git a/drivers/net/ethernet/mediatek/airoha_eth.c b/drivers/net/ethernet/mediatek/airoha_eth.c index 09f448f291240257c5748725848ede231c502fbd..aa5f220ddbcf9ca5bee1173114294cb3aec701c9 100644 --- a/drivers/net/ethernet/mediatek/airoha_eth.c +++ b/drivers/net/ethernet/mediatek/airoha_eth.c @@ -2556,11 +2556,10 @@ static u16 airoha_dev_select_queue(struct net_device *dev, struct sk_buff *skb, static netdev_tx_t airoha_dev_xmit(struct sk_buff *skb, struct net_device *dev) { - struct skb_shared_info *sinfo = skb_shinfo(skb); struct airoha_gdm_port *port = netdev_priv(dev); + u32 nr_frags = 1 + skb_shinfo(skb)->nr_frags; u32 msg0, msg1, len = skb_headlen(skb); struct airoha_qdma *qdma = port->qdma; - u32 nr_frags = 1 + sinfo->nr_frags; struct netdev_queue *txq; struct airoha_queue *q; void *data = skb->data; @@ -2583,8 +2582,9 @@ static netdev_tx_t airoha_dev_xmit(struct sk_buff *skb, if (skb_cow_head(skb, 0)) goto error; - if (sinfo->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) { - __be16 csum = cpu_to_be16(sinfo->gso_size); + if (skb_shinfo(skb)->gso_type & (SKB_GSO_TCPV4 | + SKB_GSO_TCPV6)) { + __be16 csum = cpu_to_be16(skb_shinfo(skb)->gso_size); tcp_hdr(skb)->check = (__force __sum16)csum; msg0 |= FIELD_PREP(QDMA_ETH_TXMSG_TSO_MASK, 1); @@ -2613,7 +2613,7 @@ static netdev_tx_t airoha_dev_xmit(struct sk_buff *skb, for (i = 0; i < nr_frags; i++) { struct airoha_qdma_desc *desc = &q->desc[index]; struct airoha_queue_entry *e = &q->entry[index]; - skb_frag_t *frag = &sinfo->frags[i]; + skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; dma_addr_t addr; u32 val;
For GSO packets, skb_cow_head() will reallocate the skb for TSO header cloned skbs in airoha_dev_xmit(). For this reason, sinfo pointer can be no more valid. Fix the issue relying on skb_shinfo() macro directly in airoha_dev_xmit(). This is not a user visible issue since we can't currently enable TSO for DSA user ports since we are missing to initialize net_device vlan_features field. Fixes: 23020f049327 ("net: airoha: Introduce ethernet support for EN7581 SoC") Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> --- drivers/net/ethernet/mediatek/airoha_eth.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)