All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/7] Convert skb_frag_t to bio_vec
@ 2019-05-01 14:44 Matthew Wilcox
  2019-05-01 14:44 ` [PATCH v2 1/7] net: Increase the size of skb_frag_t Matthew Wilcox
                   ` (6 more replies)
  0 siblings, 7 replies; 14+ messages in thread
From: Matthew Wilcox @ 2019-05-01 14:44 UTC (permalink / raw)
  To: davem; +Cc: Matthew Wilcox (Oracle), hch, netdev

From: "Matthew Wilcox (Oracle)" <willy@infradead.org>

The skb_frag_t and bio_vec are fundamentally the same (page, offset,
length) tuple.  This patch series unifies the two, leaving the
skb_frag_t typedef in place.  This has the immediate advantage that
we already have iov_iter support for bvecs and don't need to add
support for iterating skbuffs.  It enables a long-term plan to use
bvecs more broadly within the kernel and should make network-storage
drivers able to do less work converting between skbuffs and biovecs.

It will consume more memory on 32-bit kernels.  If that proves
problematic, we can look at ways of addressing it.

Matthew Wilcox (Oracle) (7):
  net: Increase the size of skb_frag_t
  net: Reorder the contents of skb_frag_t
  net: Use skb accessors in network drivers
  net: Use skb accessors in network core
  net: Rename skb_frag page to bv_page
  net: Rename skb_frag_t size to bv_len
  net: Convert skb_frag_t to bio_vec

 drivers/hsi/clients/ssi_protocol.c            |  3 +-
 drivers/net/ethernet/3com/3c59x.c             |  2 +-
 drivers/net/ethernet/agere/et131x.c           |  4 +--
 .../net/ethernet/apm/xgene/xgene_enet_main.c  |  3 +-
 drivers/net/ethernet/calxeda/xgmac.c          |  2 +-
 .../net/ethernet/cavium/liquidio/lio_main.c   | 17 +++++-----
 .../ethernet/cavium/liquidio/lio_vf_main.c    | 15 ++++-----
 drivers/net/ethernet/cortina/gemini.c         |  5 ++-
 drivers/net/ethernet/freescale/fec_main.c     |  4 +--
 drivers/net/ethernet/hisilicon/hix5hd2_gmac.c |  2 +-
 drivers/net/ethernet/intel/fm10k/fm10k_main.c |  3 +-
 drivers/net/ethernet/intel/igb/igb_main.c     |  3 +-
 drivers/net/ethernet/intel/igc/igc_main.c     |  3 +-
 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c |  3 +-
 drivers/net/ethernet/marvell/mvneta.c         |  4 +--
 .../net/ethernet/marvell/mvpp2/mvpp2_main.c   |  7 ++--
 .../net/ethernet/myricom/myri10ge/myri10ge.c  |  2 +-
 drivers/net/ethernet/qualcomm/emac/emac-mac.c |  5 +--
 drivers/net/usb/usbnet.c                      |  2 +-
 drivers/net/wireless/ath/wil6210/txrx.c       |  6 ++--
 drivers/net/wireless/ath/wil6210/txrx_edma.c  |  2 +-
 drivers/net/xen-netback/netback.c             |  4 +--
 drivers/staging/octeon/ethernet-tx.c          |  3 +-
 drivers/target/iscsi/cxgbit/cxgbit_target.c   |  6 ++--
 include/linux/bvec.h                          |  5 ++-
 include/linux/skbuff.h                        | 32 +++++++------------
 net/core/skbuff.c                             | 24 ++++++++------
 net/core/tso.c                                |  8 ++---
 net/ipv4/tcp.c                                | 12 ++++---
 net/kcm/kcmsock.c                             |  8 ++---
 net/tls/tls_device.c                          | 14 ++++----
 31 files changed, 108 insertions(+), 105 deletions(-)

-- 
2.20.1


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH v2 1/7] net: Increase the size of skb_frag_t
  2019-05-01 14:44 [PATCH v2 0/7] Convert skb_frag_t to bio_vec Matthew Wilcox
@ 2019-05-01 14:44 ` Matthew Wilcox
  2019-05-01 14:44 ` [PATCH v2 2/7] net: Reorder the contents " Matthew Wilcox
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 14+ messages in thread
From: Matthew Wilcox @ 2019-05-01 14:44 UTC (permalink / raw)
  To: davem; +Cc: Matthew Wilcox (Oracle), hch, netdev

From: "Matthew Wilcox (Oracle)" <willy@infradead.org>

To increase commonality between block and net, we are going to replace
the skb_frag_t with the bio_vec.  This patch increases the size of
skb_frag_t on 32-bit machines from 8 bytes to 12 bytes.  The size is
unchanged on 64-bit machines.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 include/linux/skbuff.h | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 9027a8c4219f..23f05c64aa31 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -318,13 +318,8 @@ struct skb_frag_struct {
 	struct {
 		struct page *p;
 	} page;
-#if (BITS_PER_LONG > 32) || (PAGE_SIZE >= 65536)
 	__u32 page_offset;
 	__u32 size;
-#else
-	__u16 page_offset;
-	__u16 size;
-#endif
 };
 
 /**
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 2/7] net: Reorder the contents of skb_frag_t
  2019-05-01 14:44 [PATCH v2 0/7] Convert skb_frag_t to bio_vec Matthew Wilcox
  2019-05-01 14:44 ` [PATCH v2 1/7] net: Increase the size of skb_frag_t Matthew Wilcox
@ 2019-05-01 14:44 ` Matthew Wilcox
  2019-05-01 14:44 ` [PATCH v2 3/7] net: Use skb accessors in network drivers Matthew Wilcox
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 14+ messages in thread
From: Matthew Wilcox @ 2019-05-01 14:44 UTC (permalink / raw)
  To: davem; +Cc: Matthew Wilcox (Oracle), hch, netdev

From: "Matthew Wilcox (Oracle)" <willy@infradead.org>

Match the layout of bio_vec.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 include/linux/skbuff.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 23f05c64aa31..9c6193a57241 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -318,8 +318,8 @@ struct skb_frag_struct {
 	struct {
 		struct page *p;
 	} page;
-	__u32 page_offset;
 	__u32 size;
+	__u32 page_offset;
 };
 
 /**
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 3/7] net: Use skb accessors in network drivers
  2019-05-01 14:44 [PATCH v2 0/7] Convert skb_frag_t to bio_vec Matthew Wilcox
  2019-05-01 14:44 ` [PATCH v2 1/7] net: Increase the size of skb_frag_t Matthew Wilcox
  2019-05-01 14:44 ` [PATCH v2 2/7] net: Reorder the contents " Matthew Wilcox
@ 2019-05-01 14:44 ` Matthew Wilcox
  2019-05-01 17:56   ` Matthew Wilcox
  2019-05-01 14:44 ` [PATCH v2 4/7] net: Use skb accessors in network core Matthew Wilcox
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 14+ messages in thread
From: Matthew Wilcox @ 2019-05-01 14:44 UTC (permalink / raw)
  To: davem; +Cc: Matthew Wilcox (Oracle), hch, netdev

From: "Matthew Wilcox (Oracle)" <willy@infradead.org>

In preparation for renaming skb_frag fields, use the fine accessors which
already exist.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 drivers/hsi/clients/ssi_protocol.c              |  3 ++-
 drivers/net/ethernet/3com/3c59x.c               |  2 +-
 drivers/net/ethernet/agere/et131x.c             |  4 ++--
 .../net/ethernet/apm/xgene/xgene_enet_main.c    |  3 ++-
 drivers/net/ethernet/calxeda/xgmac.c            |  2 +-
 drivers/net/ethernet/cavium/liquidio/lio_main.c | 17 ++++++++---------
 .../net/ethernet/cavium/liquidio/lio_vf_main.c  | 15 +++++++--------
 drivers/net/ethernet/cortina/gemini.c           |  5 ++---
 drivers/net/ethernet/freescale/fec_main.c       |  4 ++--
 drivers/net/ethernet/hisilicon/hix5hd2_gmac.c   |  2 +-
 drivers/net/ethernet/intel/fm10k/fm10k_main.c   |  3 ++-
 drivers/net/ethernet/intel/igb/igb_main.c       |  3 ++-
 drivers/net/ethernet/intel/igc/igc_main.c       |  3 ++-
 drivers/net/ethernet/intel/ixgbe/ixgbe_main.c   |  3 ++-
 drivers/net/ethernet/marvell/mvneta.c           |  4 ++--
 drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c |  7 ++++---
 .../net/ethernet/myricom/myri10ge/myri10ge.c    |  2 +-
 drivers/net/ethernet/qualcomm/emac/emac-mac.c   |  5 +++--
 drivers/net/usb/usbnet.c                        |  2 +-
 drivers/net/wireless/ath/wil6210/txrx.c         |  6 +++---
 drivers/net/wireless/ath/wil6210/txrx_edma.c    |  2 +-
 drivers/net/xen-netback/netback.c               |  4 ++--
 drivers/staging/octeon/ethernet-tx.c            |  3 +--
 drivers/target/iscsi/cxgbit/cxgbit_target.c     |  6 +++---
 24 files changed, 57 insertions(+), 53 deletions(-)

diff --git a/drivers/hsi/clients/ssi_protocol.c b/drivers/hsi/clients/ssi_protocol.c
index 561abf7bdf1f..9f506c00ad85 100644
--- a/drivers/hsi/clients/ssi_protocol.c
+++ b/drivers/hsi/clients/ssi_protocol.c
@@ -194,7 +194,8 @@ static void ssip_skb_to_msg(struct sk_buff *skb, struct hsi_msg *msg)
 		sg = sg_next(sg);
 		BUG_ON(!sg);
 		frag = &skb_shinfo(skb)->frags[i];
-		sg_set_page(sg, frag->page.p, frag->size, frag->page_offset);
+		sg_set_page(sg, skb_page_frag(frag), frag->size,
+				frag->page_offset);
 	}
 }
 
diff --git a/drivers/net/ethernet/3com/3c59x.c b/drivers/net/ethernet/3com/3c59x.c
index 147051404194..7be91e896f2d 100644
--- a/drivers/net/ethernet/3com/3c59x.c
+++ b/drivers/net/ethernet/3com/3c59x.c
@@ -2175,7 +2175,7 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
 			dma_addr = skb_frag_dma_map(vp->gendev, frag,
 						    0,
-						    frag->size,
+						    skb_frag_size(frag),
 						    DMA_TO_DEVICE);
 			if (dma_mapping_error(vp->gendev, dma_addr)) {
 				for(i = i-1; i >= 0; i--)
diff --git a/drivers/net/ethernet/agere/et131x.c b/drivers/net/ethernet/agere/et131x.c
index ea34bcb868b5..9a587ac1377a 100644
--- a/drivers/net/ethernet/agere/et131x.c
+++ b/drivers/net/ethernet/agere/et131x.c
@@ -2488,11 +2488,11 @@ static int nic_send_packet(struct et131x_adapter *adapter, struct tcb *tcb)
 				frag++;
 			}
 		} else {
-			desc[frag].len_vlan = frags[i - 1].size;
+			desc[frag].len_vlan = skb_frag_size(&frags[i - 1]);
 			dma_addr = skb_frag_dma_map(&adapter->pdev->dev,
 						    &frags[i - 1],
 						    0,
-						    frags[i - 1].size,
+						    desc[frag].len_vlan,
 						    DMA_TO_DEVICE);
 			desc[frag].addr_lo = lower_32_bits(dma_addr);
 			desc[frag].addr_hi = upper_32_bits(dma_addr);
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
index 50dd6bf176d0..f4714e14bced 100644
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
@@ -352,7 +352,8 @@ static int xgene_enet_work_msg(struct sk_buff *skb, u64 *hopinfo)
 				nr_frags = skb_shinfo(skb)->nr_frags;
 
 				for (i = 0; i < 2 && i < nr_frags; i++)
-					len += skb_shinfo(skb)->frags[i].size;
+					len += skb_frag_size(
+						&skb_shinfo(skb)->frags[i]);
 
 				/* HW requires header must reside in 3 buffer */
 				if (unlikely(hdr_len > len)) {
diff --git a/drivers/net/ethernet/calxeda/xgmac.c b/drivers/net/ethernet/calxeda/xgmac.c
index 13741ee49b9b..804dadc97fd1 100644
--- a/drivers/net/ethernet/calxeda/xgmac.c
+++ b/drivers/net/ethernet/calxeda/xgmac.c
@@ -1115,7 +1115,7 @@ static netdev_tx_t xgmac_xmit(struct sk_buff *skb, struct net_device *dev)
 	for (i = 0; i < nfrags; i++) {
 		skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
 
-		len = frag->size;
+		len = skb_frag_size(frag);
 
 		paddr = skb_frag_dma_map(priv->device, frag, 0, len,
 					 DMA_TO_DEVICE);
diff --git a/drivers/net/ethernet/cavium/liquidio/lio_main.c b/drivers/net/ethernet/cavium/liquidio/lio_main.c
index fb6f813cff65..739b3127598c 100644
--- a/drivers/net/ethernet/cavium/liquidio/lio_main.c
+++ b/drivers/net/ethernet/cavium/liquidio/lio_main.c
@@ -1496,7 +1496,7 @@ static void free_netsgbuf(void *buf)
 
 		pci_unmap_page((lio->oct_dev)->pci_dev,
 			       g->sg[(i >> 2)].ptr[(i & 3)],
-			       frag->size, DMA_TO_DEVICE);
+			       skb_frag_size(frag), DMA_TO_DEVICE);
 		i++;
 	}
 
@@ -1539,7 +1539,7 @@ static void free_netsgbuf_with_resp(void *buf)
 
 		pci_unmap_page((lio->oct_dev)->pci_dev,
 			       g->sg[(i >> 2)].ptr[(i & 3)],
-			       frag->size, DMA_TO_DEVICE);
+			       skb_frag_size(frag), DMA_TO_DEVICE);
 		i++;
 	}
 
@@ -2462,11 +2462,9 @@ static netdev_tx_t liquidio_xmit(struct sk_buff *skb, struct net_device *netdev)
 			frag = &skb_shinfo(skb)->frags[i - 1];
 
 			g->sg[(i >> 2)].ptr[(i & 3)] =
-				dma_map_page(&oct->pci_dev->dev,
-					     frag->page.p,
-					     frag->page_offset,
-					     frag->size,
-					     DMA_TO_DEVICE);
+				skb_frag_dma_map(&oct->pci_dev->dev,
+					         frag, 0, skb_frag_size(frag),
+						 DMA_TO_DEVICE);
 
 			if (dma_mapping_error(&oct->pci_dev->dev,
 					      g->sg[i >> 2].ptr[i & 3])) {
@@ -2478,7 +2476,7 @@ static netdev_tx_t liquidio_xmit(struct sk_buff *skb, struct net_device *netdev)
 					frag = &skb_shinfo(skb)->frags[j - 1];
 					dma_unmap_page(&oct->pci_dev->dev,
 						       g->sg[j >> 2].ptr[j & 3],
-						       frag->size,
+						       skb_frag_size(frag),
 						       DMA_TO_DEVICE);
 				}
 				dev_err(&oct->pci_dev->dev, "%s DMA mapping error 3\n",
@@ -2486,7 +2484,8 @@ static netdev_tx_t liquidio_xmit(struct sk_buff *skb, struct net_device *netdev)
 				return NETDEV_TX_BUSY;
 			}
 
-			add_sg_size(&g->sg[(i >> 2)], frag->size, (i & 3));
+			add_sg_size(&g->sg[(i >> 2)], skb_frag_size(frag),
+				    (i & 3));
 			i++;
 		}
 
diff --git a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c b/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c
index 54b245797d2e..8706714c8b2f 100644
--- a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c
+++ b/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c
@@ -841,7 +841,7 @@ static void free_netsgbuf(void *buf)
 
 		pci_unmap_page((lio->oct_dev)->pci_dev,
 			       g->sg[(i >> 2)].ptr[(i & 3)],
-			       frag->size, DMA_TO_DEVICE);
+			       skb_frag_size(frag), DMA_TO_DEVICE);
 		i++;
 	}
 
@@ -885,7 +885,7 @@ static void free_netsgbuf_with_resp(void *buf)
 
 		pci_unmap_page((lio->oct_dev)->pci_dev,
 			       g->sg[(i >> 2)].ptr[(i & 3)],
-			       frag->size, DMA_TO_DEVICE);
+			       skb_frag_size(frag), DMA_TO_DEVICE);
 		i++;
 	}
 
