From: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
To: davem@davemloft.net
Cc: Alexander Duyck <alexander.h.duyck@redhat.com>,
netdev@vger.kernel.org, nhorman@redhat.com, sassmann@redhat.com,
jogreene@redhat.com, Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Subject: [net-next v2 01/17] fm10k: fold fm10k_pull_tail into fm10k_add_rx_frag
Date: Wed, 17 Jun 2015 05:54:48 -0700 [thread overview]
Message-ID: <1434545704-112470-2-git-send-email-jeffrey.t.kirsher@intel.com> (raw)
In-Reply-To: <1434545704-112470-1-git-send-email-jeffrey.t.kirsher@intel.com>
From: Alexander Duyck <alexander.h.duyck@redhat.com>
This change folds the fm10k_pull_tail call into fm10k_add_rx_frag. The
advantage to doing this is that the fragment doesn't have to be modified
after it is added to the skb.
Signed-off-by: Alexander Duyck <alexander.h.duyck@redhat.com>
Tested-by: Krishneil Singh <Krishneil.k.singh@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---
drivers/net/ethernet/intel/fm10k/fm10k_main.c | 66 ++++++++-------------------
1 file changed, 20 insertions(+), 46 deletions(-)
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_main.c b/drivers/net/ethernet/intel/fm10k/fm10k_main.c
index c754b20..982fdcd 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_main.c
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_main.c
@@ -269,16 +269,19 @@ static bool fm10k_add_rx_frag(struct fm10k_rx_buffer *rx_buffer,
struct sk_buff *skb)
{
struct page *page = rx_buffer->page;
+ unsigned char *va = page_address(page) + rx_buffer->page_offset;
unsigned int size = le16_to_cpu(rx_desc->w.length);
#if (PAGE_SIZE < 8192)
unsigned int truesize = FM10K_RX_BUFSZ;
#else
- unsigned int truesize = ALIGN(size, L1_CACHE_BYTES);
+ unsigned int truesize = SKB_DATA_ALIGN(size);
#endif
+ unsigned int pull_len;
- if ((size <= FM10K_RX_HDR_LEN) && !skb_is_nonlinear(skb)) {
- unsigned char *va = page_address(page) + rx_buffer->page_offset;
+ if (unlikely(skb_is_nonlinear(skb)))
+ goto add_tail_frag;
+ if (likely(size <= FM10K_RX_HDR_LEN)) {
memcpy(__skb_put(skb, size), va, ALIGN(size, sizeof(long)));
/* page is not reserved, we can reuse buffer as-is */
@@ -290,8 +293,21 @@ static bool fm10k_add_rx_frag(struct fm10k_rx_buffer *rx_buffer,
return false;
}
+ /* we need the header to contain the greater of either ETH_HLEN or
+ * 60 bytes if the skb->len is less than 60 for skb_pad.
+ */
+ pull_len = eth_get_headlen(va, FM10K_RX_HDR_LEN);
+
+ /* align pull length to size of long to optimize memcpy performance */
+ memcpy(__skb_put(skb, pull_len), va, ALIGN(pull_len, sizeof(long)));
+
+ /* update all of the pointers */
+ va += pull_len;
+ size -= pull_len;
+
+add_tail_frag:
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page,
- rx_buffer->page_offset, size, truesize);
+ (unsigned long)va & ~PAGE_MASK, size, truesize);
return fm10k_can_reuse_rx_page(rx_buffer, page, truesize);
}
@@ -518,44 +534,6 @@ static bool fm10k_is_non_eop(struct fm10k_ring *rx_ring,
}
/**
- * fm10k_pull_tail - fm10k specific version of skb_pull_tail
- * @skb: pointer to current skb being adjusted
- *
- * This function is an fm10k specific version of __pskb_pull_tail. The
- * main difference between this version and the original function is that
- * this function can make several assumptions about the state of things
- * that allow for significant optimizations versus the standard function.
- * As a result we can do things like drop a frag and maintain an accurate
- * truesize for the skb.
- */
-static void fm10k_pull_tail(struct sk_buff *skb)
-{
- struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[0];
- unsigned char *va;
- unsigned int pull_len;
-
- /* it is valid to use page_address instead of kmap since we are
- * working with pages allocated out of the lomem pool per
- * alloc_page(GFP_ATOMIC)
- */
- va = skb_frag_address(frag);
-
- /* we need the header to contain the greater of either ETH_HLEN or
- * 60 bytes if the skb->len is less than 60 for skb_pad.
- */
- pull_len = eth_get_headlen(va, FM10K_RX_HDR_LEN);
-
- /* align pull length to size of long to optimize memcpy performance */
- skb_copy_to_linear_data(skb, va, ALIGN(pull_len, sizeof(long)));
-
- /* update all of the pointers */
- skb_frag_size_sub(frag, pull_len);
- frag->page_offset += pull_len;
- skb->data_len -= pull_len;
- skb->tail += pull_len;
-}
-
-/**
* fm10k_cleanup_headers - Correct corrupted or empty headers
* @rx_ring: rx descriptor ring packet is being transacted on
* @rx_desc: pointer to the EOP Rx descriptor
@@ -580,10 +558,6 @@ static bool fm10k_cleanup_headers(struct fm10k_ring *rx_ring,
return true;
}
- /* place header in linear portion of buffer */
- if (skb_is_nonlinear(skb))
- fm10k_pull_tail(skb);
-
/* if eth_skb_pad returns an error the skb was freed */
if (eth_skb_pad(skb))
return true;
--
2.4.3
next prev parent reply other threads:[~2015-06-17 12:55 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-17 12:54 [net-next v2 00/17][pull request] Intel Wired LAN Driver Updates 2015-06-17 Jeff Kirsher
2015-06-17 12:54 ` Jeff Kirsher [this message]
2015-06-17 12:54 ` [net-next v2 02/17] fm10k: ignore invalid multicast address entries Jeff Kirsher
2015-06-17 12:54 ` [net-next v2 03/17] fm10k: use correct ethernet driver Tx timestamp function Jeff Kirsher
2015-06-17 12:54 ` [net-next v2 04/17] fm10k: move setting shinfo inside ts_tx_enqueue Jeff Kirsher
2015-06-17 12:54 ` [net-next v2 05/17] fm10k: fix incorrect free on skb in ts_tx_enqueue Jeff Kirsher
2015-06-17 12:54 ` [net-next v2 06/17] fm10k: add call to fm10k_clean_all_rx_rings in fm10k_down Jeff Kirsher
2015-06-17 12:54 ` [net-next v2 07/17] fm10k: use an unsigned int for i in ethtool_get_strings Jeff Kirsher
2015-06-17 12:54 ` [net-next v2 08/17] fm10k: remove extraneous NULL check on l2_accel Jeff Kirsher
2015-06-17 12:54 ` [net-next v2 09/17] fm10k: trivial fixup message style to include a colon Jeff Kirsher
2015-06-17 12:54 ` [net-next v2 10/17] fm10k: use dma_set_mask_and_coherent in fm10k_probe Jeff Kirsher
2015-06-17 12:54 ` [net-next v2 11/17] fm10k: force LPORT delete when updating VLAN or MAC address Jeff Kirsher
2015-06-17 12:54 ` [net-next v2 12/17] fm10k: re-map all possible VF queues after a VFLR Jeff Kirsher
2015-06-17 12:55 ` [net-next v2 13/17] fm10k: pack TLV overlay structures Jeff Kirsher
2015-06-17 12:55 ` [net-next v2 14/17] fm10k: fix incorrect DIR_NEVATIVE bit in 1588 code Jeff Kirsher
2015-06-17 12:55 ` [net-next v2 15/17] fm10k: remove err_no reference in fm10k_mbx.c Jeff Kirsher
2015-06-17 12:55 ` [net-next v2 16/17] fm10k: fix iov_msg_lport_state_pf issue Jeff Kirsher
2015-06-17 12:55 ` [net-next v2 17/17] fm10k: Fix missing braces after if statement Jeff Kirsher
2015-06-18 10:59 ` [net-next v2 00/17][pull request] Intel Wired LAN Driver Updates 2015-06-17 David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1434545704-112470-2-git-send-email-jeffrey.t.kirsher@intel.com \
--to=jeffrey.t.kirsher@intel.com \
--cc=alexander.h.duyck@redhat.com \
--cc=davem@davemloft.net \
--cc=jogreene@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=nhorman@redhat.com \
--cc=sassmann@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).