diff options
author | Simon Horman <horms@verge.net.au> | 2013-05-28 16:34:24 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-05-29 02:49:07 -0400 |
commit | be8b678c6c63010cd2b0f4f602bd3066f7827fb2 (patch) | |
tree | 10ca86d4e1bb5209d2985c73c21faab3d0e21b9b /drivers/net/ethernet/chelsio/cxgb3 | |
parent | 25b6e14881e7861bb720a4624dcaf5f37854fc70 (diff) |
cxgb3: Correct comparisons and calculations using skb->tail and skb-transport_header
This corrects an regression introduced by "net: Use 16bits for *_headers
fields of struct skbuff" when NET_SKBUFF_DATA_USES_OFFSET is not set. In
that case skb->tail will be a pointer whereas skb->transport_header
will be an offset from head. This is corrected by using wrappers that
ensure that comparisons and calculations are always made using pointers.
Signed-off-by: Simon Horman <horms@verge.net.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/chelsio/cxgb3')
-rw-r--r-- | drivers/net/ethernet/chelsio/cxgb3/sge.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/drivers/net/ethernet/chelsio/cxgb3/sge.c b/drivers/net/ethernet/chelsio/cxgb3/sge.c index 2fd773e267dc..46d1efc17527 100644 --- a/drivers/net/ethernet/chelsio/cxgb3/sge.c +++ b/drivers/net/ethernet/chelsio/cxgb3/sge.c | |||
@@ -1584,9 +1584,8 @@ static void deferred_unmap_destructor(struct sk_buff *skb) | |||
1584 | p = dui->addr; | 1584 | p = dui->addr; |
1585 | 1585 | ||
1586 | if (skb->tail - skb->transport_header) | 1586 | if (skb->tail - skb->transport_header) |
1587 | pci_unmap_single(dui->pdev, *p++, | 1587 | pci_unmap_single(dui->pdev, *p++, skb_tail_pointer(skb) - |
1588 | skb->tail - skb->transport_header, | 1588 | skb_transport_header(skb), PCI_DMA_TODEVICE); |
1589 | PCI_DMA_TODEVICE); | ||
1590 | 1589 | ||
1591 | si = skb_shinfo(skb); | 1590 | si = skb_shinfo(skb); |
1592 | for (i = 0; i < si->nr_frags; i++) | 1591 | for (i = 0; i < si->nr_frags; i++) |
@@ -1647,8 +1646,8 @@ static void write_ofld_wr(struct adapter *adap, struct sk_buff *skb, | |||
1647 | flits = skb_transport_offset(skb) / 8; | 1646 | flits = skb_transport_offset(skb) / 8; |
1648 | sgp = ndesc == 1 ? (struct sg_ent *)&d->flit[flits] : sgl; | 1647 | sgp = ndesc == 1 ? (struct sg_ent *)&d->flit[flits] : sgl; |
1649 | sgl_flits = write_sgl(skb, sgp, skb_transport_header(skb), | 1648 | sgl_flits = write_sgl(skb, sgp, skb_transport_header(skb), |
1650 | skb->tail - skb->transport_header, | 1649 | skb_tail_pointer(skb) - |
1651 | addr); | 1650 | skb_transport_header(skb), addr); |
1652 | if (need_skb_unmap()) { | 1651 | if (need_skb_unmap()) { |
1653 | setup_deferred_unmapping(skb, adap->pdev, sgp, sgl_flits); | 1652 | setup_deferred_unmapping(skb, adap->pdev, sgp, sgl_flits); |
1654 | skb->destructor = deferred_unmap_destructor; | 1653 | skb->destructor = deferred_unmap_destructor; |
@@ -1674,7 +1673,7 @@ static inline unsigned int calc_tx_descs_ofld(const struct sk_buff *skb) | |||
1674 | 1673 | ||
1675 | flits = skb_transport_offset(skb) / 8; /* headers */ | 1674 | flits = skb_transport_offset(skb) / 8; /* headers */ |
1676 | cnt = skb_shinfo(skb)->nr_frags; | 1675 | cnt = skb_shinfo(skb)->nr_frags; |
1677 | if (skb->tail != skb->transport_header) | 1676 | if (skb_tail_pointer(skb) != skb_transport_header(skb)) |
1678 | cnt++; | 1677 | cnt++; |
1679 | return flits_to_desc(flits + sgl_len(cnt)); | 1678 | return flits_to_desc(flits + sgl_len(cnt)); |
1680 | } | 1679 | } |