@@ -1535,10 +1535,8 @@ static netdev_tx_t liquidio_xmit(struct sk_buff *skb, struct net_device *netdev)
 			frag = &skb_shinfo(skb)->frags[i - 1];
 
 			g->sg[(i >> 2)].ptr[(i & 3)] =
-				dma_map_page(&oct->pci_dev->dev,
-					     frag->page.p,
-					     frag->page_offset,
-					     frag->size,
+				skb_frag_dma_map(&oct->pci_dev->dev,
+					     frag, 0, skb_frag_size(frag),
 					     DMA_TO_DEVICE);
 			if (dma_mapping_error(&oct->pci_dev->dev,
 					      g->sg[i >> 2].ptr[i & 3])) {
@@ -1550,7 +1548,7 @@ static netdev_tx_t liquidio_xmit(struct sk_buff *skb, struct net_device *netdev)
 					frag = &skb_shinfo(skb)->frags[j - 1];
 					dma_unmap_page(&oct->pci_dev->dev,
 						       g->sg[j >> 2].ptr[j & 3],
-						       frag->size,
+						       skb_frag_size(frag),
 						       DMA_TO_DEVICE);
 				}
 				dev_err(&oct->pci_dev->dev, "%s DMA mapping error 3\n",
@@ -1558,7 +1556,8 @@ static netdev_tx_t liquidio_xmit(struct sk_buff *skb, struct net_device *netdev)
 				return NETDEV_TX_BUSY;
 			}
 
-			add_sg_size(&g->sg[(i >> 2)], frag->size, (i & 3));
+			add_sg_size(&g->sg[(i >> 2)], skb_frag_size(frag),
+				    (i & 3));
 			i++;
 		}
 
