diff options
| author | David S. Miller <davem@davemloft.net> | 2012-08-20 05:30:41 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2012-08-20 05:30:41 -0400 |
| commit | 4c6de2fedc321e17487b74547ad9f73f248faaac (patch) | |
| tree | 417ac1c7c99b0a3cfb8b1eded108898d894a1ae8 | |
| parent | e6a04b1d3ff9d5af219b2fcaebe0ef04733d597c (diff) | |
| parent | 62748b7bde84618f06b5c7a8733ae87776ec36c5 (diff) | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/ppwaskie/net-next
Peter P Waskiewicz Jr says:
====================
This series contains multiple updates to the ixgbe driver.
The following are changes since commit 02644a17457414f38e29f32d5c640b06d08fa092:
sctp: fix bogus if statement in sctp_auth_recv_cid()
and are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/ppwaskie/net-next master
Alexander Duyck (9):
ixgbe: Remove code that was initializing Rx page offset
ixgbe: combine ixgbe_add_rx_frag and ixgbe_can_reuse_page
ixgbe: Only use double buffering if page size is less than 8K
ixgbe: Have the CPU take ownership of the buffers sooner
ixgbe: Make pull tail function separate from rest of cleanup_headers
ixgbe: Copybreak sooner to avoid get_page/put_page and offset change
overhead
ixgbe: Make allocating skb and placing data in it a separate function
ixgbe: Roll RSC code into non-EOP code
ixgbe: Rewrite code related to configuring IFCS bit in Tx descriptor
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe.h | 25 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 497 |
2 files changed, 284 insertions, 238 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h index b9623e9ea895..bffcf1f2357a 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h | |||
| @@ -78,6 +78,9 @@ | |||
| 78 | 78 | ||
| 79 | /* Supported Rx Buffer Sizes */ | 79 | /* Supported Rx Buffer Sizes */ |
| 80 | #define IXGBE_RXBUFFER_256 256 /* Used for skb receive header */ | 80 | #define IXGBE_RXBUFFER_256 256 /* Used for skb receive header */ |
| 81 | #define IXGBE_RXBUFFER_2K 2048 | ||
| 82 | #define IXGBE_RXBUFFER_3K 3072 | ||
| 83 | #define IXGBE_RXBUFFER_4K 4096 | ||
| 81 | #define IXGBE_MAX_RXBUFFER 16384 /* largest size for a single descriptor */ | 84 | #define IXGBE_MAX_RXBUFFER 16384 /* largest size for a single descriptor */ |
| 82 | 85 | ||
| 83 | /* | 86 | /* |
| @@ -104,6 +107,7 @@ | |||
| 104 | #define IXGBE_TX_FLAGS_FSO (u32)(1 << 6) | 107 | #define IXGBE_TX_FLAGS_FSO (u32)(1 << 6) |
| 105 | #define IXGBE_TX_FLAGS_TXSW (u32)(1 << 7) | 108 | #define IXGBE_TX_FLAGS_TXSW (u32)(1 << 7) |
| 106 | #define IXGBE_TX_FLAGS_TSTAMP (u32)(1 << 8) | 109 | #define IXGBE_TX_FLAGS_TSTAMP (u32)(1 << 8) |
| 110 | #define IXGBE_TX_FLAGS_NO_IFCS (u32)(1 << 9) | ||
| 107 | #define IXGBE_TX_FLAGS_VLAN_MASK 0xffff0000 | 111 | #define IXGBE_TX_FLAGS_VLAN_MASK 0xffff0000 |
| 108 | #define IXGBE_TX_FLAGS_VLAN_PRIO_MASK 0xe0000000 | 112 | #define IXGBE_TX_FLAGS_VLAN_PRIO_MASK 0xe0000000 |
| 109 | #define IXGBE_TX_FLAGS_VLAN_PRIO_SHIFT 29 | 113 | #define IXGBE_TX_FLAGS_VLAN_PRIO_SHIFT 29 |
| @@ -293,16 +297,25 @@ struct ixgbe_ring_feature { | |||
| 293 | * this is twice the size of a half page we need to double the page order | 297 | * this is twice the size of a half page we need to double the page order |
| 294 | * for FCoE enabled Rx queues. | 298 | * for FCoE enabled Rx queues. |
| 295 | */ | 299 | */ |
| 296 | #if defined(IXGBE_FCOE) && (PAGE_SIZE < 8192) | 300 | static inline unsigned int ixgbe_rx_bufsz(struct ixgbe_ring *ring) |
| 297 | static inline unsigned int ixgbe_rx_pg_order(struct ixgbe_ring *ring) | ||
| 298 | { | 301 | { |
| 299 | return test_bit(__IXGBE_RX_FCOE, &ring->state) ? 1 : 0; | 302 | #ifdef IXGBE_FCOE |
| 303 | if (test_bit(__IXGBE_RX_FCOE, &ring->state)) | ||
| 304 | return (PAGE_SIZE < 8192) ? IXGBE_RXBUFFER_4K : | ||
| 305 | IXGBE_RXBUFFER_3K; | ||
| 306 | #endif | ||
| 307 | return IXGBE_RXBUFFER_2K; | ||
| 300 | } | 308 | } |
| 301 | #else | 309 | |
| 302 | #define ixgbe_rx_pg_order(_ring) 0 | 310 | static inline unsigned int ixgbe_rx_pg_order(struct ixgbe_ring *ring) |
| 311 | { | ||
| 312 | #ifdef IXGBE_FCOE | ||
| 313 | if (test_bit(__IXGBE_RX_FCOE, &ring->state)) | ||
| 314 | return (PAGE_SIZE < 8192) ? 1 : 0; | ||
| 303 | #endif | 315 | #endif |
| 316 | return 0; | ||
| 317 | } | ||
| 304 | #define ixgbe_rx_pg_size(_ring) (PAGE_SIZE << ixgbe_rx_pg_order(_ring)) | 318 | #define ixgbe_rx_pg_size(_ring) (PAGE_SIZE << ixgbe_rx_pg_order(_ring)) |
| 305 | #define ixgbe_rx_bufsz(_ring) ((PAGE_SIZE / 2) << ixgbe_rx_pg_order(_ring)) | ||
| 306 | 319 | ||
| 307 | struct ixgbe_ring_container { | 320 | struct ixgbe_ring_container { |
| 308 | struct ixgbe_ring *ring; /* pointer to linked list of rings */ | 321 | struct ixgbe_ring *ring; /* pointer to linked list of rings */ |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 4326f74f7137..fa0d6e1561c1 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
| @@ -1167,7 +1167,7 @@ static bool ixgbe_alloc_mapped_page(struct ixgbe_ring *rx_ring, | |||
| 1167 | } | 1167 | } |
| 1168 | 1168 | ||
| 1169 | bi->dma = dma; | 1169 | bi->dma = dma; |
| 1170 | bi->page_offset ^= ixgbe_rx_bufsz(rx_ring); | 1170 | bi->page_offset = 0; |
| 1171 | 1171 | ||
| 1172 | return true; | 1172 | return true; |
| 1173 | } | 1173 | } |
| @@ -1320,29 +1320,6 @@ static unsigned int ixgbe_get_headlen(unsigned char *data, | |||
| 1320 | return max_len; | 1320 | return max_len; |
| 1321 | } | 1321 | } |
| 1322 | 1322 | ||
| 1323 | static void ixgbe_get_rsc_cnt(struct ixgbe_ring *rx_ring, | ||
| 1324 | union ixgbe_adv_rx_desc *rx_desc, | ||
| 1325 | struct sk_buff *skb) | ||
| 1326 | { | ||
| 1327 | __le32 rsc_enabled; | ||
| 1328 | u32 rsc_cnt; | ||
| 1329 | |||
| 1330 | if (!ring_is_rsc_enabled(rx_ring)) | ||
| 1331 | return; | ||
| 1332 | |||
| 1333 | rsc_enabled = rx_desc->wb.lower.lo_dword.data & | ||
| 1334 | cpu_to_le32(IXGBE_RXDADV_RSCCNT_MASK); | ||
| 1335 | |||
| 1336 | /* If this is an RSC frame rsc_cnt should be non-zero */ | ||
| 1337 | if (!rsc_enabled) | ||
| 1338 | return; | ||
| 1339 | |||
| 1340 | rsc_cnt = le32_to_cpu(rsc_enabled); | ||
| 1341 | rsc_cnt >>= IXGBE_RXDADV_RSCCNT_SHIFT; | ||
| 1342 | |||
| 1343 | IXGBE_CB(skb)->append_cnt += rsc_cnt - 1; | ||
| 1344 | } | ||
| 1345 | |||
| 1346 | static void ixgbe_set_rsc_gso_size(struct ixgbe_ring *ring, | 1323 | static void ixgbe_set_rsc_gso_size(struct ixgbe_ring *ring, |
| 1347 | struct sk_buff *skb) | 1324 | struct sk_buff *skb) |
| 1348 | { | 1325 | { |
| @@ -1440,16 +1417,28 @@ static bool ixgbe_is_non_eop(struct ixgbe_ring *rx_ring, | |||
| 1440 | 1417 | ||
| 1441 | prefetch(IXGBE_RX_DESC(rx_ring, ntc)); | 1418 | prefetch(IXGBE_RX_DESC(rx_ring, ntc)); |
| 1442 | 1419 | ||
| 1443 | if (likely(ixgbe_test_staterr(rx_desc, IXGBE_RXD_STAT_EOP))) | 1420 | /* update RSC append count if present */ |
| 1444 | return false; | 1421 | if (ring_is_rsc_enabled(rx_ring)) { |
| 1422 | __le32 rsc_enabled = rx_desc->wb.lower.lo_dword.data & | ||
| 1423 | cpu_to_le32(IXGBE_RXDADV_RSCCNT_MASK); | ||
| 1424 | |||
| 1425 | if (unlikely(rsc_enabled)) { | ||
| 1426 | u32 rsc_cnt = le32_to_cpu(rsc_enabled); | ||
| 1445 | 1427 | ||
| 1446 | /* append_cnt indicates packet is RSC, if so fetch nextp */ | 1428 | rsc_cnt >>= IXGBE_RXDADV_RSCCNT_SHIFT; |
| 1447 | if (IXGBE_CB(skb)->append_cnt) { | 1429 | IXGBE_CB(skb)->append_cnt += rsc_cnt - 1; |
| 1448 | ntc = le32_to_cpu(rx_desc->wb.upper.status_error); | 1430 | |
| 1449 | ntc &= IXGBE_RXDADV_NEXTP_MASK; | 1431 | /* update ntc based on RSC value */ |
| 1450 | ntc >>= IXGBE_RXDADV_NEXTP_SHIFT; | 1432 | ntc = le32_to_cpu(rx_desc->wb.upper.status_error); |
| 1433 | ntc &= IXGBE_RXDADV_NEXTP_MASK; | ||
| 1434 | ntc >>= IXGBE_RXDADV_NEXTP_SHIFT; | ||
| 1435 | } | ||
| 1451 | } | 1436 | } |
| 1452 | 1437 | ||
| 1438 | /* if we are the last buffer then there is nothing else to do */ | ||
| 1439 | if (likely(ixgbe_test_staterr(rx_desc, IXGBE_RXD_STAT_EOP))) | ||
| 1440 | return false; | ||
| 1441 | |||
| 1453 | /* place skb in next buffer to be received */ | 1442 | /* place skb in next buffer to be received */ |
| 1454 | rx_ring->rx_buffer_info[ntc].skb = skb; | 1443 | rx_ring->rx_buffer_info[ntc].skb = skb; |
| 1455 | rx_ring->rx_stats.non_eop_descs++; | 1444 | rx_ring->rx_stats.non_eop_descs++; |
| @@ -1458,6 +1447,78 @@ static bool ixgbe_is_non_eop(struct ixgbe_ring *rx_ring, | |||
| 1458 | } | 1447 | } |
| 1459 | 1448 | ||
| 1460 | /** | 1449 | /** |
| 1450 | * ixgbe_pull_tail - ixgbe specific version of skb_pull_tail | ||
| 1451 | * @rx_ring: rx descriptor ring packet is being transacted on | ||
| 1452 | * @skb: pointer to current skb being adjusted | ||
| 1453 | * | ||
| 1454 | * This function is an ixgbe specific version of __pskb_pull_tail. The | ||
| 1455 | * main difference between this version and the original function is that | ||
| 1456 | * this function can make several assumptions about the state of things | ||
| 1457 | * that allow for significant optimizations versus the standard function. | ||
| 1458 | * As a result we can do things like drop a frag and maintain an accurate | ||
| 1459 | * truesize for the skb. | ||
| 1460 | */ | ||
| 1461 | static void ixgbe_pull_tail(struct ixgbe_ring *rx_ring, | ||
| 1462 | struct sk_buff *skb) | ||
| 1463 | { | ||
| 1464 | struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[0]; | ||
| 1465 | unsigned char *va; | ||
| 1466 | unsigned int pull_len; | ||
| 1467 | |||
| 1468 | /* | ||
| 1469 | * it is valid to use page_address instead of kmap since we are | ||
| 1470 | * working with pages allocated out of the lomem pool per | ||
| 1471 | * alloc_page(GFP_ATOMIC) | ||
| 1472 | */ | ||
| 1473 | va = skb_frag_address(frag); | ||
| 1474 | |||
| 1475 | /* | ||
| 1476 | |||
