diff options
Diffstat (limited to 'drivers/net/sfc/rx.c')
-rw-r--r-- | drivers/net/sfc/rx.c | 68 |
1 files changed, 35 insertions, 33 deletions
diff --git a/drivers/net/sfc/rx.c b/drivers/net/sfc/rx.c index 98bff5ada09a..accf055ff89d 100644 --- a/drivers/net/sfc/rx.c +++ b/drivers/net/sfc/rx.c | |||
@@ -16,7 +16,6 @@ | |||
16 | #include <net/ip.h> | 16 | #include <net/ip.h> |
17 | #include <net/checksum.h> | 17 | #include <net/checksum.h> |
18 | #include "net_driver.h" | 18 | #include "net_driver.h" |
19 | #include "rx.h" | ||
20 | #include "efx.h" | 19 | #include "efx.h" |
21 | #include "falcon.h" | 20 | #include "falcon.h" |
22 | #include "selftest.h" | 21 | #include "selftest.h" |
@@ -61,7 +60,7 @@ | |||
61 | * rx_alloc_method = (rx_alloc_level > RX_ALLOC_LEVEL_LRO ? | 60 | * rx_alloc_method = (rx_alloc_level > RX_ALLOC_LEVEL_LRO ? |
62 | * RX_ALLOC_METHOD_PAGE : RX_ALLOC_METHOD_SKB) | 61 | * RX_ALLOC_METHOD_PAGE : RX_ALLOC_METHOD_SKB) |
63 | */ | 62 | */ |
64 | static int rx_alloc_method = RX_ALLOC_METHOD_PAGE; | 63 | static int rx_alloc_method = RX_ALLOC_METHOD_AUTO; |
65 | 64 | ||
66 | #define RX_ALLOC_LEVEL_LRO 0x2000 | 65 | #define RX_ALLOC_LEVEL_LRO 0x2000 |
67 | #define RX_ALLOC_LEVEL_MAX 0x3000 | 66 | #define RX_ALLOC_LEVEL_MAX 0x3000 |
@@ -293,8 +292,7 @@ static int __efx_fast_push_rx_descriptors(struct efx_rx_queue *rx_queue, | |||
293 | * fill anyway. | 292 | * fill anyway. |
294 | */ | 293 | */ |
295 | fill_level = (rx_queue->added_count - rx_queue->removed_count); | 294 | fill_level = (rx_queue->added_count - rx_queue->removed_count); |
296 | EFX_BUG_ON_PARANOID(fill_level > | 295 | EFX_BUG_ON_PARANOID(fill_level > EFX_RXQ_SIZE); |
297 | rx_queue->efx->type->rxd_ring_mask + 1); | ||
298 | 296 | ||
299 | /* Don't fill if we don't need to */ | 297 | /* Don't fill if we don't need to */ |
300 | if (fill_level >= rx_queue->fast_fill_trigger) | 298 | if (fill_level >= rx_queue->fast_fill_trigger) |
@@ -316,8 +314,7 @@ static int __efx_fast_push_rx_descriptors(struct efx_rx_queue *rx_queue, | |||
316 | retry: | 314 | retry: |
317 | /* Recalculate current fill level now that we have the lock */ | 315 | /* Recalculate current fill level now that we have the lock */ |
318 | fill_level = (rx_queue->added_count - rx_queue->removed_count); | 316 | fill_level = (rx_queue->added_count - rx_queue->removed_count); |
319 | EFX_BUG_ON_PARANOID(fill_level > | 317 | EFX_BUG_ON_PARANOID(fill_level > EFX_RXQ_SIZE); |
320 | rx_queue->efx->type->rxd_ring_mask + 1); | ||
321 | space = rx_queue->fast_fill_limit - fill_level; | 318 | space = rx_queue->fast_fill_limit - fill_level; |
322 | if (space < EFX_RX_BATCH) | 319 | if (space < EFX_RX_BATCH) |
323 | goto out_unlock; | 320 | goto out_unlock; |
@@ -329,8 +326,7 @@ static int __efx_fast_push_rx_descriptors(struct efx_rx_queue *rx_queue, | |||
329 | 326 | ||
330 | do { | 327 | do { |
331 | for (i = 0; i < EFX_RX_BATCH; ++i) { | 328 | for (i = 0; i < EFX_RX_BATCH; ++i) { |
332 | index = (rx_queue->added_count & | 329 | index = rx_queue->added_count & EFX_RXQ_MASK; |
333 | rx_queue->efx->type->rxd_ring_mask); | ||
334 | rx_buf = efx_rx_buffer(rx_queue, index); | 330 | rx_buf = efx_rx_buffer(rx_queue, index); |
335 | rc = efx_init_rx_buffer(rx_queue, rx_buf); | 331 | rc = efx_init_rx_buffer(rx_queue, rx_buf); |
336 | if (unlikely(rc)) | 332 | if (unlikely(rc)) |
@@ -448,17 +444,23 @@ static void efx_rx_packet_lro(struct efx_channel *channel, | |||
448 | bool checksummed) | 444 | bool checksummed) |
449 | { | 445 | { |
450 | struct napi_struct *napi = &channel->napi_str; | 446 | struct napi_struct *napi = &channel->napi_str; |
447 | gro_result_t gro_result; | ||
451 | 448 | ||
452 | /* Pass the skb/page into the LRO engine */ | 449 | /* Pass the skb/page into the LRO engine */ |
453 | if (rx_buf->page) { | 450 | if (rx_buf->page) { |
454 | struct sk_buff *skb = napi_get_frags(napi); | 451 | struct page *page = rx_buf->page; |
452 | struct sk_buff *skb; | ||
455 | 453 | ||
454 | EFX_BUG_ON_PARANOID(rx_buf->skb); | ||
455 | rx_buf->page = NULL; | ||
456 | |||
457 | skb = napi_get_frags(napi); | ||
456 | if (!skb) { | 458 | if (!skb) { |
457 | put_page(rx_buf->page); | 459 | put_page(page); |
458 | goto out; | 460 | return; |
459 | } | 461 | } |
460 | 462 | ||
461 | skb_shinfo(skb)->frags[0].page = rx_buf->page; | 463 | skb_shinfo(skb)->frags[0].page = page; |
462 | skb_shinfo(skb)->frags[0].page_offset = | 464 | skb_shinfo(skb)->frags[0].page_offset = |
463 | efx_rx_buf_offset(rx_buf); | 465 | efx_rx_buf_offset(rx_buf); |
464 | skb_shinfo(skb)->frags[0].size = rx_buf->len; | 466 | skb_shinfo(skb)->frags[0].size = rx_buf->len; |
@@ -470,17 +472,24 @@ static void efx_rx_packet_lro(struct efx_channel *channel, | |||
470 | skb->ip_summed = | 472 | skb->ip_summed = |
471 | checksummed ? CHECKSUM_UNNECESSARY : CHECKSUM_NONE; | 473 | checksummed ? CHECKSUM_UNNECESSARY : CHECKSUM_NONE; |
472 | 474 | ||
473 | napi_gro_frags(napi); | 475 | skb_record_rx_queue(skb, channel->channel); |
474 | 476 | ||
475 | out: | 477 | gro_result = napi_gro_frags(napi); |
476 | EFX_BUG_ON_PARANOID(rx_buf->skb); | ||
477 | rx_buf->page = NULL; | ||
478 | } else { | 478 | } else { |
479 | EFX_BUG_ON_PARANOID(!rx_buf->skb); | 479 | struct sk_buff *skb = rx_buf->skb; |
480 | EFX_BUG_ON_PARANOID(!checksummed); | ||
481 | 480 | ||
482 | napi_gro_receive(napi, rx_buf->skb); | 481 | EFX_BUG_ON_PARANOID(!skb); |
482 | EFX_BUG_ON_PARANOID(!checksummed); | ||
483 | rx_buf->skb = NULL; | 483 | rx_buf->skb = NULL; |
484 | |||
485 | gro_result = napi_gro_receive(napi, skb); | ||
486 | } | ||
487 | |||
488 | if (gro_result == GRO_NORMAL) { | ||
489 | channel->rx_alloc_level += RX_ALLOC_FACTOR_SKB; | ||
490 | } else if (gro_result != GRO_DROP) { | ||
491 | channel->rx_alloc_level += RX_ALLOC_FACTOR_LRO; | ||
492 | channel->irq_mod_score += 2; | ||
484 | } | 493 | } |
485 | } | 494 | } |
486 | 495 | ||
@@ -558,7 +567,7 @@ void __efx_rx_packet(struct efx_channel *channel, | |||
558 | if (unlikely(efx->loopback_selftest)) { | 567 | if (unlikely(efx->loopback_selftest)) { |
559 | efx_loopback_rx_packet(efx, rx_buf->data, rx_buf->len); | 568 | efx_loopback_rx_packet(efx, rx_buf->data, rx_buf->len); |
560 | efx_free_rx_buffer(efx, rx_buf); | 569 | efx_free_rx_buffer(efx, rx_buf); |
561 | goto done; | 570 | return; |
562 | } | 571 | } |
563 | 572 | ||
564 | if (rx_buf->skb) { | 573 | if (rx_buf->skb) { |
@@ -570,34 +579,28 @@ void __efx_rx_packet(struct efx_channel *channel, | |||
570 | * at the ethernet header */ | 579 | * at the ethernet header */ |
571 | rx_buf->skb->protocol = eth_type_trans(rx_buf->skb, | 580 | rx_buf->skb->protocol = eth_type_trans(rx_buf->skb, |
572 | efx->net_dev); | 581 | efx->net_dev); |
582 | |||
583 | skb_record_rx_queue(rx_buf->skb, channel->channel); | ||
573 | } | 584 | } |
574 | 585 | ||
575 | if (likely(checksummed || rx_buf->page)) { | 586 | if (likely(checksummed || rx_buf->page)) { |
576 | efx_rx_packet_lro(channel, rx_buf, checksummed); | 587 | efx_rx_packet_lro(channel, rx_buf, checksummed); |
577 | goto done; | 588 | return; |
578 | } | 589 | } |
579 | 590 | ||
580 | /* We now own the SKB */ | 591 | /* We now own the SKB */ |
581 | skb = rx_buf->skb; | 592 | skb = rx_buf->skb; |
582 | rx_buf->skb = NULL; | 593 | rx_buf->skb = NULL; |
583 | |||
584 | EFX_BUG_ON_PARANOID(rx_buf->page); | ||
585 | EFX_BUG_ON_PARANOID(rx_buf->skb); | ||
586 | EFX_BUG_ON_PARANOID(!skb); | 594 | EFX_BUG_ON_PARANOID(!skb); |
587 | 595 | ||
588 | /* Set the SKB flags */ | 596 | /* Set the SKB flags */ |
589 | skb->ip_summed = CHECKSUM_NONE; | 597 | skb->ip_summed = CHECKSUM_NONE; |
590 | 598 | ||
591 | skb_record_rx_queue(skb, channel->channel); | ||
592 | |||
593 | /* Pass the packet up */ | 599 | /* Pass the packet up */ |
594 | netif_receive_skb(skb); | 600 | netif_receive_skb(skb); |
595 | 601 | ||
596 | /* Update allocation strategy method */ | 602 | /* Update allocation strategy method */ |
597 | channel->rx_alloc_level += RX_ALLOC_FACTOR_SKB; | 603 | channel->rx_alloc_level += RX_ALLOC_FACTOR_SKB; |
598 | |||
599 | done: | ||
600 | ; | ||
601 | } | 604 | } |
602 | 605 | ||
603 | void efx_rx_strategy(struct efx_channel *channel) | 606 | void efx_rx_strategy(struct efx_channel *channel) |
@@ -632,7 +635,7 @@ int efx_probe_rx_queue(struct efx_rx_queue *rx_queue) | |||
632 | EFX_LOG(efx, "creating RX queue %d\n", rx_queue->queue); | 635 | EFX_LOG(efx, "creating RX queue %d\n", rx_queue->queue); |
633 | 636 | ||
634 | /* Allocate RX buffers */ | 637 | /* Allocate RX buffers */ |
635 | rxq_size = (efx->type->rxd_ring_mask + 1) * sizeof(*rx_queue->buffer); | 638 | rxq_size = EFX_RXQ_SIZE * sizeof(*rx_queue->buffer); |
636 | rx_queue->buffer = kzalloc(rxq_size, GFP_KERNEL); | 639 | rx_queue->buffer = kzalloc(rxq_size, GFP_KERNEL); |
637 | if (!rx_queue->buffer) | 640 | if (!rx_queue->buffer) |
638 | return -ENOMEM; | 641 | return -ENOMEM; |
@@ -647,7 +650,6 @@ int efx_probe_rx_queue(struct efx_rx_queue *rx_queue) | |||
647 | 650 | ||
648 | void efx_init_rx_queue(struct efx_rx_queue *rx_queue) | 651 | void efx_init_rx_queue(struct efx_rx_queue *rx_queue) |
649 | { | 652 | { |
650 | struct efx_nic *efx = rx_queue->efx; | ||
651 | unsigned int max_fill, trigger, limit; | 653 | unsigned int max_fill, trigger, limit; |
652 | 654 | ||
653 | EFX_LOG(rx_queue->efx, "initialising RX queue %d\n", rx_queue->queue); | 655 | EFX_LOG(rx_queue->efx, "initialising RX queue %d\n", rx_queue->queue); |
@@ -660,7 +662,7 @@ void efx_init_rx_queue(struct efx_rx_queue *rx_queue) | |||
660 | rx_queue->min_overfill = -1U; | 662 | rx_queue->min_overfill = -1U; |
661 | 663 | ||
662 | /* Initialise limit fields */ | 664 | /* Initialise limit fields */ |
663 | max_fill = efx->type->rxd_ring_mask + 1 - EFX_RXD_HEAD_ROOM; | 665 | max_fill = EFX_RXQ_SIZE - EFX_RXD_HEAD_ROOM; |
664 | trigger = max_fill * min(rx_refill_threshold, 100U) / 100U; | 666 | trigger = max_fill * min(rx_refill_threshold, 100U) / 100U; |
665 | limit = max_fill * min(rx_refill_limit, 100U) / 100U; | 667 | limit = max_fill * min(rx_refill_limit, 100U) / 100U; |
666 | 668 | ||
@@ -683,7 +685,7 @@ void efx_fini_rx_queue(struct efx_rx_queue *rx_queue) | |||
683 | 685 | ||
684 | /* Release RX buffers NB start at index 0 not current HW ptr */ | 686 | /* Release RX buffers NB start at index 0 not current HW ptr */ |
685 | if (rx_queue->buffer) { | 687 | if (rx_queue->buffer) { |
686 | for (i = 0; i <= rx_queue->efx->type->rxd_ring_mask; i++) { | 688 | for (i = 0; i <= EFX_RXQ_MASK; i++) { |
687 | rx_buf = efx_rx_buffer(rx_queue, i); | 689 | rx_buf = efx_rx_buffer(rx_queue, i); |
688 | efx_fini_rx_buffer(rx_queue, rx_buf); | 690 | efx_fini_rx_buffer(rx_queue, rx_buf); |
689 | } | 691 | } |