diff --git a/drivers/net/ethernet/cortina/gemini.c b/drivers/net/ethernet/cortina/gemini.c
index 949103db8a8a..f30eb73cf1cf 100644
--- a/drivers/net/ethernet/cortina/gemini.c
+++ b/drivers/net/ethernet/cortina/gemini.c
@@ -1182,9 +1182,8 @@ static int gmac_map_tx_bufs(struct net_device *netdev, struct sk_buff *skb,
 			buflen = skb_headlen(skb);
 		} else {
 			skb_frag = skb_si->frags + frag;
-			buffer = page_address(skb_frag_page(skb_frag)) +
-				 skb_frag->page_offset;
-			buflen = skb_frag->size;
+			buffer = skb_frag_address(skb_frag);
+			buflen = skb_frag_size(skb_frag);
 		}
 
 		if (frag == last_frag) {
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index a96ad20ee484..d69dad647cee 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -365,7 +365,7 @@ fec_enet_txq_submit_frag_skb(struct fec_enet_priv_tx_q *txq,
 		status = fec16_to_cpu(bdp->cbd_sc);
 		status &= ~BD_ENET_TX_STATS;
 		status |= (BD_ENET_TX_TC | BD_ENET_TX_READY);
-		frag_len = skb_shinfo(skb)->frags[frag].size;
+		frag_len = skb_frag_size(&skb_shinfo(skb)->frags[frag]);
 
 		/* Handle the last BD specially */
 		if (frag == nr_frags - 1) {
@@ -387,7 +387,7 @@ fec_enet_txq_submit_frag_skb(struct fec_enet_priv_tx_q *txq,
 			ebdp->cbd_esc = cpu_to_fec32(estatus);
 		}
 
-		bufaddr = page_address(this_frag->page.p) + this_frag->page_offset;
+		bufaddr = skb_frag_address(this_frag);
 
 		index = fec_enet_get_bd_index(bdp, &txq->bd);
 		if (((unsigned long) bufaddr) & fep->tx_align ||
diff --git a/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c b/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c
index e5d853b7b454..add57b9dd8a5 100644
--- a/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c
+++ b/drivers/net/ethernet/hisilicon/hix5hd2_gmac.c
@@ -723,7 +723,7 @@ static int hix5hd2_fill_sg_desc(struct hix5hd2_priv *priv,
 
 	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
 		skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
-		int len = frag->size;
+		int len = skb_frag_size(frag);
 
 		addr = skb_frag_dma_map(priv->dev, frag, 0, len, DMA_TO_DEVICE);
 		ret = dma_mapping_error(priv->dev, addr);
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_main.c b/drivers/net/ethernet/intel/fm10k/fm10k_main.c
index ecef949f3baa..0fcfcc684fbd 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_main.c
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_main.c
@@ -1079,7 +1079,8 @@ netdev_tx_t fm10k_xmit_frame_ring(struct sk_buff *skb,
 	 * otherwise try next time
 	 */
 	for (f = 0; f < skb_shinfo(skb)->nr_frags; f++)
-		count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size);
+		count += TXD_USE_COUNT(skb_frag_size(
+						&skb_shinfo(skb)->frags[f]));
 
 	if (fm10k_maybe_stop_tx(tx_ring, count + 3)) {
 		tx_ring->tx_stats.tx_busy++;
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index 3269d8e94744..43378101b5ae 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -6087,7 +6087,8 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb,
 	 * otherwise try next time
 	 */
 	for (f = 0; f < skb_shinfo(skb)->nr_frags; f++)
-		count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size);
+		count += TXD_USE_COUNT(skb_frag_size(
+						&skb_shinfo(skb)->frags[f]));
 
 	if (igb_maybe_stop_tx(tx_ring, count + 3)) {
 		/* this is a hard error */
diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c
index 87a11879bf2d..6d9a0e66a382 100644
--- a/drivers/net/ethernet/intel/igc/igc_main.c
+++ b/drivers/net/ethernet/intel/igc/igc_main.c
@@ -950,7 +950,8 @@ static netdev_tx_t igc_xmit_frame_ring(struct sk_buff *skb,
 	 * otherwise try next time
 	 */
 	for (f = 0; f < skb_shinfo(skb)->nr_frags; f++)
-		count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size);
+		count += TXD_USE_COUNT(skb_frag_size(
+						&skb_shinfo(skb)->frags[f]));
 
 	if (igc_maybe_stop_tx(tx_ring, count + 3)) {
 		/* this is a hard error */
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index e100054a3765..4a0e4091978f 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -8607,7 +8607,8 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
 	 * otherwise try next time
 	 */
 	for (f = 0; f < skb_shinfo(skb)->nr_frags; f++)
-		count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size);
+		count += TXD_USE_COUNT(skb_frag_size(
+						&skb_shinfo(skb)->frags[f]));
 
 	if (ixgbe_maybe_stop_tx(tx_ring, count + 3)) {
 		tx_ring->tx_stats.tx_busy++;
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
index c0a3718b2e2a..972f8a246a83 100644
--- a/drivers/net/ethernet/marvell/mvneta.c
+++ b/drivers/net/ethernet/marvell/mvneta.c
@@ -2349,10 +2349,10 @@ static int mvneta_tx_frag_process(struct mvneta_port *pp, struct sk_buff *skb,
 
 	for (i = 0; i < nr_frags; i++) {
 		skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
-		void *addr = page_address(frag->page.p) + frag->page_offset;
+		void *addr = skb_frag_address(frag);
 
 		tx_desc = mvneta_txq_next_desc_get(txq);
-		tx_desc->data_size = frag->size;
+		tx_desc->data_size = skb_frag_size(frag);
 
 		tx_desc->buf_phys_addr =
 			dma_map_single(pp->dev->dev.parent, addr,
diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
index 25fbed2b8d94..2ed390a7edce 100644
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
@@ -2822,14 +2822,15 @@ static int mvpp2_tx_frag_process(struct mvpp2_port *port, struct sk_buff *skb,
 
 	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
 		skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
-		void *addr = page_address(frag->page.p) + frag->page_offset;
+		void *addr = skb_frag_address(frag);
 
 		tx_desc = mvpp2_txq_next_desc_get(aggr_txq);
 		mvpp2_txdesc_txq_set(port, tx_desc, txq->id);
-		mvpp2_txdesc_size_set(port, tx_desc, frag->size);
+		mvpp2_txdesc_size_set(port, tx_desc, skb_frag_size(frag));
 
 		buf_dma_addr = dma_map_single(port->dev->dev.parent, addr,
-					      frag->size, DMA_TO_DEVICE);
+					      skb_frag_size(frag),
+					      DMA_TO_DEVICE);
 		if (dma_mapping_error(port->dev->dev.parent, buf_dma_addr)) {
 			mvpp2_txq_desc_put(txq);
 			goto cleanup;
diff --git a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
index e0340f778d8f..09da5a69f690 100644
--- a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
+++ b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
@@ -1365,7 +1365,7 @@ myri10ge_rx_done(struct myri10ge_slice_state *ss, int len, __wsum csum)
 
 	/* remove padding */
 	rx_frags[0].page_offset += MXGEFW_PAD;
-	rx_frags[0].size -= MXGEFW_PAD;
+	skb_frag_size_sub(&rx_frags[0], MXGEFW_PAD);
 	len -= MXGEFW_PAD;
 
 	skb->len = len;
diff --git a/drivers/net/ethernet/qualcomm/emac/emac-mac.c b/drivers/net/ethernet/qualcomm/emac/emac-mac.c
index 20d2400ad300..a57b84d12af4 100644
--- a/drivers/net/ethernet/qualcomm/emac/emac-mac.c
+++ b/drivers/net/ethernet/qualcomm/emac/emac-mac.c
@@ -1398,9 +1398,10 @@ static void emac_tx_fill_tpd(struct emac_adapter *adpt,
 		frag = &skb_shinfo(skb)->frags[i];
 
 		tpbuf = GET_TPD_BUFFER(tx_q, tx_q->tpd.produce_idx);
-		tpbuf->length = frag->size;
+		tpbuf->length = skb_frag_size(frag);
 		tpbuf->dma_addr = dma_map_page(adpt->netdev->dev.parent,
-					       frag->page.p, frag->page_offset,
+					       skb_frag_page(frag),
+					       frag->page_offset,
 					       tpbuf->length, DMA_TO_DEVICE);
 		ret = dma_mapping_error(adpt->netdev->dev.parent,
 					tpbuf->dma_addr);
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 504282af27e5..486a295489f1 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -1338,7 +1338,7 @@ static int build_dma_sg(const struct sk_buff *skb, struct urb *urb)
 		struct skb_frag_struct *f = &skb_shinfo(skb)->frags[i];
 
 		total_len += skb_frag_size(f);
-		sg_set_page(&urb->sg[i + s], f->page.p, f->size,
+		sg_set_page(&urb->sg[i + s], skb_frag_page(f), skb_frag_size(f),
 				f->page_offset);
 	}
 	urb->transfer_buffer_length = total_len;
diff --git a/drivers/net/wireless/ath/wil6210/txrx.c b/drivers/net/wireless/ath/wil6210/txrx.c
index 4ccfd1404458..298ffb7c946f 100644
--- a/drivers/net/wireless/ath/wil6210/txrx.c
+++ b/drivers/net/wireless/ath/wil6210/txrx.c
@@ -1653,7 +1653,7 @@ static int __wil_tx_vring_tso(struct wil6210_priv *wil, struct wil6210_vif *vif,
 				     len);
 		} else {
 			frag = &skb_shinfo(skb)->frags[f];
-			len = frag->size;
+			len = skb_frag_size(frag);
 			wil_dbg_txrx(wil, "TSO: frag[%d]: len %u\n", f, len);
 		}
 
@@ -1674,8 +1674,8 @@ static int __wil_tx_vring_tso(struct wil6210_priv *wil, struct wil6210_vif *vif,
 
 			if (!headlen) {
 				pa = skb_frag_dma_map(dev, frag,
-						      frag->size - len, lenmss,
-						      DMA_TO_DEVICE);
+						      skb_frag_size(frag) - len,
+						      lenmss, DMA_TO_DEVICE);
 				vring->ctx[i].mapped_as = wil_mapped_as_page;
 			} else {
 				pa = dma_map_single(dev,
diff --git a/drivers/net/wireless/ath/wil6210/txrx_edma.c b/drivers/net/wireless/ath/wil6210/txrx_edma.c
index c38773878ae3..d0702f5a02dc 100644
--- a/drivers/net/wireless/ath/wil6210/txrx_edma.c
+++ b/drivers/net/wireless/ath/wil6210/txrx_edma.c
@@ -1445,7 +1445,7 @@ static int __wil_tx_ring_tso_edma(struct wil6210_priv *wil,
 	/* Rest of the descriptors are from the SKB fragments */
 	for (f = 0; f < nr_frags; f++) {
 		skb_frag_t *frag = &skb_shinfo(skb)->frags[f];
-		int len = frag->size;
+		int len = skb_frag_size(frag);
 
 		wil_dbg_txrx(wil, "TSO: frag[%d]: len %u, descs_used %d\n", f,
 			     len, descs_used);
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
index 1d9940d4e8c7..a96c5c2a2c5a 100644
--- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c
@@ -1055,7 +1055,7 @@ static int xenvif_handle_frag_list(struct xenvif_queue *queue, struct sk_buff *s
 			int j;
 			skb->truesize += skb->data_len;
 			for (j = 0; j < i; j++)
-				put_page(frags[j].page.p);
+				put_page(skb_frag_page(&frags[j]));
 			return -ENOMEM;
 		}
 
@@ -1067,7 +1067,7 @@ static int xenvif_handle_frag_list(struct xenvif_queue *queue, struct sk_buff *s
 			BUG();
 
 		offset += len;
-		frags[i].page.p = page;
+		__skb_frag_set_page(&frags[i], page);
 		frags[i].page_offset = 0;
 		skb_frag_size_set(&frags[i], len);
 	}
diff --git a/drivers/staging/octeon/ethernet-tx.c b/drivers/staging/octeon/ethernet-tx.c
index 317c9720467c..29a31f37f66b 100644
--- a/drivers/staging/octeon/ethernet-tx.c
+++ b/drivers/staging/octeon/ethernet-tx.c
@@ -281,8 +281,7 @@ int cvm_oct_xmit(struct sk_buff *skb, struct net_device *dev)
 			struct skb_frag_struct *fs = skb_shinfo(skb)->frags + i;
 
 			hw_buffer.s.addr = XKPHYS_TO_PHYS(
-				(u64)(page_address(fs->page.p) +
-				fs->page_offset));
+				(u64)skb_frag_address(fs));
 			hw_buffer.s.size = fs->size;
 			CVM_OCT_SKB_CB(skb)[i + 1] = hw_buffer.u64;
 		}
diff --git a/drivers/target/iscsi/cxgbit/cxgbit_target.c b/drivers/target/iscsi/cxgbit/cxgbit_target.c
index 29b350a0b58f..9cac100b3169 100644
--- a/drivers/target/iscsi/cxgbit/cxgbit_target.c
+++ b/drivers/target/iscsi/cxgbit/cxgbit_target.c
@@ -902,9 +902,9 @@ cxgbit_handle_immediate_data(struct iscsi_cmd *cmd, struct iscsi_scsi_req *hdr,
 		skb_frag_t *dfrag = &ssi->frags[pdu_cb->dfrag_idx];
 
 		sg_init_table(&ccmd->sg, 1);
-		sg_set_page(&ccmd->sg, dfrag->page.p, skb_frag_size(dfrag),
-			    dfrag->page_offset);
-		get_page(dfrag->page.p);
+		sg_set_page(&ccmd->sg, skb_frag_page(dfrag),
+				skb_frag_size(dfrag), dfrag->page_offset);
+		get_page(skb_frag_page(dfrag));
 
 		cmd->se_cmd.t_data_sg = &ccmd->sg;
 		cmd->se_cmd.t_data_nents = 1;
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 4/7] net: Use skb accessors in network core
  2019-05-01 14:44 [PATCH v2 0/7] Convert skb_frag_t to bio_vec Matthew Wilcox
                   ` (2 preceding siblings ...)
  2019-05-01 14:44 ` [PATCH v2 3/7] net: Use skb accessors in network drivers Matthew Wilcox
@ 2019-05-01 14:44 ` Matthew Wilcox
  2019-05-01 14:44 ` [PATCH v2 5/7] net: Rename skb_frag page to bv_page Matthew Wilcox
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 14+ messages in thread
From: Matthew Wilcox @ 2019-05-01 14:44 UTC (permalink / raw)
  To: davem; +Cc: Matthew Wilcox (Oracle), hch, netdev

From: "Matthew Wilcox (Oracle)" <willy@infradead.org>

In preparation for renaming skb_frag_t members, use the fine accessors
which already exist.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 net/core/skbuff.c    | 22 +++++++++++++---------
 net/core/tso.c       |  8 ++++----
 net/ipv4/tcp.c       | 12 +++++++-----
 net/kcm/kcmsock.c    |  8 ++++----
 net/tls/tls_device.c | 14 +++++++-------
 5 files changed, 35 insertions(+), 29 deletions(-)

diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 40796b8bf820..b689e13be808 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -2325,19 +2325,19 @@ int skb_send_sock_locked(struct sock *sk, struct sk_buff *skb, int offset,
 	for (fragidx = 0; fragidx < skb_shinfo(skb)->nr_frags; fragidx++) {
 		skb_frag_t *frag  = &skb_shinfo(skb)->frags[fragidx];
 
-		if (offset < frag->size)
+		if (offset < skb_frag_size(frag))
 			break;
 
-		offset -= frag->size;
+		offset -= skb_frag_size(frag);
 	}
 
 	for (; len && fragidx < skb_shinfo(skb)->nr_frags; fragidx++) {
 		skb_frag_t *frag  = &skb_shinfo(skb)->frags[fragidx];
 
-		slen = min_t(size_t, len, frag->size - offset);
+		slen = min_t(size_t, len, skb_frag_size(frag) - offset);
 
 		while (slen) {
-			ret = kernel_sendpage_locked(sk, frag->page.p,
+			ret = kernel_sendpage_locked(sk, skb_frag_page(frag),
 						     frag->page_offset + offset,
 						     slen, MSG_DONTWAIT);
 			if (ret <= 0)
@@ -2809,11 +2809,15 @@ skb_zerocopy(struct sk_buff *to, struct sk_buff *from, int len, int hlen)
 	skb_zerocopy_clone(to, from, GFP_ATOMIC);
 
 	for (i = 0; i < skb_shinfo(from)->nr_frags; i++) {
+		int size;
+
 		if (!len)
 			break;
 		skb_shinfo(to)->frags[j] = skb_shinfo(from)->frags[i];
-		skb_shinfo(to)->frags[j].size = min_t(int, skb_shinfo(to)->frags[j].size, len);
-		len -= skb_shinfo(to)->frags[j].size;
+		size = min_t(int, skb_frag_size(&skb_shinfo(to)->frags[j]),
+					len);
+		skb_frag_size_set(&skb_shinfo(to)->frags[j], size);
+		len -= size;
 		skb_frag_ref(to, j);
 		j++;
 	}
@@ -3459,10 +3463,10 @@ static inline skb_frag_t skb_head_frag_to_page_desc(struct sk_buff *frag_skb)
 	struct page *page;
 
 	page = virt_to_head_page(frag_skb->head);
-	head_frag.page.p = page;
+	__skb_frag_set_page(&head_frag, page);
 	head_frag.page_offset = frag_skb->data -
 		(unsigned char *)page_address(page);
-	head_frag.size = skb_headlen(frag_skb);
+	skb_frag_size_set(&head_frag, skb_headlen(frag_skb));
 	return head_frag;
 }
 
@@ -3855,7 +3859,7 @@ int skb_gro_receive(struct sk_buff *p, struct sk_buff *skb)
 
 		pinfo->nr_frags = nr_frags + 1 + skbinfo->nr_frags;
 
-		frag->page.p	  = page;
+		__skb_frag_set_page(frag, page);
 		frag->page_offset = first_offset;
 		skb_frag_size_set(frag, first_size);
 
diff --git a/net/core/tso.c b/net/core/tso.c
index 43f4eba61933..d4d5c077ad72 100644
--- a/net/core/tso.c
+++ b/net/core/tso.c
@@ -55,8 +55,8 @@ void tso_build_data(struct sk_buff *skb, struct tso_t *tso, int size)
 		skb_frag_t *frag = &skb_shinfo(skb)->frags[tso->next_frag_idx];
 
 		/* Move to next segment */
-		tso->size = frag->size;
-		tso->data = page_address(frag->page.p) + frag->page_offset;
+		tso->size = skb_frag_size(frag);
+		tso->data = skb_frag_address(frag);
 		tso->next_frag_idx++;
 	}
 }
@@ -79,8 +79,8 @@ void tso_start(struct sk_buff *skb, struct tso_t *tso)
 		skb_frag_t *frag = &skb_shinfo(skb)->frags[tso->next_frag_idx];
 
 		/* Move to next segment */
-		tso->size = frag->size;
-		tso->data = page_address(frag->page.p) + frag->page_offset;
+		tso->size = skb_frag_size(frag);
+		tso->data = skb_frag_address(frag);
 		tso->next_frag_idx++;
 	}
 }
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 6baa6dc1b13b..1a4c2efb03f8 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -1801,19 +1801,21 @@ static int tcp_zerocopy_receive(struct sock *sk,
 				break;
 			frags = skb_shinfo(skb)->frags;
 			while (offset) {
-				if (frags->size > offset)
+				if (skb_frag_size(frags) > offset)
 					goto out;
-				offset -= frags->size;
+				offset -= skb_frag_size(frags);
 				frags++;
 			}
 		}
-		if (frags->size != PAGE_SIZE || frags->page_offset) {
+		if (skb_frag_size(frags) != PAGE_SIZE || frags->page_offset) {
 			int remaining = zc->recv_skip_hint;
+			int size = skb_frag_size(frags);
 
-			while (remaining && (frags->size != PAGE_SIZE ||
+			while (remaining && (size != PAGE_SIZE ||
 					     frags->page_offset)) {
-				remaining -= frags->size;
+				remaining -= size;
 				frags++;
+				size = skb_frag_size(frags);
 			}
 			zc->recv_skip_hint -= remaining;
 			break;
diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c
index 44fdc641710d..9a16a4d2a83a 100644
--- a/net/kcm/kcmsock.c
+++ b/net/kcm/kcmsock.c
@@ -638,15 +638,15 @@ static int kcm_write_msgs(struct kcm_sock *kcm)
 			frag_offset = 0;
 do_frag:
 			frag = &skb_shinfo(skb)->frags[fragidx];
-			if (WARN_ON(!frag->size)) {
+			if (WARN_ON(!skb_frag_size(frag))) {
 				ret = -EINVAL;
 				goto out;
 			}
 
 			ret = kernel_sendpage(psock->sk->sk_socket,
-					      frag->page.p,
+					      skb_frag_page(frag),
 					      frag->page_offset + frag_offset,
-					      frag->size - frag_offset,
+					      skb_frag_size(frag) - frag_offset,
 					      MSG_DONTWAIT);
 			if (ret <= 0) {
 				if (ret == -EAGAIN) {
@@ -681,7 +681,7 @@ static int kcm_write_msgs(struct kcm_sock *kcm)
 			sent += ret;
 			frag_offset += ret;
 			KCM_STATS_ADD(psock->stats.tx_bytes, ret);
-			if (frag_offset < frag->size) {
+			if (frag_offset < skb_frag_size(frag)) {
 				/* Not finished with this frag */
 				goto do_frag;
 			}
diff --git a/net/tls/tls_device.c b/net/tls/tls_device.c
index cc0256939eb6..80c5776e3ec0 100644
--- a/net/tls/tls_device.c
+++ b/net/tls/tls_device.c
@@ -233,14 +233,14 @@ static void tls_append_frag(struct tls_record_info *record,
 	skb_frag_t *frag;
 
 	frag = &record->frags[record->num_frags - 1];
-	if (frag->page.p == pfrag->page &&
-	    frag->page_offset + frag->size == pfrag->offset) {
-		frag->size += size;
+	if (skb_frag_page(frag) == pfrag->page &&
+	    frag->page_offset + skb_frag_size(frag) == pfrag->offset) {
+		skb_frag_size_add(frag, size);
 	} else {
 		++frag;
-		frag->page.p = pfrag->page;
+		__skb_frag_set_page(frag, pfrag->page);
 		frag->page_offset = pfrag->offset;
-		frag->size = size;
+		skb_frag_size_set(frag, size);
 		++record->num_frags;
 		get_page(pfrag->page);
 	}
@@ -287,8 +287,8 @@ static int tls_push_record(struct sock *sk,
 		frag = &record->frags[i];
 		sg_unmark_end(&offload_ctx->sg_tx_data[i]);
 		sg_set_page(&offload_ctx->sg_tx_data[i], skb_frag_page(frag),
-			    frag->size, frag->page_offset);
-		sk_mem_charge(sk, frag->size);
+			    skb_frag_size(frag), frag->page_offset);
+		sk_mem_charge(sk, skb_frag_size(frag));
 		get_page(skb_frag_page(frag));
 	}
 	sg_mark_end(&offload_ctx->sg_tx_data[record->num_frags - 1]);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 5/7] net: Rename skb_frag page to bv_page
  2019-05-01 14:44 [PATCH v2 0/7] Convert skb_frag_t to bio_vec Matthew Wilcox
                   ` (3 preceding siblings ...)
  2019-05-01 14:44 ` [PATCH v2 4/7] net: Use skb accessors in network core Matthew Wilcox
@ 2019-05-01 14:44 ` Matthew Wilcox
  2019-05-01 14:44 ` [PATCH v2 6/7] net: Rename skb_frag_t size to bv_len Matthew Wilcox
  2019-05-01 14:44 ` [PATCH v2 7/7] net: Convert skb_frag_t to bio_vec Matthew Wilcox
  6 siblings, 0 replies; 14+ messages in thread
From: Matthew Wilcox @ 2019-05-01 14:44 UTC (permalink / raw)
  To: davem; +Cc: Matthew Wilcox (Oracle), hch, netdev

From: "Matthew Wilcox (Oracle)" <willy@infradead.org>

One step closer to turning the skb_frag_t into a bio_vec.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 include/linux/skbuff.h | 12 +++++-------
 net/core/skbuff.c      |  2 +-
 2 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 9c6193a57241..a75e85226bea 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -315,9 +315,7 @@ extern int sysctl_max_skb_frags;
 typedef struct skb_frag_struct skb_frag_t;
 
 struct skb_frag_struct {
-	struct {
-		struct page *p;
-	} page;
+	struct page *bv_page;
 	__u32 size;
 	__u32 page_offset;
 };
@@ -378,7 +376,7 @@ static inline bool skb_frag_must_loop(struct page *p)
  *	skb_frag_foreach_page - loop over pages in a fragment
  *
  *	@f:		skb frag to operate on
- *	@f_off:		offset from start of f->page.p
+ *	@f_off:		offset from start of f->bv_page
  *	@f_len:		length from f_off to loop over
  *	@p:		(temp var) current page
  *	@p_off:		(temp var) offset from start of current page,
@@ -2061,7 +2059,7 @@ static inline void __skb_fill_page_desc(struct sk_buff *skb, int i,
 	 * that not all callers have unique ownership of the page but rely
 	 * on page_is_pfmemalloc doing the right thing(tm).
 	 */
-	frag->page.p		  = page;
+	frag->bv_page		  = page;
 	frag->page_offset	  = off;
 	skb_frag_size_set(frag, size);
 
@@ -2849,7 +2847,7 @@ static inline void skb_propagate_pfmemalloc(struct page *page,
  */
 static inline struct page *skb_frag_page(const skb_frag_t *frag)
 {
-	return frag->page.p;
+	return frag->bv_page;
 }
 
 /**
@@ -2935,7 +2933,7 @@ static inline void *skb_frag_address_safe(const skb_frag_t *frag)
  */
 static inline void __skb_frag_set_page(skb_frag_t *frag, struct page *page)
 {
-	frag->page.p = page;
+	frag->bv_page = page;
 }
 
 /**
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index b689e13be808..357b6b2fc58b 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -3198,7 +3198,7 @@ int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen)
 
 		} else {
 			__skb_frag_ref(fragfrom);
-			fragto->page = fragfrom->page;
+			fragto->bv_page = fragfrom->bv_page;
 			fragto->page_offset = fragfrom->page_offset;
 			skb_frag_size_set(fragto, todo);
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 6/7] net: Rename skb_frag_t size to bv_len
  2019-05-01 14:44 [PATCH v2 0/7] Convert skb_frag_t to bio_vec Matthew Wilcox
                   ` (4 preceding siblings ...)
  2019-05-01 14:44 ` [PATCH v2 5/7] net: Rename skb_frag page to bv_page Matthew Wilcox
@ 2019-05-01 14:44 ` Matthew Wilcox
  2019-05-02  9:49   ` kbuild test robot
                     ` (2 more replies)
  2019-05-01 14:44 ` [PATCH v2 7/7] net: Convert skb_frag_t to bio_vec Matthew Wilcox
  6 siblings, 3 replies; 14+ messages in thread
From: Matthew Wilcox @ 2019-05-01 14:44 UTC (permalink / raw)
  To: davem; +Cc: Matthew Wilcox (Oracle), hch, netdev

From: "Matthew Wilcox (Oracle)" <willy@infradead.org>

Improved compatibility with bvec

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 include/linux/skbuff.h | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index a75e85226bea..df07b3144c77 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -316,7 +316,7 @@ typedef struct skb_frag_struct skb_frag_t;
 
 struct skb_frag_struct {
 	struct page *bv_page;
-	__u32 size;
+	unsigned int bv_len;
 	__u32 page_offset;
 };
 
@@ -326,7 +326,7 @@ struct skb_frag_struct {
  */
 static inline unsigned int skb_frag_size(const skb_frag_t *frag)
 {
-	return frag->size;
+	return frag->bv_len;
 }
 
 /**
@@ -336,7 +336,7 @@ static inline unsigned int skb_frag_size(const skb_frag_t *frag)
  */
 static inline void skb_frag_size_set(skb_frag_t *frag, unsigned int size)
 {
-	frag->size = size;
+	frag->bv_len = size;
 }
 
 /**
@@ -346,7 +346,7 @@ static inline void skb_frag_size_set(skb_frag_t *frag, unsigned int size)
  */
 static inline void skb_frag_size_add(skb_frag_t *frag, int delta)
 {
-	frag->size += delta;
+	frag->bv_len += delta;
 }
 
 /**
@@ -356,7 +356,7 @@ static inline void skb_frag_size_add(skb_frag_t *frag, int delta)
  */
 static inline void skb_frag_size_sub(skb_frag_t *frag, int delta)
 {
-	frag->size -= delta;
+	frag->bv_len -= delta;
 }
 
 /**
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v2 7/7] net: Convert skb_frag_t to bio_vec
  2019-05-01 14:44 [PATCH v2 0/7] Convert skb_frag_t to bio_vec Matthew Wilcox
                   ` (5 preceding siblings ...)
  2019-05-01 14:44 ` [PATCH v2 6/7] net: Rename skb_frag_t size to bv_len Matthew Wilcox
@ 2019-05-01 14:44 ` Matthew Wilcox
  2019-05-02  9:52   ` kbuild test robot
  2019-05-02 10:06   ` kbuild test robot
  6 siblings, 2 replies; 14+ messages in thread
From: Matthew Wilcox @ 2019-05-01 14:44 UTC (permalink / raw)
  To: davem; +Cc: Matthew Wilcox (Oracle), hch, netdev

From: "Matthew Wilcox (Oracle)" <willy@infradead.org>

There are a lot of users of frag->page_offset, and of struct
skb_frag_struct, so use a union and a compatibility define respectively
to avoid converting those users today.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 include/linux/bvec.h   | 5 ++++-
 include/linux/skbuff.h | 9 +++------
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/include/linux/bvec.h b/include/linux/bvec.h
index ff13cbc1887d..49a8ad6c331b 100644
--- a/include/linux/bvec.h
+++ b/include/linux/bvec.h
@@ -31,7 +31,10 @@
 struct bio_vec {
 	struct page	*bv_page;
 	unsigned int	bv_len;
-	unsigned int	bv_offset;
+	union {
+		__u32		page_offset;
+		unsigned int	bv_offset;
+	};
 };
 
 struct bvec_iter {
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index df07b3144c77..d61d496e0083 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -18,6 +18,7 @@
 #include <linux/compiler.h>
 #include <linux/time.h>
 #include <linux/bug.h>
+#include <linux/bvec.h>
 #include <linux/cache.h>
 #include <linux/rbtree.h>
 #include <linux/socket.h>
@@ -312,13 +313,9 @@ extern int sysctl_max_skb_frags;
  */
 #define GSO_BY_FRAGS	0xFFFF
 
-typedef struct skb_frag_struct skb_frag_t;
+#define skb_frag_struct bio_vec
 
-struct skb_frag_struct {
-	struct page *bv_page;
-	unsigned int bv_len;
-	__u32 page_offset;
-};
+typedef struct bio_vec skb_frag_t;
 
 /**
  * skb_frag_size - Returns the size of a skb fragment
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 3/7] net: Use skb accessors in network drivers
  2019-05-01 14:44 ` [PATCH v2 3/7] net: Use skb accessors in network drivers Matthew Wilcox
@ 2019-05-01 17:56   ` Matthew Wilcox
  0 siblings, 0 replies; 14+ messages in thread
From: Matthew Wilcox @ 2019-05-01 17:56 UTC (permalink / raw)
  To: davem; +Cc: hch, netdev

On Wed, May 01, 2019 at 07:44:53AM -0700, Matthew Wilcox wrote:
> From: "Matthew Wilcox (Oracle)" <willy@infradead.org>
> 
> In preparation for renaming skb_frag fields, use the fine accessors which
> already exist.

It turns out not all network drivers are under drivers/net.  And others
aren't built on x86 by allyesconfig.

I'll fold this into a future v3.

diff --git a/drivers/crypto/chelsio/chtls/chtls_io.c b/drivers/crypto/chelsio/chtls/chtls_io.c
index 1285a1bceda7..8bfbdb003a20 100644
--- a/drivers/crypto/chelsio/chtls/chtls_io.c
+++ b/drivers/crypto/chelsio/chtls/chtls_io.c
@@ -1137,7 +1137,9 @@ int chtls_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
 			}
 			/* Update the skb. */
 			if (merge) {
-				skb_shinfo(skb)->frags[i - 1].size += copy;
+				skb_frag_size_add(
+						&skb_shinfo(skb)->frags[i - 1],
+						copy);
 			} else {
 				skb_fill_page_desc(skb, i, page, off, copy);
 				if (off + copy < pg_size) {
@@ -1250,7 +1252,7 @@ int chtls_sendpage(struct sock *sk, struct page *page,
 
 		i = skb_shinfo(skb)->nr_frags;
 		if (skb_can_coalesce(skb, i, page, offset)) {
-			skb_shinfo(skb)->frags[i - 1].size += copy;
+			skb_frag_size_add(&skb_shinfo(skb)->frags[i - 1], copy);
 		} else if (i < MAX_SKB_FRAGS) {
 			get_page(page);
 			skb_fill_page_desc(skb, i, page, offset, copy);
diff --git a/drivers/hsi/clients/ssi_protocol.c b/drivers/hsi/clients/ssi_protocol.c
index 9f506c00ad85..7e43559a8652 100644
--- a/drivers/hsi/clients/ssi_protocol.c
+++ b/drivers/hsi/clients/ssi_protocol.c
@@ -194,7 +194,7 @@ static void ssip_skb_to_msg(struct sk_buff *skb, struct hsi_msg *msg)
 		sg = sg_next(sg);
 		BUG_ON(!sg);
 		frag = &skb_shinfo(skb)->frags[i];
-		sg_set_page(sg, skb_page_frag(frag), frag->size,
+		sg_set_page(sg, skb_frag_page(frag), skb_frag_size(frag),
 				frag->page_offset);
 	}
 }
diff --git a/drivers/staging/unisys/visornic/visornic_main.c b/drivers/staging/unisys/visornic/visornic_main.c
index 1c1a470d2e50..bbfc4befcec2 100644
--- a/drivers/staging/unisys/visornic/visornic_main.c
+++ b/drivers/staging/unisys/visornic/visornic_main.c
@@ -285,8 +285,8 @@ static int visor_copy_fragsinfo_from_skb(struct sk_buff *skb,
 			count = add_physinfo_entries(page_to_pfn(
 				  skb_frag_page(&skb_shinfo(skb)->frags[frag])),
 				  skb_shinfo(skb)->frags[frag].page_offset,
-				  skb_shinfo(skb)->frags[frag].size, count,
-				  frags_max, frags);
+				  skb_frag_size(&skb_shinfo(skb)->frags[frag]),
+				  count, frags_max, frags);
 			/* add_physinfo_entries only returns
 			 * zero if the frags array is out of room
 			 * That should never happen because we
diff --git a/drivers/target/iscsi/cxgbit/cxgbit_target.c b/drivers/target/iscsi/cxgbit/cxgbit_target.c
index 9cac100b3169..9121dce05269 100644
--- a/drivers/target/iscsi/cxgbit/cxgbit_target.c
+++ b/drivers/target/iscsi/cxgbit/cxgbit_target.c
@@ -1406,7 +1406,8 @@ static void cxgbit_lro_skb_dump(struct sk_buff *skb)
 			pdu_cb->ddigest, pdu_cb->frags);
 	for (i = 0; i < ssi->nr_frags; i++)
 		pr_info("skb 0x%p, frag %d, off %u, sz %u.\n",
-			skb, i, ssi->frags[i].page_offset, ssi->frags[i].size);
+			skb, i, ssi->frags[i].page_offset,
+			skb_frag_size(&ssi->frags[i]));
 }
 
 static void cxgbit_lro_hskb_reset(struct cxgbit_sock *csk)
@@ -1450,7 +1451,7 @@ cxgbit_lro_skb_merge(struct cxgbit_sock *csk, struct sk_buff *skb, u8 pdu_idx)
 		hpdu_cb->frags++;
 		hpdu_cb->hfrag_idx = hfrag_idx;
 
-		len = hssi->frags[hfrag_idx].size;
+		len = skb_frag_size(&hssi->frags[hfrag_idx]);;
 		hskb->len += len;
 		hskb->data_len += len;
 		hskb->truesize += len;
@@ -1470,7 +1471,7 @@ cxgbit_lro_skb_merge(struct cxgbit_sock *csk, struct sk_buff *skb, u8 pdu_idx)
 
 			get_page(skb_frag_page(&hssi->frags[dfrag_idx]));
 
-			len += hssi->frags[dfrag_idx].size;
+			len += skb_frag_size(&hssi->frags[dfrag_idx]);
 
 			hssi->nr_frags++;
 			hpdu_cb->frags++;

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 6/7] net: Rename skb_frag_t size to bv_len
  2019-05-01 14:44 ` [PATCH v2 6/7] net: Rename skb_frag_t size to bv_len Matthew Wilcox
@ 2019-05-02  9:49   ` kbuild test robot
  2019-05-02 10:03   ` kbuild test robot
  2019-05-02 11:42   ` kbuild test robot
  2 siblings, 0 replies; 14+ messages in thread
From: kbuild test robot @ 2019-05-02  9:49 UTC (permalink / raw)
  To: Matthew Wilcox; +Cc: kbuild-all, davem, Matthew Wilcox (Oracle), hch, netdev

[-- Attachment #1: Type: text/plain, Size: 4636 bytes --]

Hi Matthew,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on net-next/master]
[also build test ERROR on v5.1-rc7]
[cannot apply to next-20190501]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Matthew-Wilcox/Convert-skb_frag_t-to-bio_vec/20190502-161948
config: xtensa-allyesconfig (attached as .config)
compiler: xtensa-linux-gcc (GCC) 8.1.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=8.1.0 make.cross ARCH=xtensa 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>

Note: the linux-review/Matthew-Wilcox/Convert-skb_frag_t-to-bio_vec/20190502-161948 HEAD faadb27a9e0a8480f47f0aca9ca5bee909a63db6 builds fine.
      It only hurts bisectibility.

All errors (new ones prefixed by >>):

   In file included from include/linux/kernel.h:15,
                    from include/linux/list.h:9,
                    from include/linux/timer.h:5,
                    from include/linux/workqueue.h:9,
                    from drivers/target/iscsi/cxgbit/cxgbit_target.c:9:
   drivers/target/iscsi/cxgbit/cxgbit_target.c: In function 'cxgbit_lro_skb_dump':
>> drivers/target/iscsi/cxgbit/cxgbit_target.c:1409:52: error: 'skb_frag_t' {aka 'struct skb_frag_struct'} has no member named 'size'
       skb, i, ssi->frags[i].page_offset, ssi->frags[i].size);
                                                       ^
   include/linux/printk.h:309:34: note: in definition of macro 'pr_info'
     printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
                                     ^~~~~~~~~~~
   drivers/target/iscsi/cxgbit/cxgbit_target.c: In function 'cxgbit_lro_skb_merge':
   drivers/target/iscsi/cxgbit/cxgbit_target.c:1453:31: error: 'skb_frag_t' {aka 'struct skb_frag_struct'} has no member named 'size'
      len = hssi->frags[hfrag_idx].size;
                                  ^
   drivers/target/iscsi/cxgbit/cxgbit_target.c:1473:33: error: 'skb_frag_t' {aka 'struct skb_frag_struct'} has no member named 'size'
       len += hssi->frags[dfrag_idx].size;
                                    ^

vim +1409 drivers/target/iscsi/cxgbit/cxgbit_target.c

9730ffcb Varun Prakash 2016-04-20  1388  
9730ffcb Varun Prakash 2016-04-20  1389  static void cxgbit_lro_skb_dump(struct sk_buff *skb)
9730ffcb Varun Prakash 2016-04-20  1390  {
9730ffcb Varun Prakash 2016-04-20  1391  	struct skb_shared_info *ssi = skb_shinfo(skb);
9730ffcb Varun Prakash 2016-04-20  1392  	struct cxgbit_lro_cb *lro_cb = cxgbit_skb_lro_cb(skb);
9730ffcb Varun Prakash 2016-04-20  1393  	struct cxgbit_lro_pdu_cb *pdu_cb = cxgbit_skb_lro_pdu_cb(skb, 0);
9730ffcb Varun Prakash 2016-04-20  1394  	u8 i;
9730ffcb Varun Prakash 2016-04-20  1395  
9730ffcb Varun Prakash 2016-04-20  1396  	pr_info("skb 0x%p, head 0x%p, 0x%p, len %u,%u, frags %u.\n",
9730ffcb Varun Prakash 2016-04-20  1397  		skb, skb->head, skb->data, skb->len, skb->data_len,
9730ffcb Varun Prakash 2016-04-20  1398  		ssi->nr_frags);
9730ffcb Varun Prakash 2016-04-20  1399  	pr_info("skb 0x%p, lro_cb, csk 0x%p, pdu %u, %u.\n",
9730ffcb Varun Prakash 2016-04-20  1400  		skb, lro_cb->csk, lro_cb->pdu_idx, lro_cb->pdu_totallen);
9730ffcb Varun Prakash 2016-04-20  1401  
9730ffcb Varun Prakash 2016-04-20  1402  	for (i = 0; i < lro_cb->pdu_idx; i++, pdu_cb++)
9730ffcb Varun Prakash 2016-04-20  1403  		pr_info("skb 0x%p, pdu %d, %u, f 0x%x, seq 0x%x, dcrc 0x%x, "
9730ffcb Varun Prakash 2016-04-20  1404  			"frags %u.\n",
9730ffcb Varun Prakash 2016-04-20  1405  			skb, i, pdu_cb->pdulen, pdu_cb->flags, pdu_cb->seq,
9730ffcb Varun Prakash 2016-04-20  1406  			pdu_cb->ddigest, pdu_cb->frags);
9730ffcb Varun Prakash 2016-04-20  1407  	for (i = 0; i < ssi->nr_frags; i++)
9730ffcb Varun Prakash 2016-04-20  1408  		pr_info("skb 0x%p, frag %d, off %u, sz %u.\n",
9730ffcb Varun Prakash 2016-04-20 @1409  			skb, i, ssi->frags[i].page_offset, ssi->frags[i].size);
9730ffcb Varun Prakash 2016-04-20  1410  }
9730ffcb Varun Prakash 2016-04-20  1411  

:::::: The code at line 1409 was first introduced by commit
:::::: 9730ffcb8957e1ce9e7d903f7a5db09038a9db8d cxgbit: add files for cxgbit.ko

:::::: TO: Varun Prakash <varun@chelsio.com>
:::::: CC: Nicholas Bellinger <nab@linux-iscsi.org>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 56126 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 7/7] net: Convert skb_frag_t to bio_vec
  2019-05-01 14:44 ` [PATCH v2 7/7] net: Convert skb_frag_t to bio_vec Matthew Wilcox
@ 2019-05-02  9:52   ` kbuild test robot
  2019-05-02 10:06   ` kbuild test robot
  1 sibling, 0 replies; 14+ messages in thread
From: kbuild test robot @ 2019-05-02  9:52 UTC (permalink / raw)
  To: Matthew Wilcox; +Cc: kbuild-all, davem, Matthew Wilcox (Oracle), hch, netdev

[-- Attachment #1: Type: text/plain, Size: 14855 bytes --]

Hi Matthew,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on net-next/master]
[also build test ERROR on v5.1-rc7]
[cannot apply to next-20190501]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Matthew-Wilcox/Convert-skb_frag_t-to-bio_vec/20190502-161948
config: riscv-allyesconfig (attached as .config)
compiler: riscv64-linux-gcc (GCC) 8.1.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=8.1.0 make.cross ARCH=riscv 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   drivers/crypto/chelsio/chtls/chtls_io.c: In function 'chtls_sendmsg':
>> drivers/crypto/chelsio/chtls/chtls_io.c:1140:34: error: 'skb_frag_t' {aka 'struct bio_vec'} has no member named 'size'
        skb_shinfo(skb)->frags[i - 1].size += copy;
                                     ^
   drivers/crypto/chelsio/chtls/chtls_io.c: In function 'chtls_sendpage':
   drivers/crypto/chelsio/chtls/chtls_io.c:1253:33: error: 'skb_frag_t' {aka 'struct bio_vec'} has no member named 'size'
       skb_shinfo(skb)->frags[i - 1].size += copy;
                                    ^

vim +1140 drivers/crypto/chelsio/chtls/chtls_io.c

3b8305f5 Atul Gupta 2018-05-27   986  
36bedb3f Atul Gupta 2018-03-31   987  int chtls_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
36bedb3f Atul Gupta 2018-03-31   988  {
36bedb3f Atul Gupta 2018-03-31   989  	struct chtls_sock *csk = rcu_dereference_sk_user_data(sk);
36bedb3f Atul Gupta 2018-03-31   990  	struct chtls_dev *cdev = csk->cdev;
36bedb3f Atul Gupta 2018-03-31   991  	struct tcp_sock *tp = tcp_sk(sk);
36bedb3f Atul Gupta 2018-03-31   992  	struct sk_buff *skb;
36bedb3f Atul Gupta 2018-03-31   993  	int mss, flags, err;
36bedb3f Atul Gupta 2018-03-31   994  	int recordsz = 0;
36bedb3f Atul Gupta 2018-03-31   995  	int copied = 0;
36bedb3f Atul Gupta 2018-03-31   996  	long timeo;
36bedb3f Atul Gupta 2018-03-31   997  
36bedb3f Atul Gupta 2018-03-31   998  	lock_sock(sk);
36bedb3f Atul Gupta 2018-03-31   999  	flags = msg->msg_flags;
36bedb3f Atul Gupta 2018-03-31  1000  	timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT);
36bedb3f Atul Gupta 2018-03-31  1001  
36bedb3f Atul Gupta 2018-03-31  1002  	if (!sk_in_state(sk, TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)) {
36bedb3f Atul Gupta 2018-03-31  1003  		err = sk_stream_wait_connect(sk, &timeo);
36bedb3f Atul Gupta 2018-03-31  1004  		if (err)
36bedb3f Atul Gupta 2018-03-31  1005  			goto out_err;
36bedb3f Atul Gupta 2018-03-31  1006  	}
36bedb3f Atul Gupta 2018-03-31  1007  
36bedb3f Atul Gupta 2018-03-31  1008  	sk_clear_bit(SOCKWQ_ASYNC_NOSPACE, sk);
36bedb3f Atul Gupta 2018-03-31  1009  	err = -EPIPE;
36bedb3f Atul Gupta 2018-03-31  1010  	if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN))
36bedb3f Atul Gupta 2018-03-31  1011  		goto out_err;
36bedb3f Atul Gupta 2018-03-31  1012  
36bedb3f Atul Gupta 2018-03-31  1013  	mss = csk->mss;
36bedb3f Atul Gupta 2018-03-31  1014  	csk_set_flag(csk, CSK_TX_MORE_DATA);
36bedb3f Atul Gupta 2018-03-31  1015  
36bedb3f Atul Gupta 2018-03-31  1016  	while (msg_data_left(msg)) {
36bedb3f Atul Gupta 2018-03-31  1017  		int copy = 0;
36bedb3f Atul Gupta 2018-03-31  1018  
36bedb3f Atul Gupta 2018-03-31  1019  		skb = skb_peek_tail(&csk->txq);
36bedb3f Atul Gupta 2018-03-31  1020  		if (skb) {
36bedb3f Atul Gupta 2018-03-31  1021  			copy = mss - skb->len;
36bedb3f Atul Gupta 2018-03-31  1022  			skb->ip_summed = CHECKSUM_UNNECESSARY;
36bedb3f Atul Gupta 2018-03-31  1023  		}
3b8305f5 Atul Gupta 2018-05-27  1024  		if (!csk_mem_free(cdev, sk))
3b8305f5 Atul Gupta 2018-05-27  1025  			goto wait_for_sndbuf;
36bedb3f Atul Gupta 2018-03-31  1026  
36bedb3f Atul Gupta 2018-03-31  1027  		if (is_tls_tx(csk) && !csk->tlshws.txleft) {
36bedb3f Atul Gupta 2018-03-31  1028  			struct tls_hdr hdr;
36bedb3f Atul Gupta 2018-03-31  1029  
36bedb3f Atul Gupta 2018-03-31  1030  			recordsz = tls_header_read(&hdr, &msg->msg_iter);
36bedb3f Atul Gupta 2018-03-31  1031  			size -= TLS_HEADER_LENGTH;
848dd1c1 Atul Gupta 2018-12-11  1032  			copied += TLS_HEADER_LENGTH;
36bedb3f Atul Gupta 2018-03-31  1033  			csk->tlshws.txleft = recordsz;
36bedb3f Atul Gupta 2018-03-31  1034  			csk->tlshws.type = hdr.type;
36bedb3f Atul Gupta 2018-03-31  1035  			if (skb)
36bedb3f Atul Gupta 2018-03-31  1036  				ULP_SKB_CB(skb)->ulp.tls.type = hdr.type;
36bedb3f Atul Gupta 2018-03-31  1037  		}
36bedb3f Atul Gupta 2018-03-31  1038  
36bedb3f Atul Gupta 2018-03-31  1039  		if (!skb || (ULP_SKB_CB(skb)->flags & ULPCB_FLAG_NO_APPEND) ||
36bedb3f Atul Gupta 2018-03-31  1040  		    copy <= 0) {
36bedb3f Atul Gupta 2018-03-31  1041  new_buf:
36bedb3f Atul Gupta 2018-03-31  1042  			if (skb) {
36bedb3f Atul Gupta 2018-03-31  1043  				tx_skb_finalize(skb);
36bedb3f Atul Gupta 2018-03-31  1044  				push_frames_if_head(sk);
36bedb3f Atul Gupta 2018-03-31  1045  			}
36bedb3f Atul Gupta 2018-03-31  1046  
36bedb3f Atul Gupta 2018-03-31  1047  			if (is_tls_tx(csk)) {
36bedb3f Atul Gupta 2018-03-31  1048  				skb = get_record_skb(sk,
36bedb3f Atul Gupta 2018-03-31  1049  						     select_size(sk,
36bedb3f Atul Gupta 2018-03-31  1050  								 recordsz,
36bedb3f Atul Gupta 2018-03-31  1051  								 flags,
36bedb3f Atul Gupta 2018-03-31  1052  								 TX_TLSHDR_LEN),
36bedb3f Atul Gupta 2018-03-31  1053  								 false);
36bedb3f Atul Gupta 2018-03-31  1054  			} else {
36bedb3f Atul Gupta 2018-03-31  1055  				skb = get_tx_skb(sk,
36bedb3f Atul Gupta 2018-03-31  1056  						 select_size(sk, size, flags,
36bedb3f Atul Gupta 2018-03-31  1057  							     TX_HEADER_LEN));
36bedb3f Atul Gupta 2018-03-31  1058  			}
36bedb3f Atul Gupta 2018-03-31  1059  			if (unlikely(!skb))
36bedb3f Atul Gupta 2018-03-31  1060  				goto wait_for_memory;
36bedb3f Atul Gupta 2018-03-31  1061  
36bedb3f Atul Gupta 2018-03-31  1062  			skb->ip_summed = CHECKSUM_UNNECESSARY;
36bedb3f Atul Gupta 2018-03-31  1063  			copy = mss;
36bedb3f Atul Gupta 2018-03-31  1064  		}
36bedb3f Atul Gupta 2018-03-31  1065  		if (copy > size)
36bedb3f Atul Gupta 2018-03-31  1066  			copy = size;
36bedb3f Atul Gupta 2018-03-31  1067  
36bedb3f Atul Gupta 2018-03-31  1068  		if (skb_tailroom(skb) > 0) {
36bedb3f Atul Gupta 2018-03-31  1069  			copy = min(copy, skb_tailroom(skb));
36bedb3f Atul Gupta 2018-03-31  1070  			if (is_tls_tx(csk))
36bedb3f Atul Gupta 2018-03-31  1071  				copy = min_t(int, copy, csk->tlshws.txleft);
36bedb3f Atul Gupta 2018-03-31  1072  			err = skb_add_data_nocache(sk, skb,
36bedb3f Atul Gupta 2018-03-31  1073  						   &msg->msg_iter, copy);
36bedb3f Atul Gupta 2018-03-31  1074  			if (err)
36bedb3f Atul Gupta 2018-03-31  1075  				goto do_fault;
36bedb3f Atul Gupta 2018-03-31  1076  		} else {
36bedb3f Atul Gupta 2018-03-31  1077  			int i = skb_shinfo(skb)->nr_frags;
36bedb3f Atul Gupta 2018-03-31  1078  			struct page *page = TCP_PAGE(sk);
36bedb3f Atul Gupta 2018-03-31  1079  			int pg_size = PAGE_SIZE;
36bedb3f Atul Gupta 2018-03-31  1080  			int off = TCP_OFF(sk);
36bedb3f Atul Gupta 2018-03-31  1081  			bool merge;
36bedb3f Atul Gupta 2018-03-31  1082  
848dd1c1 Atul Gupta 2018-12-11  1083  			if (page)
1dfe57aa Atul Gupta 2018-05-27  1084  				pg_size <<= compound_order(page);
36bedb3f Atul Gupta 2018-03-31  1085  			if (off < pg_size &&
36bedb3f Atul Gupta 2018-03-31  1086  			    skb_can_coalesce(skb, i, page, off)) {
36bedb3f Atul Gupta 2018-03-31  1087  				merge = 1;
36bedb3f Atul Gupta 2018-03-31  1088  				goto copy;
36bedb3f Atul Gupta 2018-03-31  1089  			}
36bedb3f Atul Gupta 2018-03-31  1090  			merge = 0;
36bedb3f Atul Gupta 2018-03-31  1091  			if (i == (is_tls_tx(csk) ? (MAX_SKB_FRAGS - 1) :
36bedb3f Atul Gupta 2018-03-31  1092  			    MAX_SKB_FRAGS))
36bedb3f Atul Gupta 2018-03-31  1093  				goto new_buf;
36bedb3f Atul Gupta 2018-03-31  1094  
36bedb3f Atul Gupta 2018-03-31  1095  			if (page && off == pg_size) {
36bedb3f Atul Gupta 2018-03-31  1096  				put_page(page);
36bedb3f Atul Gupta 2018-03-31  1097  				TCP_PAGE(sk) = page = NULL;
36bedb3f Atul Gupta 2018-03-31  1098  				pg_size = PAGE_SIZE;
36bedb3f Atul Gupta 2018-03-31  1099  			}
36bedb3f Atul Gupta 2018-03-31  1100  
36bedb3f Atul Gupta 2018-03-31  1101  			if (!page) {
36bedb3f Atul Gupta 2018-03-31  1102  				gfp_t gfp = sk->sk_allocation;
36bedb3f Atul Gupta 2018-03-31  1103  				int order = cdev->send_page_order;
36bedb3f Atul Gupta 2018-03-31  1104  
36bedb3f Atul Gupta 2018-03-31  1105  				if (order) {
36bedb3f Atul Gupta 2018-03-31  1106  					page = alloc_pages(gfp | __GFP_COMP |
36bedb3f Atul Gupta 2018-03-31  1107  							   __GFP_NOWARN |
36bedb3f Atul Gupta 2018-03-31  1108  							   __GFP_NORETRY,
36bedb3f Atul Gupta 2018-03-31  1109  							   order);
36bedb3f Atul Gupta 2018-03-31  1110  					if (page)
36bedb3f Atul Gupta 2018-03-31  1111  						pg_size <<=
36bedb3f Atul Gupta 2018-03-31  1112  							compound_order(page);
36bedb3f Atul Gupta 2018-03-31  1113  				}
36bedb3f Atul Gupta 2018-03-31  1114  				if (!page) {
36bedb3f Atul Gupta 2018-03-31  1115  					page = alloc_page(gfp);
36bedb3f Atul Gupta 2018-03-31  1116  					pg_size = PAGE_SIZE;
36bedb3f Atul Gupta 2018-03-31  1117  				}
36bedb3f Atul Gupta 2018-03-31  1118  				if (!page)
36bedb3f Atul Gupta 2018-03-31  1119  					goto wait_for_memory;
36bedb3f Atul Gupta 2018-03-31  1120  				off = 0;
36bedb3f Atul Gupta 2018-03-31  1121  			}
36bedb3f Atul Gupta 2018-03-31  1122  copy:
36bedb3f Atul Gupta 2018-03-31  1123  			if (copy > pg_size - off)
36bedb3f Atul Gupta 2018-03-31  1124  				copy = pg_size - off;
36bedb3f Atul Gupta 2018-03-31  1125  			if (is_tls_tx(csk))
36bedb3f Atul Gupta 2018-03-31  1126  				copy = min_t(int, copy, csk->tlshws.txleft);
36bedb3f Atul Gupta 2018-03-31  1127  
36bedb3f Atul Gupta 2018-03-31  1128  			err = chtls_skb_copy_to_page_nocache(sk, &msg->msg_iter,
36bedb3f Atul Gupta 2018-03-31  1129  							     skb, page,
36bedb3f Atul Gupta 2018-03-31  1130  							     off, copy);
36bedb3f Atul Gupta 2018-03-31  1131  			if (unlikely(err)) {
36bedb3f Atul Gupta 2018-03-31  1132  				if (!TCP_PAGE(sk)) {
36bedb3f Atul Gupta 2018-03-31  1133  					TCP_PAGE(sk) = page;
36bedb3f Atul Gupta 2018-03-31  1134  					TCP_OFF(sk) = 0;
36bedb3f Atul Gupta 2018-03-31  1135  				}
36bedb3f Atul Gupta 2018-03-31  1136  				goto do_fault;
36bedb3f Atul Gupta 2018-03-31  1137  			}
36bedb3f Atul Gupta 2018-03-31  1138  			/* Update the skb. */
36bedb3f Atul Gupta 2018-03-31  1139  			if (merge) {
36bedb3f Atul Gupta 2018-03-31 @1140  				skb_shinfo(skb)->frags[i - 1].size += copy;
36bedb3f Atul Gupta 2018-03-31  1141  			} else {
36bedb3f Atul Gupta 2018-03-31  1142  				skb_fill_page_desc(skb, i, page, off, copy);
36bedb3f Atul Gupta 2018-03-31  1143  				if (off + copy < pg_size) {
36bedb3f Atul Gupta 2018-03-31  1144  					/* space left keep page */
36bedb3f Atul Gupta 2018-03-31  1145  					get_page(page);
36bedb3f Atul Gupta 2018-03-31  1146  					TCP_PAGE(sk) = page;
36bedb3f Atul Gupta 2018-03-31  1147  				} else {
36bedb3f Atul Gupta 2018-03-31  1148  					TCP_PAGE(sk) = NULL;
36bedb3f Atul Gupta 2018-03-31  1149  				}
36bedb3f Atul Gupta 2018-03-31  1150  			}
36bedb3f Atul Gupta 2018-03-31  1151  			TCP_OFF(sk) = off + copy;
36bedb3f Atul Gupta 2018-03-31  1152  		}
36bedb3f Atul Gupta 2018-03-31  1153  		if (unlikely(skb->len == mss))
36bedb3f Atul Gupta 2018-03-31  1154  			tx_skb_finalize(skb);
36bedb3f Atul Gupta 2018-03-31  1155  		tp->write_seq += copy;
36bedb3f Atul Gupta 2018-03-31  1156  		copied += copy;
36bedb3f Atul Gupta 2018-03-31  1157  		size -= copy;
36bedb3f Atul Gupta 2018-03-31  1158  
36bedb3f Atul Gupta 2018-03-31  1159  		if (is_tls_tx(csk))
36bedb3f Atul Gupta 2018-03-31  1160  			csk->tlshws.txleft -= copy;
36bedb3f Atul Gupta 2018-03-31  1161  
36bedb3f Atul Gupta 2018-03-31  1162  		if (corked(tp, flags) &&
36bedb3f Atul Gupta 2018-03-31  1163  		    (sk_stream_wspace(sk) < sk_stream_min_wspace(sk)))
36bedb3f Atul Gupta 2018-03-31  1164  			ULP_SKB_CB(skb)->flags |= ULPCB_FLAG_NO_APPEND;
36bedb3f Atul Gupta 2018-03-31  1165  
36bedb3f Atul Gupta 2018-03-31  1166  		if (size == 0)
36bedb3f Atul Gupta 2018-03-31  1167  			goto out;
36bedb3f Atul Gupta 2018-03-31  1168  
36bedb3f Atul Gupta 2018-03-31  1169  		if (ULP_SKB_CB(skb)->flags & ULPCB_FLAG_NO_APPEND)
36bedb3f Atul Gupta 2018-03-31  1170  			push_frames_if_head(sk);
36bedb3f Atul Gupta 2018-03-31  1171  		continue;
3b8305f5 Atul Gupta 2018-05-27  1172  wait_for_sndbuf:
3b8305f5 Atul Gupta 2018-05-27  1173  		set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
36bedb3f Atul Gupta 2018-03-31  1174  wait_for_memory:
3b8305f5 Atul Gupta 2018-05-27  1175  		err = csk_wait_memory(cdev, sk, &timeo);
36bedb3f Atul Gupta 2018-03-31  1176  		if (err)
36bedb3f Atul Gupta 2018-03-31  1177  			goto do_error;
36bedb3f Atul Gupta 2018-03-31  1178  	}
36bedb3f Atul Gupta 2018-03-31  1179  out:
36bedb3f Atul Gupta 2018-03-31  1180  	csk_reset_flag(csk, CSK_TX_MORE_DATA);
36bedb3f Atul Gupta 2018-03-31  1181  	if (copied)
36bedb3f Atul Gupta 2018-03-31  1182  		chtls_tcp_push(sk, flags);
36bedb3f Atul Gupta 2018-03-31  1183  done:
36bedb3f Atul Gupta 2018-03-31  1184  	release_sock(sk);
848dd1c1 Atul Gupta 2018-12-11  1185  	return copied;
36bedb3f Atul Gupta 2018-03-31  1186  do_fault:
36bedb3f Atul Gupta 2018-03-31  1187  	if (!skb->len) {
36bedb3f Atul Gupta 2018-03-31  1188  		__skb_unlink(skb, &csk->txq);
36bedb3f Atul Gupta 2018-03-31  1189  		sk->sk_wmem_queued -= skb->truesize;
36bedb3f Atul Gupta 2018-03-31  1190  		__kfree_skb(skb);
36bedb3f Atul Gupta 2018-03-31  1191  	}
36bedb3f Atul Gupta 2018-03-31  1192  do_error:
36bedb3f Atul Gupta 2018-03-31  1193  	if (copied)
36bedb3f Atul Gupta 2018-03-31  1194  		goto out;
36bedb3f Atul Gupta 2018-03-31  1195  out_err:
36bedb3f Atul Gupta 2018-03-31  1196  	if (csk_conn_inline(csk))
36bedb3f Atul Gupta 2018-03-31  1197  		csk_reset_flag(csk, CSK_TX_MORE_DATA);
36bedb3f Atul Gupta 2018-03-31  1198  	copied = sk_stream_error(sk, flags, err);
36bedb3f Atul Gupta 2018-03-31  1199  	goto done;
36bedb3f Atul Gupta 2018-03-31  1200  }
36bedb3f Atul Gupta 2018-03-31  1201  

:::::: The code at line 1140 was first introduced by commit
:::::: 36bedb3f2e5b81832b5895363ed3fedb9ff1e8d0 crypto: chtls - Inline TLS record Tx

:::::: TO: Atul Gupta <atul.gupta@chelsio.com>
:::::: CC: David S. Miller <davem@davemloft.net>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 56204 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 6/7] net: Rename skb_frag_t size to bv_len
  2019-05-01 14:44 ` [PATCH v2 6/7] net: Rename skb_frag_t size to bv_len Matthew Wilcox
  2019-05-02  9:49   ` kbuild test robot
@ 2019-05-02 10:03   ` kbuild test robot
  2019-05-02 11:42   ` kbuild test robot
  2 siblings, 0 replies; 14+ messages in thread
From: kbuild test robot @ 2019-05-02 10:03 UTC (permalink / raw)
  To: Matthew Wilcox; +Cc: kbuild-all, davem, Matthew Wilcox (Oracle), hch, netdev

[-- Attachment #1: Type: text/plain, Size: 15055 bytes --]

Hi Matthew,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on net-next/master]
[also build test ERROR on v5.1-rc7]
[cannot apply to next-20190501]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Matthew-Wilcox/Convert-skb_frag_t-to-bio_vec/20190502-161948
config: riscv-allyesconfig (attached as .config)
compiler: riscv64-linux-gcc (GCC) 8.1.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=8.1.0 make.cross ARCH=riscv 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>

Note: the linux-review/Matthew-Wilcox/Convert-skb_frag_t-to-bio_vec/20190502-161948 HEAD faadb27a9e0a8480f47f0aca9ca5bee909a63db6 builds fine.
      It only hurts bisectibility.

All errors (new ones prefixed by >>):

   drivers/crypto//chelsio/chtls/chtls_io.c: In function 'chtls_sendmsg':
>> drivers/crypto//chelsio/chtls/chtls_io.c:1140:34: error: 'skb_frag_t' {aka 'struct skb_frag_struct'} has no member named 'size'
        skb_shinfo(skb)->frags[i - 1].size += copy;
                                     ^
   drivers/crypto//chelsio/chtls/chtls_io.c: In function 'chtls_sendpage':
   drivers/crypto//chelsio/chtls/chtls_io.c:1253:33: error: 'skb_frag_t' {aka 'struct skb_frag_struct'} has no member named 'size'
       skb_shinfo(skb)->frags[i - 1].size += copy;
                                    ^

vim +1140 drivers/crypto//chelsio/chtls/chtls_io.c

3b8305f5 Atul Gupta 2018-05-27   986  
36bedb3f Atul Gupta 2018-03-31   987  int chtls_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
36bedb3f Atul Gupta 2018-03-31   988  {
36bedb3f Atul Gupta 2018-03-31   989  	struct chtls_sock *csk = rcu_dereference_sk_user_data(sk);
36bedb3f Atul Gupta 2018-03-31   990  	struct chtls_dev *cdev = csk->cdev;
36bedb3f Atul Gupta 2018-03-31   991  	struct tcp_sock *tp = tcp_sk(sk);
36bedb3f Atul Gupta 2018-03-31   992  	struct sk_buff *skb;
36bedb3f Atul Gupta 2018-03-31   993  	int mss, flags, err;
36bedb3f Atul Gupta 2018-03-31   994  	int recordsz = 0;
36bedb3f Atul Gupta 2018-03-31   995  	int copied = 0;
36bedb3f Atul Gupta 2018-03-31   996  	long timeo;
36bedb3f Atul Gupta 2018-03-31   997  
36bedb3f Atul Gupta 2018-03-31   998  	lock_sock(sk);
36bedb3f Atul Gupta 2018-03-31   999  	flags = msg->msg_flags;
36bedb3f Atul Gupta 2018-03-31  1000  	timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT);
36bedb3f Atul Gupta 2018-03-31  1001  
36bedb3f Atul Gupta 2018-03-31  1002  	if (!sk_in_state(sk, TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)) {
36bedb3f Atul Gupta 2018-03-31  1003  		err = sk_stream_wait_connect(sk, &timeo);
36bedb3f Atul Gupta 2018-03-31  1004  		if (err)
36bedb3f Atul Gupta 2018-03-31  1005  			goto out_err;
36bedb3f Atul Gupta 2018-03-31  1006  	}
36bedb3f Atul Gupta 2018-03-31  1007  
36bedb3f Atul Gupta 2018-03-31  1008  	sk_clear_bit(SOCKWQ_ASYNC_NOSPACE, sk);
36bedb3f Atul Gupta 2018-03-31  1009  	err = -EPIPE;
36bedb3f Atul Gupta 2018-03-31  1010  	if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN))
36bedb3f Atul Gupta 2018-03-31  1011  		goto out_err;
36bedb3f Atul Gupta 2018-03-31  1012  
36bedb3f Atul Gupta 2018-03-31  1013  	mss = csk->mss;
36bedb3f Atul Gupta 2018-03-31  1014  	csk_set_flag(csk, CSK_TX_MORE_DATA);
36bedb3f Atul Gupta 2018-03-31  1015  
36bedb3f Atul Gupta 2018-03-31  1016  	while (msg_data_left(msg)) {
36bedb3f Atul Gupta 2018-03-31  1017  		int copy = 0;
36bedb3f Atul Gupta 2018-03-31  1018  
36bedb3f Atul Gupta 2018-03-31  1019  		skb = skb_peek_tail(&csk->txq);
36bedb3f Atul Gupta 2018-03-31  1020  		if (skb) {
36bedb3f Atul Gupta 2018-03-31  1021  			copy = mss - skb->len;
36bedb3f Atul Gupta 2018-03-31  1022  			skb->ip_summed = CHECKSUM_UNNECESSARY;
36bedb3f Atul Gupta 2018-03-31  1023  		}
3b8305f5 Atul Gupta 2018-05-27  1024  		if (!csk_mem_free(cdev, sk))
3b8305f5 Atul Gupta 2018-05-27  1025  			goto wait_for_sndbuf;
36bedb3f Atul Gupta 2018-03-31  1026  
36bedb3f Atul Gupta 2018-03-31  1027  		if (is_tls_tx(csk) && !csk->tlshws.txleft) {
36bedb3f Atul Gupta 2018-03-31  1028  			struct tls_hdr hdr;
36bedb3f Atul Gupta 2018-03-31  1029  
36bedb3f Atul Gupta 2018-03-31  1030  			recordsz = tls_header_read(&hdr, &msg->msg_iter);
36bedb3f Atul Gupta 2018-03-31  1031  			size -= TLS_HEADER_LENGTH;
848dd1c1 Atul Gupta 2018-12-11  1032  			copied += TLS_HEADER_LENGTH;
36bedb3f Atul Gupta 2018-03-31  1033  			csk->tlshws.txleft = recordsz;
36bedb3f Atul Gupta 2018-03-31  1034  			csk->tlshws.type = hdr.type;
36bedb3f Atul Gupta 2018-03-31  1035  			if (skb)
36bedb3f Atul Gupta 2018-03-31  1036  				ULP_SKB_CB(skb)->ulp.tls.type = hdr.type;
36bedb3f Atul Gupta 2018-03-31  1037  		}
36bedb3f Atul Gupta 2018-03-31  1038  
36bedb3f Atul Gupta 2018-03-31  1039  		if (!skb || (ULP_SKB_CB(skb)->flags & ULPCB_FLAG_NO_APPEND) ||
36bedb3f Atul Gupta 2018-03-31  1040  		    copy <= 0) {
36bedb3f Atul Gupta 2018-03-31  1041  new_buf:
36bedb3f Atul Gupta 2018-03-31  1042  			if (skb) {
36bedb3f Atul Gupta 2018-03-31  1043  				tx_skb_finalize(skb);
36bedb3f Atul Gupta 2018-03-31  1044  				push_frames_if_head(sk);
36bedb3f Atul Gupta 2018-03-31  1045  			}
36bedb3f Atul Gupta 2018-03-31  1046  
36bedb3f Atul Gupta 2018-03-31  1047  			if (is_tls_tx(csk)) {
36bedb3f Atul Gupta 2018-03-31  1048  				skb = get_record_skb(sk,
36bedb3f Atul Gupta 2018-03-31  1049  						     select_size(sk,
36bedb3f Atul Gupta 2018-03-31  1050  								 recordsz,
36bedb3f Atul Gupta 2018-03-31  1051  								 flags,
36bedb3f Atul Gupta 2018-03-31  1052  								 TX_TLSHDR_LEN),
36bedb3f Atul Gupta 2018-03-31  1053  								 false);
36bedb3f Atul Gupta 2018-03-31  1054  			} else {
36bedb3f Atul Gupta 2018-03-31  1055  				skb = get_tx_skb(sk,
36bedb3f Atul Gupta 2018-03-31  1056  						 select_size(sk, size, flags,
36bedb3f Atul Gupta 2018-03-31  1057  							     TX_HEADER_LEN));
36bedb3f Atul Gupta 2018-03-31  1058  			}
36bedb3f Atul Gupta 2018-03-31  1059  			if (unlikely(!skb))
36bedb3f Atul Gupta 2018-03-31  1060  				goto wait_for_memory;
36bedb3f Atul Gupta 2018-03-31  1061  
36bedb3f Atul Gupta 2018-03-31  1062  			skb->ip_summed = CHECKSUM_UNNECESSARY;
36bedb3f Atul Gupta 2018-03-31  1063  			copy = mss;
36bedb3f Atul Gupta 2018-03-31  1064  		}
36bedb3f Atul Gupta 2018-03-31  1065  		if (copy > size)
36bedb3f Atul Gupta 2018-03-31  1066  			copy = size;
36bedb3f Atul Gupta 2018-03-31  1067  
36bedb3f Atul Gupta 2018-03-31  1068  		if (skb_tailroom(skb) > 0) {
36bedb3f Atul Gupta 2018-03-31  1069  			copy = min(copy, skb_tailroom(skb));
36bedb3f Atul Gupta 2018-03-31  1070  			if (is_tls_tx(csk))
36bedb3f Atul Gupta 2018-03-31  1071  				copy = min_t(int, copy, csk->tlshws.txleft);
36bedb3f Atul Gupta 2018-03-31  1072  			err = skb_add_data_nocache(sk, skb,
36bedb3f Atul Gupta 2018-03-31  1073  						   &msg->msg_iter, copy);
36bedb3f Atul Gupta 2018-03-31  1074  			if (err)
36bedb3f Atul Gupta 2018-03-31  1075  				goto do_fault;
36bedb3f Atul Gupta 2018-03-31  1076  		} else {
36bedb3f Atul Gupta 2018-03-31  1077  			int i = skb_shinfo(skb)->nr_frags;
36bedb3f Atul Gupta 2018-03-31  1078  			struct page *page = TCP_PAGE(sk);
36bedb3f Atul Gupta 2018-03-31  1079  			int pg_size = PAGE_SIZE;
36bedb3f Atul Gupta 2018-03-31  1080  			int off = TCP_OFF(sk);
36bedb3f Atul Gupta 2018-03-31  1081  			bool merge;
36bedb3f Atul Gupta 2018-03-31  1082  
848dd1c1 Atul Gupta 2018-12-11  1083  			if (page)
1dfe57aa Atul Gupta 2018-05-27  1084  				pg_size <<= compound_order(page);
36bedb3f Atul Gupta 2018-03-31  1085  			if (off < pg_size &&
36bedb3f Atul Gupta 2018-03-31  1086  			    skb_can_coalesce(skb, i, page, off)) {
36bedb3f Atul Gupta 2018-03-31  1087  				merge = 1;
36bedb3f Atul Gupta 2018-03-31  1088  				goto copy;
36bedb3f Atul Gupta 2018-03-31  1089  			}
36bedb3f Atul Gupta 2018-03-31  1090  			merge = 0;
36bedb3f Atul Gupta 2018-03-31  1091  			if (i == (is_tls_tx(csk) ? (MAX_SKB_FRAGS - 1) :
36bedb3f Atul Gupta 2018-03-31  1092  			    MAX_SKB_FRAGS))
36bedb3f Atul Gupta 2018-03-31  1093  				goto new_buf;
36bedb3f Atul Gupta 2018-03-31  1094  
36bedb3f Atul Gupta 2018-03-31  1095  			if (page && off == pg_size) {
36bedb3f Atul Gupta 2018-03-31  1096  				put_page(page);
36bedb3f Atul Gupta 2018-03-31  1097  				TCP_PAGE(sk) = page = NULL;
36bedb3f Atul Gupta 2018-03-31  1098  				pg_size = PAGE_SIZE;
36bedb3f Atul Gupta 2018-03-31  1099  			}
36bedb3f Atul Gupta 2018-03-31  1100  
36bedb3f Atul Gupta 2018-03-31  1101  			if (!page) {
36bedb3f Atul Gupta 2018-03-31  1102  				gfp_t gfp = sk->sk_allocation;
36bedb3f Atul Gupta 2018-03-31  1103  				int order = cdev->send_page_order;
36bedb3f Atul Gupta 2018-03-31  1104  
36bedb3f Atul Gupta 2018-03-31  1105  				if (order) {
36bedb3f Atul Gupta 2018-03-31  1106  					page = alloc_pages(gfp | __GFP_COMP |
36bedb3f Atul Gupta 2018-03-31  1107  							   __GFP_NOWARN |
36bedb3f Atul Gupta 2018-03-31  1108  							   __GFP_NORETRY,
36bedb3f Atul Gupta 2018-03-31  1109  							   order);
36bedb3f Atul Gupta 2018-03-31  1110  					if (page)
36bedb3f Atul Gupta 2018-03-31  1111  						pg_size <<=
36bedb3f Atul Gupta 2018-03-31  1112  							compound_order(page);
36bedb3f Atul Gupta 2018-03-31  1113  				}
36bedb3f Atul Gupta 2018-03-31  1114  				if (!page) {
36bedb3f Atul Gupta 2018-03-31  1115  					page = alloc_page(gfp);
36bedb3f Atul Gupta 2018-03-31  1116  					pg_size = PAGE_SIZE;
36bedb3f Atul Gupta 2018-03-31  1117  				}
36bedb3f Atul Gupta 2018-03-31  1118  				if (!page)
36bedb3f Atul Gupta 2018-03-31  1119  					goto wait_for_memory;
36bedb3f Atul Gupta 2018-03-31  1120  				off = 0;
36bedb3f Atul Gupta 2018-03-31  1121  			}
36bedb3f Atul Gupta 2018-03-31  1122  copy:
36bedb3f Atul Gupta 2018-03-31  1123  			if (copy > pg_size - off)
36bedb3f Atul Gupta 2018-03-31  1124  				copy = pg_size - off;
36bedb3f Atul Gupta 2018-03-31  1125  			if (is_tls_tx(csk))
36bedb3f Atul Gupta 2018-03-31  1126  				copy = min_t(int, copy, csk->tlshws.txleft);
36bedb3f Atul Gupta 2018-03-31  1127  
36bedb3f Atul Gupta 2018-03-31  1128  			err = chtls_skb_copy_to_page_nocache(sk, &msg->msg_iter,
36bedb3f Atul Gupta 2018-03-31  1129  							     skb, page,
36bedb3f Atul Gupta 2018-03-31  1130  							     off, copy);
36bedb3f Atul Gupta 2018-03-31  1131  			if (unlikely(err)) {
36bedb3f Atul Gupta 2018-03-31  1132  				if (!TCP_PAGE(sk)) {
36bedb3f Atul Gupta 2018-03-31  1133  					TCP_PAGE(sk) = page;
36bedb3f Atul Gupta 2018-03-31  1134  					TCP_OFF(sk) = 0;
36bedb3f Atul Gupta 2018-03-31  1135  				}
36bedb3f Atul Gupta 2018-03-31  1136  				goto do_fault;
36bedb3f Atul Gupta 2018-03-31  1137  			}
36bedb3f Atul Gupta 2018-03-31  1138  			/* Update the skb. */
36bedb3f Atul Gupta 2018-03-31  1139  			if (merge) {
36bedb3f Atul Gupta 2018-03-31 @1140  				skb_shinfo(skb)->frags[i - 1].size += copy;
36bedb3f Atul Gupta 2018-03-31  1141  			} else {
36bedb3f Atul Gupta 2018-03-31  1142  				skb_fill_page_desc(skb, i, page, off, copy);
36bedb3f Atul Gupta 2018-03-31  1143  				if (off + copy < pg_size) {
36bedb3f Atul Gupta 2018-03-31  1144  					/* space left keep page */
36bedb3f Atul Gupta 2018-03-31  1145  					get_page(page);
36bedb3f Atul Gupta 2018-03-31  1146  					TCP_PAGE(sk) = page;
36bedb3f Atul Gupta 2018-03-31  1147  				} else {
36bedb3f Atul Gupta 2018-03-31  1148  					TCP_PAGE(sk) = NULL;
36bedb3f Atul Gupta 2018-03-31  1149  				}
36bedb3f Atul Gupta 2018-03-31  1150  			}
36bedb3f Atul Gupta 2018-03-31  1151  			TCP_OFF(sk) = off + copy;
36bedb3f Atul Gupta 2018-03-31  1152  		}
36bedb3f Atul Gupta 2018-03-31  1153  		if (unlikely(skb->len == mss))
36bedb3f Atul Gupta 2018-03-31  1154  			tx_skb_finalize(skb);
36bedb3f Atul Gupta 2018-03-31  1155  		tp->write_seq += copy;
36bedb3f Atul Gupta 2018-03-31  1156  		copied += copy;
36bedb3f Atul Gupta 2018-03-31  1157  		size -= copy;
36bedb3f Atul Gupta 2018-03-31  1158  
36bedb3f Atul Gupta 2018-03-31  1159  		if (is_tls_tx(csk))
36bedb3f Atul Gupta 2018-03-31  1160  			csk->tlshws.txleft -= copy;
36bedb3f Atul Gupta 2018-03-31  1161  
36bedb3f Atul Gupta 2018-03-31  1162  		if (corked(tp, flags) &&
36bedb3f Atul Gupta 2018-03-31  1163  		    (sk_stream_wspace(sk) < sk_stream_min_wspace(sk)))
36bedb3f Atul Gupta 2018-03-31  1164  			ULP_SKB_CB(skb)->flags |= ULPCB_FLAG_NO_APPEND;
36bedb3f Atul Gupta 2018-03-31  1165  
36bedb3f Atul Gupta 2018-03-31  1166  		if (size == 0)
36bedb3f Atul Gupta 2018-03-31  1167  			goto out;
36bedb3f Atul Gupta 2018-03-31  1168  
36bedb3f Atul Gupta 2018-03-31  1169  		if (ULP_SKB_CB(skb)->flags & ULPCB_FLAG_NO_APPEND)
36bedb3f Atul Gupta 2018-03-31  1170  			push_frames_if_head(sk);
36bedb3f Atul Gupta 2018-03-31  1171  		continue;
3b8305f5 Atul Gupta 2018-05-27  1172  wait_for_sndbuf:
3b8305f5 Atul Gupta 2018-05-27  1173  		set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
36bedb3f Atul Gupta 2018-03-31  1174  wait_for_memory:
3b8305f5 Atul Gupta 2018-05-27  1175  		err = csk_wait_memory(cdev, sk, &timeo);
36bedb3f Atul Gupta 2018-03-31  1176  		if (err)
36bedb3f Atul Gupta 2018-03-31  1177  			goto do_error;
36bedb3f Atul Gupta 2018-03-31  1178  	}
36bedb3f Atul Gupta 2018-03-31  1179  out:
36bedb3f Atul Gupta 2018-03-31  1180  	csk_reset_flag(csk, CSK_TX_MORE_DATA);
36bedb3f Atul Gupta 2018-03-31  1181  	if (copied)
36bedb3f Atul Gupta 2018-03-31  1182  		chtls_tcp_push(sk, flags);
36bedb3f Atul Gupta 2018-03-31  1183  done:
36bedb3f Atul Gupta 2018-03-31  1184  	release_sock(sk);
848dd1c1 Atul Gupta 2018-12-11  1185  	return copied;
36bedb3f Atul Gupta 2018-03-31  1186  do_fault:
36bedb3f Atul Gupta 2018-03-31  1187  	if (!skb->len) {
36bedb3f Atul Gupta 2018-03-31  1188  		__skb_unlink(skb, &csk->txq);
36bedb3f Atul Gupta 2018-03-31  1189  		sk->sk_wmem_queued -= skb->truesize;
36bedb3f Atul Gupta 2018-03-31  1190  		__kfree_skb(skb);
36bedb3f Atul Gupta 2018-03-31  1191  	}
36bedb3f Atul Gupta 2018-03-31  1192  do_error:
36bedb3f Atul Gupta 2018-03-31  1193  	if (copied)
36bedb3f Atul Gupta 2018-03-31  1194  		goto out;
36bedb3f Atul Gupta 2018-03-31  1195  out_err:
36bedb3f Atul Gupta 2018-03-31  1196  	if (csk_conn_inline(csk))
36bedb3f Atul Gupta 2018-03-31  1197  		csk_reset_flag(csk, CSK_TX_MORE_DATA);
36bedb3f Atul Gupta 2018-03-31  1198  	copied = sk_stream_error(sk, flags, err);
36bedb3f Atul Gupta 2018-03-31  1199  	goto done;
36bedb3f Atul Gupta 2018-03-31  1200  }
36bedb3f Atul Gupta 2018-03-31  1201  

:::::: The code at line 1140 was first introduced by commit
:::::: 36bedb3f2e5b81832b5895363ed3fedb9ff1e8d0 crypto: chtls - Inline TLS record Tx

:::::: TO: Atul Gupta <atul.gupta@chelsio.com>
:::::: CC: David S. Miller <davem@davemloft.net>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 56204 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 7/7] net: Convert skb_frag_t to bio_vec
  2019-05-01 14:44 ` [PATCH v2 7/7] net: Convert skb_frag_t to bio_vec Matthew Wilcox
  2019-05-02  9:52   ` kbuild test robot
@ 2019-05-02 10:06   ` kbuild test robot
  1 sibling, 0 replies; 14+ messages in thread
From: kbuild test robot @ 2019-05-02 10:06 UTC (permalink / raw)
  To: Matthew Wilcox; +Cc: kbuild-all, davem, Matthew Wilcox (Oracle), hch, netdev

[-- Attachment #1: Type: text/plain, Size: 4433 bytes --]

Hi Matthew,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on net-next/master]
[also build test ERROR on v5.1-rc7]
[cannot apply to next-20190501]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Matthew-Wilcox/Convert-skb_frag_t-to-bio_vec/20190502-161948
config: xtensa-allyesconfig (attached as .config)
compiler: xtensa-linux-gcc (GCC) 8.1.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=8.1.0 make.cross ARCH=xtensa 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   In file included from include/linux/kernel.h:15,
                    from include/linux/list.h:9,
                    from include/linux/timer.h:5,
                    from include/linux/workqueue.h:9,
                    from drivers/target/iscsi/cxgbit/cxgbit_target.c:9:
   drivers/target/iscsi/cxgbit/cxgbit_target.c: In function 'cxgbit_lro_skb_dump':
>> drivers/target/iscsi/cxgbit/cxgbit_target.c:1409:52: error: 'skb_frag_t' {aka 'struct bio_vec'} has no member named 'size'
       skb, i, ssi->frags[i].page_offset, ssi->frags[i].size);
                                                       ^
   include/linux/printk.h:309:34: note: in definition of macro 'pr_info'
     printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
                                     ^~~~~~~~~~~
   drivers/target/iscsi/cxgbit/cxgbit_target.c: In function 'cxgbit_lro_skb_merge':
   drivers/target/iscsi/cxgbit/cxgbit_target.c:1453:31: error: 'skb_frag_t' {aka 'struct bio_vec'} has no member named 'size'
      len = hssi->frags[hfrag_idx].size;
                                  ^
   drivers/target/iscsi/cxgbit/cxgbit_target.c:1473:33: error: 'skb_frag_t' {aka 'struct bio_vec'} has no member named 'size'
       len += hssi->frags[dfrag_idx].size;
                                    ^

vim +1409 drivers/target/iscsi/cxgbit/cxgbit_target.c

9730ffcb Varun Prakash 2016-04-20  1388  
9730ffcb Varun Prakash 2016-04-20  1389  static void cxgbit_lro_skb_dump(struct sk_buff *skb)
9730ffcb Varun Prakash 2016-04-20  1390  {
9730ffcb Varun Prakash 2016-04-20  1391  	struct skb_shared_info *ssi = skb_shinfo(skb);
9730ffcb Varun Prakash 2016-04-20  1392  	struct cxgbit_lro_cb *lro_cb = cxgbit_skb_lro_cb(skb);
9730ffcb Varun Prakash 2016-04-20  1393  	struct cxgbit_lro_pdu_cb *pdu_cb = cxgbit_skb_lro_pdu_cb(skb, 0);
9730ffcb Varun Prakash 2016-04-20  1394  	u8 i;
9730ffcb Varun Prakash 2016-04-20  1395  
9730ffcb Varun Prakash 2016-04-20  1396  	pr_info("skb 0x%p, head 0x%p, 0x%p, len %u,%u, frags %u.\n",
9730ffcb Varun Prakash 2016-04-20  1397  		skb, skb->head, skb->data, skb->len, skb->data_len,
9730ffcb Varun Prakash 2016-04-20  1398  		ssi->nr_frags);
9730ffcb Varun Prakash 2016-04-20  1399  	pr_info("skb 0x%p, lro_cb, csk 0x%p, pdu %u, %u.\n",
9730ffcb Varun Prakash 2016-04-20  1400  		skb, lro_cb->csk, lro_cb->pdu_idx, lro_cb->pdu_totallen);
9730ffcb Varun Prakash 2016-04-20  1401  
9730ffcb Varun Prakash 2016-04-20  1402  	for (i = 0; i < lro_cb->pdu_idx; i++, pdu_cb++)
9730ffcb Varun Prakash 2016-04-20  1403  		pr_info("skb 0x%p, pdu %d, %u, f 0x%x, seq 0x%x, dcrc 0x%x, "
9730ffcb Varun Prakash 2016-04-20  1404  			"frags %u.\n",
9730ffcb Varun Prakash 2016-04-20  1405  			skb, i, pdu_cb->pdulen, pdu_cb->flags, pdu_cb->seq,
9730ffcb Varun Prakash 2016-04-20  1406  			pdu_cb->ddigest, pdu_cb->frags);
9730ffcb Varun Prakash 2016-04-20  1407  	for (i = 0; i < ssi->nr_frags; i++)
9730ffcb Varun Prakash 2016-04-20  1408  		pr_info("skb 0x%p, frag %d, off %u, sz %u.\n",
9730ffcb Varun Prakash 2016-04-20 @1409  			skb, i, ssi->frags[i].page_offset, ssi->frags[i].size);
9730ffcb Varun Prakash 2016-04-20  1410  }
9730ffcb Varun Prakash 2016-04-20  1411  

:::::: The code at line 1409 was first introduced by commit
:::::: 9730ffcb8957e1ce9e7d903f7a5db09038a9db8d cxgbit: add files for cxgbit.ko

:::::: TO: Varun Prakash <varun@chelsio.com>
:::::: CC: Nicholas Bellinger <nab@linux-iscsi.org>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 56126 bytes --]

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v2 6/7] net: Rename skb_frag_t size to bv_len
  2019-05-01 14:44 ` [PATCH v2 6/7] net: Rename skb_frag_t size to bv_len Matthew Wilcox
  2019-05-02  9:49   ` kbuild test robot
  2019-05-02 10:03   ` kbuild test robot
@ 2019-05-02 11:42   ` kbuild test robot
  2 siblings, 0 replies; 14+ messages in thread
From: kbuild test robot @ 2019-05-02 11:42 UTC (permalink / raw)
  To: Matthew Wilcox; +Cc: kbuild-all, davem, Matthew Wilcox (Oracle), hch, netdev

Hi Matthew,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on net-next/master]
[also build test WARNING on v5.1-rc7]
[cannot apply to next-20190501]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Matthew-Wilcox/Convert-skb_frag_t-to-bio_vec/20190502-161948
reproduce:
        # apt-get install sparse
        make ARCH=x86_64 allmodconfig
        make C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__'

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>


sparse warnings: (new ones prefixed by >>)

   drivers/crypto/chelsio/chtls/chtls_io.c:1140:62: sparse: sparse: no member 'size' in struct skb_frag_struct
   drivers/crypto/chelsio/chtls/chtls_io.c:1253:54: sparse: sparse: no member 'size' in struct skb_frag_struct
>> drivers/crypto/chelsio/chtls/chtls_io.c:1140:62: sparse: sparse: generating address of non-lvalue (8)
   drivers/crypto/chelsio/chtls/chtls_io.c:1253:54: sparse: sparse: generating address of non-lvalue (8)
--
   drivers/target/iscsi/cxgbit/cxgbit_target.c:1408:17: sparse: sparse: no member 'size' in struct skb_frag_struct
   drivers/target/iscsi/cxgbit/cxgbit_target.c:1453:45: sparse: sparse: no member 'size' in struct skb_frag_struct
   drivers/target/iscsi/cxgbit/cxgbit_target.c:1473:54: sparse: sparse: no member 'size' in struct skb_frag_struct
>> drivers/target/iscsi/cxgbit/cxgbit_target.c:1453:45: sparse: sparse: unknown expression (8 46)
   drivers/target/iscsi/cxgbit/cxgbit_target.c:1473:54: sparse: sparse: unknown expression (8 46)

vim +1140 drivers/crypto/chelsio/chtls/chtls_io.c

3b8305f5 Atul Gupta 2018-05-27   986  
36bedb3f Atul Gupta 2018-03-31   987  int chtls_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
36bedb3f Atul Gupta 2018-03-31   988  {
36bedb3f Atul Gupta 2018-03-31   989  	struct chtls_sock *csk = rcu_dereference_sk_user_data(sk);
36bedb3f Atul Gupta 2018-03-31   990  	struct chtls_dev *cdev = csk->cdev;
36bedb3f Atul Gupta 2018-03-31   991  	struct tcp_sock *tp = tcp_sk(sk);
36bedb3f Atul Gupta 2018-03-31   992  	struct sk_buff *skb;
36bedb3f Atul Gupta 2018-03-31   993  	int mss, flags, err;
36bedb3f Atul Gupta 2018-03-31   994  	int recordsz = 0;
36bedb3f Atul Gupta 2018-03-31   995  	int copied = 0;
36bedb3f Atul Gupta 2018-03-31   996  	long timeo;
36bedb3f Atul Gupta 2018-03-31   997  
36bedb3f Atul Gupta 2018-03-31   998  	lock_sock(sk);
36bedb3f Atul Gupta 2018-03-31   999  	flags = msg->msg_flags;
36bedb3f Atul Gupta 2018-03-31  1000  	timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT);
36bedb3f Atul Gupta 2018-03-31  1001  
36bedb3f Atul Gupta 2018-03-31  1002  	if (!sk_in_state(sk, TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)) {
36bedb3f Atul Gupta 2018-03-31  1003  		err = sk_stream_wait_connect(sk, &timeo);
36bedb3f Atul Gupta 2018-03-31  1004  		if (err)
36bedb3f Atul Gupta 2018-03-31  1005  			goto out_err;
36bedb3f Atul Gupta 2018-03-31  1006  	}
36bedb3f Atul Gupta 2018-03-31  1007  
36bedb3f Atul Gupta 2018-03-31  1008  	sk_clear_bit(SOCKWQ_ASYNC_NOSPACE, sk);
36bedb3f Atul Gupta 2018-03-31  1009  	err = -EPIPE;
36bedb3f Atul Gupta 2018-03-31  1010  	if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN))
36bedb3f Atul Gupta 2018-03-31  1011  		goto out_err;
36bedb3f Atul Gupta 2018-03-31  1012  
36bedb3f Atul Gupta 2018-03-31  1013  	mss = csk->mss;
36bedb3f Atul Gupta 2018-03-31  1014  	csk_set_flag(csk, CSK_TX_MORE_DATA);
36bedb3f Atul Gupta 2018-03-31  1015  
36bedb3f Atul Gupta 2018-03-31  1016  	while (msg_data_left(msg)) {
36bedb3f Atul Gupta 2018-03-31  1017  		int copy = 0;
36bedb3f Atul Gupta 2018-03-31  1018  
36bedb3f Atul Gupta 2018-03-31  1019  		skb = skb_peek_tail(&csk->txq);
36bedb3f Atul Gupta 2018-03-31  1020  		if (skb) {
36bedb3f Atul Gupta 2018-03-31  1021  			copy = mss - skb->len;
36bedb3f Atul Gupta 2018-03-31  1022  			skb->ip_summed = CHECKSUM_UNNECESSARY;
36bedb3f Atul Gupta 2018-03-31  1023  		}
3b8305f5 Atul Gupta 2018-05-27  1024  		if (!csk_mem_free(cdev, sk))
3b8305f5 Atul Gupta 2018-05-27  1025  			goto wait_for_sndbuf;
36bedb3f Atul Gupta 2018-03-31  1026  
36bedb3f Atul Gupta 2018-03-31  1027  		if (is_tls_tx(csk) && !csk->tlshws.txleft) {
36bedb3f Atul Gupta 2018-03-31  1028  			struct tls_hdr hdr;
36bedb3f Atul Gupta 2018-03-31  1029  
36bedb3f Atul Gupta 2018-03-31  1030  			recordsz = tls_header_read(&hdr, &msg->msg_iter);
36bedb3f Atul Gupta 2018-03-31  1031  			size -= TLS_HEADER_LENGTH;
848dd1c1 Atul Gupta 2018-12-11  1032  			copied += TLS_HEADER_LENGTH;
36bedb3f Atul Gupta 2018-03-31  1033  			csk->tlshws.txleft = recordsz;
36bedb3f Atul Gupta 2018-03-31  1034  			csk->tlshws.type = hdr.type;
36bedb3f Atul Gupta 2018-03-31  1035  			if (skb)
36bedb3f Atul Gupta 2018-03-31  1036  				ULP_SKB_CB(skb)->ulp.tls.type = hdr.type;
36bedb3f Atul Gupta 2018-03-31  1037  		}
36bedb3f Atul Gupta 2018-03-31  1038  
36bedb3f Atul Gupta 2018-03-31  1039  		if (!skb || (ULP_SKB_CB(skb)->flags & ULPCB_FLAG_NO_APPEND) ||
36bedb3f Atul Gupta 2018-03-31  1040  		    copy <= 0) {
36bedb3f Atul Gupta 2018-03-31  1041  new_buf:
36bedb3f Atul Gupta 2018-03-31  1042  			if (skb) {
36bedb3f Atul Gupta 2018-03-31  1043  				tx_skb_finalize(skb);
36bedb3f Atul Gupta 2018-03-31  1044  				push_frames_if_head(sk);
36bedb3f Atul Gupta 2018-03-31  1045  			}
36bedb3f Atul Gupta 2018-03-31  1046  
36bedb3f Atul Gupta 2018-03-31  1047  			if (is_tls_tx(csk)) {
36bedb3f Atul Gupta 2018-03-31  1048  				skb = get_record_skb(sk,
36bedb3f Atul Gupta 2018-03-31  1049  						     select_size(sk,
36bedb3f Atul Gupta 2018-03-31  1050  								 recordsz,
36bedb3f Atul Gupta 2018-03-31  1051  								 flags,
36bedb3f Atul Gupta 2018-03-31  1052  								 TX_TLSHDR_LEN),
36bedb3f Atul Gupta 2018-03-31  1053  								 false);
36bedb3f Atul Gupta 2018-03-31  1054  			} else {
36bedb3f Atul Gupta 2018-03-31  1055  				skb = get_tx_skb(sk,
36bedb3f Atul Gupta 2018-03-31  1056  						 select_size(sk, size, flags,
36bedb3f Atul Gupta 2018-03-31  1057  							     TX_HEADER_LEN));
36bedb3f Atul Gupta 2018-03-31  1058  			}
36bedb3f Atul Gupta 2018-03-31  1059  			if (unlikely(!skb))
36bedb3f Atul Gupta 2018-03-31  1060  				goto wait_for_memory;
36bedb3f Atul Gupta 2018-03-31  1061  
36bedb3f Atul Gupta 2018-03-31  1062  			skb->ip_summed = CHECKSUM_UNNECESSARY;
36bedb3f Atul Gupta 2018-03-31  1063  			copy = mss;
36bedb3f Atul Gupta 2018-03-31  1064  		}
36bedb3f Atul Gupta 2018-03-31  1065  		if (copy > size)
36bedb3f Atul Gupta 2018-03-31  1066  			copy = size;
36bedb3f Atul Gupta 2018-03-31  1067  
36bedb3f Atul Gupta 2018-03-31  1068  		if (skb_tailroom(skb) > 0) {
36bedb3f Atul Gupta 2018-03-31  1069  			copy = min(copy, skb_tailroom(skb));
36bedb3f Atul Gupta 2018-03-31  1070  			if (is_tls_tx(csk))
36bedb3f Atul Gupta 2018-03-31  1071  				copy = min_t(int, copy, csk->tlshws.txleft);
36bedb3f Atul Gupta 2018-03-31  1072  			err = skb_add_data_nocache(sk, skb,
36bedb3f Atul Gupta 2018-03-31  1073  						   &msg->msg_iter, copy);
36bedb3f Atul Gupta 2018-03-31  1074  			if (err)
36bedb3f Atul Gupta 2018-03-31  1075  				goto do_fault;
36bedb3f Atul Gupta 2018-03-31  1076  		} else {
36bedb3f Atul Gupta 2018-03-31  1077  			int i = skb_shinfo(skb)->nr_frags;
36bedb3f Atul Gupta 2018-03-31  1078  			struct page *page = TCP_PAGE(sk);
36bedb3f Atul Gupta 2018-03-31  1079  			int pg_size = PAGE_SIZE;
36bedb3f Atul Gupta 2018-03-31  1080  			int off = TCP_OFF(sk);
36bedb3f Atul Gupta 2018-03-31  1081  			bool merge;
36bedb3f Atul Gupta 2018-03-31  1082  
848dd1c1 Atul Gupta 2018-12-11  1083  			if (page)
1dfe57aa Atul Gupta 2018-05-27  1084  				pg_size <<= compound_order(page);
36bedb3f Atul Gupta 2018-03-31  1085  			if (off < pg_size &&
36bedb3f Atul Gupta 2018-03-31  1086  			    skb_can_coalesce(skb, i, page, off)) {
36bedb3f Atul Gupta 2018-03-31  1087  				merge = 1;
36bedb3f Atul Gupta 2018-03-31  1088  				goto copy;
36bedb3f Atul Gupta 2018-03-31  1089  			}
36bedb3f Atul Gupta 2018-03-31  1090  			merge = 0;
36bedb3f Atul Gupta 2018-03-31  1091  			if (i == (is_tls_tx(csk) ? (MAX_SKB_FRAGS - 1) :
36bedb3f Atul Gupta 2018-03-31  1092  			    MAX_SKB_FRAGS))
36bedb3f Atul Gupta 2018-03-31  1093  				goto new_buf;
36bedb3f Atul Gupta 2018-03-31  1094  
36bedb3f Atul Gupta 2018-03-31  1095  			if (page && off == pg_size) {
36bedb3f Atul Gupta 2018-03-31  1096  				put_page(page);
36bedb3f Atul Gupta 2018-03-31  1097  				TCP_PAGE(sk) = page = NULL;
36bedb3f Atul Gupta 2018-03-31  1098  				pg_size = PAGE_SIZE;
36bedb3f Atul Gupta 2018-03-31  1099  			}
36bedb3f Atul Gupta 2018-03-31  1100  
36bedb3f Atul Gupta 2018-03-31  1101  			if (!page) {
36bedb3f Atul Gupta 2018-03-31  1102  				gfp_t gfp = sk->sk_allocation;
36bedb3f Atul Gupta 2018-03-31  1103  				int order = cdev->send_page_order;
36bedb3f Atul Gupta 2018-03-31  1104  
36bedb3f Atul Gupta 2018-03-31  1105  				if (order) {
36bedb3f Atul Gupta 2018-03-31  1106  					page = alloc_pages(gfp | __GFP_COMP |
36bedb3f Atul Gupta 2018-03-31  1107  							   __GFP_NOWARN |
36bedb3f Atul Gupta 2018-03-31  1108  							   __GFP_NORETRY,
36bedb3f Atul Gupta 2018-03-31  1109  							   order);
36bedb3f Atul Gupta 2018-03-31  1110  					if (page)
36bedb3f Atul Gupta 2018-03-31  1111  						pg_size <<=
36bedb3f Atul Gupta 2018-03-31  1112  							compound_order(page);
36bedb3f Atul Gupta 2018-03-31  1113  				}
36bedb3f Atul Gupta 2018-03-31  1114  				if (!page) {
36bedb3f Atul Gupta 2018-03-31  1115  					page = alloc_page(gfp);
36bedb3f Atul Gupta 2018-03-31  1116  					pg_size = PAGE_SIZE;
36bedb3f Atul Gupta 2018-03-31  1117  				}
36bedb3f Atul Gupta 2018-03-31  1118  				if (!page)
36bedb3f Atul Gupta 2018-03-31  1119  					goto wait_for_memory;
36bedb3f Atul Gupta 2018-03-31  1120  				off = 0;
36bedb3f Atul Gupta 2018-03-31  1121  			}
36bedb3f Atul Gupta 2018-03-31  1122  copy:
36bedb3f Atul Gupta 2018-03-31  1123  			if (copy > pg_size - off)
36bedb3f Atul Gupta 2018-03-31  1124  				copy = pg_size - off;
36bedb3f Atul Gupta 2018-03-31  1125  			if (is_tls_tx(csk))
36bedb3f Atul Gupta 2018-03-31  1126  				copy = min_t(int, copy, csk->tlshws.txleft);
36bedb3f Atul Gupta 2018-03-31  1127  
36bedb3f Atul Gupta 2018-03-31  1128  			err = chtls_skb_copy_to_page_nocache(sk, &msg->msg_iter,
36bedb3f Atul Gupta 2018-03-31  1129  							     skb, page,
36bedb3f Atul Gupta 2018-03-31  1130  							     off, copy);
36bedb3f Atul Gupta 2018-03-31  1131  			if (unlikely(err)) {
36bedb3f Atul Gupta 2018-03-31  1132  				if (!TCP_PAGE(sk)) {
36bedb3f Atul Gupta 2018-03-31  1133  					TCP_PAGE(sk) = page;
36bedb3f Atul Gupta 2018-03-31  1134  					TCP_OFF(sk) = 0;
36bedb3f Atul Gupta 2018-03-31  1135  				}
36bedb3f Atul Gupta 2018-03-31  1136  				goto do_fault;
36bedb3f Atul Gupta 2018-03-31  1137  			}
36bedb3f Atul Gupta 2018-03-31  1138  			/* Update the skb. */
36bedb3f Atul Gupta 2018-03-31  1139  			if (merge) {
36bedb3f Atul Gupta 2018-03-31 @1140  				skb_shinfo(skb)->frags[i - 1].size += copy;
36bedb3f Atul Gupta 2018-03-31  1141  			} else {
36bedb3f Atul Gupta 2018-03-31  1142  				skb_fill_page_desc(skb, i, page, off, copy);
36bedb3f Atul Gupta 2018-03-31  1143  				if (off + copy < pg_size) {
36bedb3f Atul Gupta 2018-03-31  1144  					/* space left keep page */
36bedb3f Atul Gupta 2018-03-31  1145  					get_page(page);
36bedb3f Atul Gupta 2018-03-31  1146  					TCP_PAGE(sk) = page;
36bedb3f Atul Gupta 2018-03-31  1147  				} else {
36bedb3f Atul Gupta 2018-03-31  1148  					TCP_PAGE(sk) = NULL;
36bedb3f Atul Gupta 2018-03-31  1149  				}
36bedb3f Atul Gupta 2018-03-31  1150  			}
36bedb3f Atul Gupta 2018-03-31  1151  			TCP_OFF(sk) = off + copy;
36bedb3f Atul Gupta 2018-03-31  1152  		}
36bedb3f Atul Gupta 2018-03-31  1153  		if (unlikely(skb->len == mss))
36bedb3f Atul Gupta 2018-03-31  1154  			tx_skb_finalize(skb);
36bedb3f Atul Gupta 2018-03-31  1155  		tp->write_seq += copy;
36bedb3f Atul Gupta 2018-03-31  1156  		copied += copy;
36bedb3f Atul Gupta 2018-03-31  1157  		size -= copy;
36bedb3f Atul Gupta 2018-03-31  1158  
36bedb3f Atul Gupta 2018-03-31  1159  		if (is_tls_tx(csk))
36bedb3f Atul Gupta 2018-03-31  1160  			csk->tlshws.txleft -= copy;
36bedb3f Atul Gupta 2018-03-31  1161  
36bedb3f Atul Gupta 2018-03-31  1162  		if (corked(tp, flags) &&
36bedb3f Atul Gupta 2018-03-31  1163  		    (sk_stream_wspace(sk) < sk_stream_min_wspace(sk)))
36bedb3f Atul Gupta 2018-03-31  1164  			ULP_SKB_CB(skb)->flags |= ULPCB_FLAG_NO_APPEND;
36bedb3f Atul Gupta 2018-03-31  1165  
36bedb3f Atul Gupta 2018-03-31  1166  		if (size == 0)
36bedb3f Atul Gupta 2018-03-31  1167  			goto out;
36bedb3f Atul Gupta 2018-03-31  1168  
36bedb3f Atul Gupta 2018-03-31  1169  		if (ULP_SKB_CB(skb)->flags & ULPCB_FLAG_NO_APPEND)
36bedb3f Atul Gupta 2018-03-31  1170  			push_frames_if_head(sk);
36bedb3f Atul Gupta 2018-03-31  1171  		continue;
3b8305f5 Atul Gupta 2018-05-27  1172  wait_for_sndbuf:
3b8305f5 Atul Gupta 2018-05-27  1173  		set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
36bedb3f Atul Gupta 2018-03-31  1174  wait_for_memory:
3b8305f5 Atul Gupta 2018-05-27  1175  		err = csk_wait_memory(cdev, sk, &timeo);
36bedb3f Atul Gupta 2018-03-31  1176  		if (err)
36bedb3f Atul Gupta 2018-03-31  1177  			goto do_error;
36bedb3f Atul Gupta 2018-03-31  1178  	}
36bedb3f Atul Gupta 2018-03-31  1179  out:
36bedb3f Atul Gupta 2018-03-31  1180  	csk_reset_flag(csk, CSK_TX_MORE_DATA);
36bedb3f Atul Gupta 2018-03-31  1181  	if (copied)
36bedb3f Atul Gupta 2018-03-31  1182  		chtls_tcp_push(sk, flags);
36bedb3f Atul Gupta 2018-03-31  1183  done:
36bedb3f Atul Gupta 2018-03-31  1184  	release_sock(sk);
848dd1c1 Atul Gupta 2018-12-11  1185  	return copied;
36bedb3f Atul Gupta 2018-03-31  1186  do_fault:
36bedb3f Atul Gupta 2018-03-31  1187  	if (!skb->len) {
36bedb3f Atul Gupta 2018-03-31  1188  		__skb_unlink(skb, &csk->txq);
36bedb3f Atul Gupta 2018-03-31  1189  		sk->sk_wmem_queued -= skb->truesize;
36bedb3f Atul Gupta 2018-03-31  1190  		__kfree_skb(skb);
36bedb3f Atul Gupta 2018-03-31  1191  	}
36bedb3f Atul Gupta 2018-03-31  1192  do_error:
36bedb3f Atul Gupta 2018-03-31  1193  	if (copied)
36bedb3f Atul Gupta 2018-03-31  1194  		goto out;
36bedb3f Atul Gupta 2018-03-31  1195  out_err:
36bedb3f Atul Gupta 2018-03-31  1196  	if (csk_conn_inline(csk))
36bedb3f Atul Gupta 2018-03-31  1197  		csk_reset_flag(csk, CSK_TX_MORE_DATA);
36bedb3f Atul Gupta 2018-03-31  1198  	copied = sk_stream_error(sk, flags, err);
36bedb3f Atul Gupta 2018-03-31  1199  	goto done;
36bedb3f Atul Gupta 2018-03-31  1200  }
36bedb3f Atul Gupta 2018-03-31  1201  

:::::: The code at line 1140 was first introduced by commit
:::::: 36bedb3f2e5b81832b5895363ed3fedb9ff1e8d0 crypto: chtls - Inline TLS record Tx

:::::: TO: Atul Gupta <atul.gupta@chelsio.com>
:::::: CC: David S. Miller <davem@davemloft.net>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2019-05-02 11:43 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-01 14:44 [PATCH v2 0/7] Convert skb_frag_t to bio_vec Matthew Wilcox
2019-05-01 14:44 ` [PATCH v2 1/7] net: Increase the size of skb_frag_t Matthew Wilcox
2019-05-01 14:44 ` [PATCH v2 2/7] net: Reorder the contents " Matthew Wilcox
2019-05-01 14:44 ` [PATCH v2 3/7] net: Use skb accessors in network drivers Matthew Wilcox
2019-05-01 17:56   ` Matthew Wilcox
2019-05-01 14:44 ` [PATCH v2 4/7] net: Use skb accessors in network core Matthew Wilcox
2019-05-01 14:44 ` [PATCH v2 5/7] net: Rename skb_frag page to bv_page Matthew Wilcox
2019-05-01 14:44 ` [PATCH v2 6/7] net: Rename skb_frag_t size to bv_len Matthew Wilcox
2019-05-02  9:49   ` kbuild test robot
2019-05-02 10:03   ` kbuild test robot
2019-05-02 11:42   ` kbuild test robot
2019-05-01 14:44 ` [PATCH v2 7/7] net: Convert skb_frag_t to bio_vec Matthew Wilcox
2019-05-02  9:52   ` kbuild test robot
2019-05-02 10:06   ` kbuild test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.