[PATCH 0/14] skb fragment API: convert network drivers (part II)
STALE5507d
16 messages,
2 authors,
2011-09-15 · open the first message on its own page
The following series converts the second batch of network drivers to the
SKB pages fragment API introduced in 131ea6675c76. I expect there will
be ~4 similarly sized batches to convert all the drivers over.
This is part of my series to enable visibility into SKB paged fragment's
lifecycles, [0] contains some more background and rationale but
basically the completed series will allow entities which inject pages
into the networking stack to receive a notification when the stack has
really finished with those pages (i.e. including retransmissions,
clones, pull-ups etc) and not just when the original skb is finished
with, which is beneficial to many subsystems which wish to inject pages
into the network stack without giving up full ownership of those page's
lifecycle. It implements something broadly along the lines of what was
described in [1].
Cheers,
Ian.
[0] http://marc.info/?l=linux-netdev&m=131072801125521&w=2
[1] http://marc.info/?l=linux-netdev&m=130925719513084&w=2
Signed-off-by: Ian Campbell <redacted>
Cc: Santiago Leon <redacted>
Cc: netdev@vger.kernel.org
---
drivers/net/ethernet/ibm/ibmveth.c | 5 ++---
1 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c
index bba1ffc..8cca4a6 100644
--- a/drivers/net/ethernet/ibm/ibmveth.c
+++ b/drivers/net/ethernet/ibm/ibmveth.c @@ -1002,9 +1002,8 @@ retry_bounce:
unsigned long dma_addr ;
skb_frag_t * frag = & skb_shinfo ( skb ) -> frags [ i ];
- dma_addr = dma_map_page ( & adapter -> vdev -> dev , frag -> page ,
- frag -> page_offset , frag -> size ,
- DMA_TO_DEVICE );
+ dma_addr = skb_frag_dma_map ( & adapter -> vdev -> dev , frag , 0 ,
+ frag -> size , DMA_TO_DEVICE );
if ( dma_mapping_error ( & adapter -> vdev -> dev , dma_addr ))
goto map_failed_frags ; --
1.7.2.5
Signed-off-by: Ian Campbell <redacted>
Cc: Guo-Fu Tseng <cooldavid@cooldavid.org>
Cc: netdev@vger.kernel.org
---
drivers/net/ethernet/jme.c | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/jme.c b/drivers/net/ethernet/jme.c
index a869ee4..48a0a23 100644
--- a/drivers/net/ethernet/jme.c
+++ b/drivers/net/ethernet/jme.c @@ -1928,8 +1928,9 @@ jme_map_tx_skb(struct jme_adapter *jme, struct sk_buff *skb, int idx)
ctxdesc = txdesc + (( idx + i + 2 ) & ( mask ));
ctxbi = txbi + (( idx + i + 2 ) & ( mask ));
- jme_fill_tx_map ( jme -> pdev , ctxdesc , ctxbi , frag -> page ,
- frag -> page_offset , frag -> size , hidma );
+ jme_fill_tx_map ( jme -> pdev , ctxdesc , ctxbi ,
+ skb_frag_page ( frag ),
+ frag -> page_offset , frag -> size , hidma );
}
len = skb_is_nonlinear ( skb ) ? skb_headlen ( skb ) : skb -> len ; --
1.7.2.5
Signed-off-by: Ian Campbell <redacted>
Cc: netdev@vger.kernel.org
---
drivers/net/ethernet/micrel/ksz884x.c | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/micrel/ksz884x.c b/drivers/net/ethernet/micrel/ksz884x.c
index 27418d3..710c4ae 100644
--- a/drivers/net/ethernet/micrel/ksz884x.c
+++ b/drivers/net/ethernet/micrel/ksz884x.c @@ -4704,8 +4704,7 @@ static void send_packet(struct sk_buff *skb, struct net_device *dev)
dma_buf -> dma = pci_map_single (
hw_priv -> pdev ,
- page_address ( this_frag -> page ) +
- this_frag -> page_offset ,
+ skb_frag_address ( this_frag ),
dma_buf -> len ,
PCI_DMA_TODEVICE );
set_tx_buf ( desc , dma_buf -> dma ); --
1.7.2.5
Signed-off-by: Ian Campbell <redacted>
Cc: netdev@vger.kernel.org
---
drivers/net/macvtap.c | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
index ab96c31..7c3f84a 100644
--- a/drivers/net/macvtap.c
+++ b/drivers/net/macvtap.c @@ -503,10 +503,10 @@ static int zerocopy_sg_from_iovec(struct sk_buff *skb, const struct iovec *from,
skb -> truesize += len ;
atomic_add ( len , & skb -> sk -> sk_wmem_alloc );
while ( len ) {
- f = & skb_shinfo ( skb ) -> frags [ i ];
- f -> page = page [ i ];
- f -> page_offset = base & ~ PAGE_MASK ;
- f -> size = min_t ( int , len , PAGE_SIZE - f -> page_offset );
+ __skb_fill_page_desc (
+ skb , i , page [ i ],
+ base & ~ PAGE_MASK ,
+ min_t ( int , len , PAGE_SIZE - f -> page_offset ));
skb_shinfo ( skb ) -> nr_frags ++ ;
/* increase sk_wmem_alloc */
base += f -> size ; --
1.7.2.5
Signed-off-by: Ian Campbell <redacted>
Cc: Lennert Buytenhek <redacted>
Cc: netdev@vger.kernel.org
---
drivers/net/ethernet/marvell/mv643xx_eth.c | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/marvell/mv643xx_eth.c b/drivers/net/ethernet/marvell/mv643xx_eth.c
index 1e2c9f07..7325737 100644
--- a/drivers/net/ethernet/marvell/mv643xx_eth.c
+++ b/drivers/net/ethernet/marvell/mv643xx_eth.c @@ -752,10 +752,10 @@ static void txq_submit_frag_skb(struct tx_queue *txq, struct sk_buff *skb)
desc -> l4i_chk = 0 ;
desc -> byte_cnt = this_frag -> size ;
- desc -> buf_ptr = dma_map_page ( mp -> dev -> dev . parent ,
- this_frag -> page ,
- this_frag -> page_offset ,
- this_frag -> size , DMA_TO_DEVICE );
+ desc -> buf_ptr = skb_frag_dma_map ( mp -> dev -> dev . parent ,
+ this_frag , 0 ,
+ this_frag -> size ,
+ DMA_TO_DEVICE );
}
}
--
1.7.2.5
Signed-off-by: Ian Campbell <redacted>
Cc: Sony Chacko <redacted>
Cc: Rajesh Borundia <redacted>
Cc: netdev@vger.kernel.org
---
.../net/ethernet/qlogic/netxen/netxen_nic_main.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
index de18e47..694130e 100644
--- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
+++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c @@ -1844,8 +1844,8 @@ netxen_map_tx_skb(struct pci_dev *pdev,
frag = & skb_shinfo ( skb ) -> frags [ i ];
nf = & pbuf -> frag_array [ i + 1 ];
- map = pci_map_page ( pdev , frag -> page , frag -> page_offset ,
- frag -> size , PCI_DMA_TODEVICE );
+ map = skb_frag_dma_map ( & pdev -> dev , frag , 0 , frag -> size ,
+ PCI_DMA_TODEVICE );
if ( pci_dma_mapping_error ( pdev , map ))
goto unwind ;
--
1.7.2.5
Signed-off-by: Ian Campbell <redacted>
Cc: netdev@vger.kernel.org
---
drivers/net/ethernet/sun/niu.c | 7 ++-----
1 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/drivers/net/ethernet/sun/niu.c b/drivers/net/ethernet/sun/niu.c
index 3c9ef1c..cad58f2 100644
--- a/drivers/net/ethernet/sun/niu.c
+++ b/drivers/net/ethernet/sun/niu.c @@ -3290,11 +3290,8 @@ static void niu_rx_skb_append(struct sk_buff *skb, struct page *page,
u32 offset , u32 size )
{
int i = skb_shinfo ( skb ) -> nr_frags ;
- skb_frag_t * frag = & skb_shinfo ( skb ) -> frags [ i ];
- frag -> page = page ;
- frag -> page_offset = offset ;
- frag -> size = size ;
+ __skb_fill_page_desc ( skb , i , page , offset , size );
skb -> len += size ;
skb -> data_len += size ; @@ -6737,7 +6734,7 @@ static netdev_tx_t niu_start_xmit(struct sk_buff *skb,
skb_frag_t * frag = & skb_shinfo ( skb ) -> frags [ i ];
len = frag -> size ;
- mapping = np -> ops -> map_page ( np -> device , frag -> page ,
+ mapping = np -> ops -> map_page ( np -> device , skb_frag_page ( frag ),
frag -> page_offset , len ,
DMA_TO_DEVICE );
--
1.7.2.5
Signed-off-by: Ian Campbell <redacted>
Cc: netdev@vger.kernel.org
---
drivers/net/ethernet/natsemi/ns83820.c | 5 ++---
1 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/natsemi/ns83820.c b/drivers/net/ethernet/natsemi/ns83820.c
index 1a1e20e..e0895e4 100644
--- a/drivers/net/ethernet/natsemi/ns83820.c
+++ b/drivers/net/ethernet/natsemi/ns83820.c @@ -1160,9 +1160,8 @@ again:
if ( ! nr_frags )
break ;
- buf = pci_map_page ( dev -> pci_dev , frag -> page ,
- frag -> page_offset ,
- frag -> size , PCI_DMA_TODEVICE );
+ buf = skb_frag_dma_map ( & dev -> pci_dev -> dev , frag , 0 ,
+ frag -> size , PCI_DMA_TODEVICE );
dprintk ( "frag: buf=%08Lx page=%08lx offset=%08lx \n " ,
( long long ) buf , ( long ) page_to_pfn ( frag -> page ),
frag -> page_offset ); --
1.7.2.5
Signed-off-by: Ian Campbell <redacted>
Cc: Olof Johansson <redacted>
Cc: netdev@vger.kernel.org
---
drivers/net/ethernet/pasemi/pasemi_mac.c | 5 ++---
1 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/pasemi/pasemi_mac.c b/drivers/net/ethernet/pasemi/pasemi_mac.c
index fad620d..5322095 100644
--- a/drivers/net/ethernet/pasemi/pasemi_mac.c
+++ b/drivers/net/ethernet/pasemi/pasemi_mac.c @@ -1505,9 +1505,8 @@ static int pasemi_mac_start_tx(struct sk_buff *skb, struct net_device *dev)
for ( i = 0 ; i < nfrags ; i ++ ) {
skb_frag_t * frag = & skb_shinfo ( skb ) -> frags [ i ];
- map [ i + 1 ] = pci_map_page ( mac -> dma_pdev , frag -> page ,
- frag -> page_offset , frag -> size ,
- PCI_DMA_TODEVICE );
+ map [ i + 1 ] = skb_frag_dma_map ( & mac -> dma_pdev -> dev , frag , 0 ,
+ frag -> size , PCI_DMA_TODEVICE );
map_size [ i + 1 ] = frag -> size ;
if ( pci_dma_mapping_error ( mac -> dma_pdev , map [ i + 1 ])) {
nfrags = i ; --
1.7.2.5
Signed-off-by: Ian Campbell <redacted>
Cc: Ursula Braun <redacted>
Cc: Frank Blaschka <redacted>
Cc: linux390@de.ibm.com
Cc: Martin Schwidefsky <redacted>
Cc: Heiko Carstens <redacted>
Cc: linux-s390@vger.kernel.org
Cc: netdev@vger.kernel.org
---
drivers/s390/net/qeth_core_main.c | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index 97172f8..8153443 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c @@ -3694,7 +3694,8 @@ static inline void __qeth_fill_buffer(struct sk_buff *skb,
for ( cnt = 0 ; cnt < skb_shinfo ( skb ) -> nr_frags ; cnt ++ ) {
frag = & skb_shinfo ( skb ) -> frags [ cnt ];
- buffer -> element [ element ]. addr = ( char * ) page_to_phys ( frag -> page )
+ buffer -> element [ element ]. addr = ( char * )
+ page_to_phys ( skb_frag_page ( frag ))
+ frag -> page_offset ;
buffer -> element [ element ]. length = frag -> size ;
buffer -> element [ element ]. eflags = SBAL_EFLAGS_MIDDLE_FRAG ; --
1.7.2.5
Signed-off-by: Ian Campbell <redacted>
Cc: Ron Mercer <redacted>
Cc: linux-driver@qlogic.com
Cc: netdev@vger.kernel.org
---
drivers/net/ethernet/qlogic/qla3xxx.c | 5 ++---
1 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/qla3xxx.c b/drivers/net/ethernet/qlogic/qla3xxx.c
index 8cab61c..1871d88 100644
--- a/drivers/net/ethernet/qlogic/qla3xxx.c
+++ b/drivers/net/ethernet/qlogic/qla3xxx.c @@ -2388,9 +2388,8 @@ static int ql_send_map(struct ql3_adapter *qdev,
seg ++ ;
}
- map = pci_map_page ( qdev -> pdev , frag -> page ,
- frag -> page_offset , frag -> size ,
- PCI_DMA_TODEVICE );
+ map = skb_frag_dma_map ( & qdev -> pdev -> dev , frag , 0 , frag -> size ,
+ PCI_DMA_TODEVICE );
err = pci_dma_mapping_error ( qdev -> pdev , map );
if ( err ) { --
1.7.2.5
Signed-off-by: Ian Campbell <redacted>
Cc: Anirban Chakraborty <redacted>
Cc: Sony Chacko <redacted>
Cc: linux-driver@qlogic.com
Cc: netdev@vger.kernel.org
---
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index 690c93f..501e16b 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c @@ -2135,8 +2135,8 @@ qlcnic_map_tx_skb(struct pci_dev *pdev,
frag = & skb_shinfo ( skb ) -> frags [ i ];
nf = & pbuf -> frag_array [ i + 1 ];
- map = pci_map_page ( pdev , frag -> page , frag -> page_offset ,
- frag -> size , PCI_DMA_TODEVICE );
+ map = skb_frag_dma_map ( & pdev -> dev , frag , 0 , frag -> size ,
+ PCI_DMA_TODEVICE );
if ( pci_dma_mapping_error ( pdev , map ))
goto unwind ;
--
1.7.2.5
Signed-off-by: Ian Campbell <redacted>
Cc: Anirban Chakraborty <redacted>
Cc: Jitendra Kalsaria <redacted>
Cc: Ron Mercer <redacted>
Cc: linux-driver@qlogic.com
Cc: netdev@vger.kernel.org
---
drivers/net/ethernet/qlogic/qlge/qlge_main.c | 18 ++++++------------
1 files changed, 6 insertions(+), 12 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_main.c b/drivers/net/ethernet/qlogic/qlge/qlge_main.c
index 39360c4..ce6c6fe 100644
--- a/drivers/net/ethernet/qlogic/qlge/qlge_main.c
+++ b/drivers/net/ethernet/qlogic/qlge/qlge_main.c @@ -1431,10 +1431,8 @@ static int ql_map_send(struct ql_adapter *qdev,
map_idx ++ ;
}
- map =
- pci_map_page ( qdev -> pdev , frag -> page ,
- frag -> page_offset , frag -> size ,
- PCI_DMA_TODEVICE );
+ map = skb_frag_dma_map ( & qdev -> pdev -> dev , frag , 0 , frag -> size ,
+ PCI_DMA_TODEVICE );
err = pci_dma_mapping_error ( qdev -> pdev , map );
if ( err ) { @@ -1477,8 +1475,6 @@ static void ql_process_mac_rx_gro_page(struct ql_adapter *qdev,
{
struct sk_buff * skb ;
struct bq_desc * lbq_desc = ql_get_curr_lchunk ( qdev , rx_ring );
- struct skb_frag_struct * rx_frag ;
- int nr_frags ;
struct napi_struct * napi = & rx_ring -> napi ;
napi -> dev = qdev -> ndev ; @@ -1492,12 +1488,10 @@ static void ql_process_mac_rx_gro_page(struct ql_adapter *qdev,
return ;
}
prefetch ( lbq_desc -> p . pg_chunk . va );
- rx_frag = skb_shinfo ( skb ) -> frags ;
- nr_frags = skb_shinfo ( skb ) -> nr_frags ;
- rx_frag += nr_frags ;
- rx_frag -> page = lbq_desc -> p . pg_chunk . page ;
- rx_frag -> page_offset = lbq_desc -> p . pg_chunk . offset ;
- rx_frag -> size = length ;
+ __skb_fill_page_desc ( skb , skb_shinfo ( skb ) -> nr_frags ,
+ lbq_desc -> p . pg_chunk . page ,
+ lbq_desc -> p . pg_chunk . offset ,
+ length );
skb -> len += length ;
skb -> data_len += length ; --
1.7.2.5
Signed-off-by: Ian Campbell <redacted>
Cc: Realtek linux nic maintainers <redacted>
Cc: Francois Romieu <romieu@fr.zoreil.com>
Cc: netdev@vger.kernel.org
---
drivers/net/ethernet/realtek/r8169.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
index 1cf8c3c..835bbb5 100644
--- a/drivers/net/ethernet/realtek/r8169.c
+++ b/drivers/net/ethernet/realtek/r8169.c @@ -5027,7 +5027,7 @@ static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
txd = tp -> TxDescArray + entry ;
len = frag -> size ;
- addr = (( void * ) page_address ( frag -> page )) + frag -> page_offset ;
+ addr = skb_frag_address ( frag );
mapping = dma_map_single ( d , addr , len , DMA_TO_DEVICE );
if ( unlikely ( dma_mapping_error ( d , mapping ))) {
if ( net_ratelimit ()) --
1.7.2.5
From: Ian Campbell <redacted>
Date: Wed, 31 Aug 2011 11:46:48 +0100
The following series converts the second batch of network drivers to the
SKB pages fragment API introduced in 131ea6675c76. I expect there will
be ~4 similarly sized batches to convert all the drivers over.
This is part of my series to enable visibility into SKB paged fragment's
lifecycles, [0] contains some more background and rationale but
basically the completed series will allow entities which inject pages
into the networking stack to receive a notification when the stack has
really finished with those pages (i.e. including retransmissions,
clones, pull-ups etc) and not just when the original skb is finished
with, which is beneficial to many subsystems which wish to inject pages
into the network stack without giving up full ownership of those page's
lifecycle. It implements something broadly along the lines of what was
described in [1].
Series applied, thanks.