diff options
Diffstat (limited to 'Documentation/networking/NAPI_HOWTO.txt')
-rw-r--r-- | Documentation/networking/NAPI_HOWTO.txt | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/Documentation/networking/NAPI_HOWTO.txt b/Documentation/networking/NAPI_HOWTO.txt index 93af3e87c65b..fb8dc6422a52 100644 --- a/Documentation/networking/NAPI_HOWTO.txt +++ b/Documentation/networking/NAPI_HOWTO.txt | |||
@@ -95,8 +95,8 @@ There are two types of event register ACK mechanisms. | |||
95 | Move all to dev->poll() | 95 | Move all to dev->poll() |
96 | 96 | ||
97 | C) Ability to detect new work correctly. | 97 | C) Ability to detect new work correctly. |
98 | NAPI works by shutting down event interrupts when theres work and | 98 | NAPI works by shutting down event interrupts when there's work and |
99 | turning them on when theres none. | 99 | turning them on when there's none. |
100 | New packets might show up in the small window while interrupts were being | 100 | New packets might show up in the small window while interrupts were being |
101 | re-enabled (refer to appendix 2). A packet might sneak in during the period | 101 | re-enabled (refer to appendix 2). A packet might sneak in during the period |
102 | we are enabling interrupts. We only get to know about such a packet when the | 102 | we are enabling interrupts. We only get to know about such a packet when the |
@@ -114,7 +114,7 @@ Locking rules and environmental guarantees | |||
114 | only one CPU can pick the initial interrupt and hence the initial | 114 | only one CPU can pick the initial interrupt and hence the initial |
115 | netif_rx_schedule(dev); | 115 | netif_rx_schedule(dev); |
116 | - The core layer invokes devices to send packets in a round robin format. | 116 | - The core layer invokes devices to send packets in a round robin format. |
117 | This implies receive is totaly lockless because of the guarantee only that | 117 | This implies receive is totally lockless because of the guarantee that only |
118 | one CPU is executing it. | 118 | one CPU is executing it. |
119 | - contention can only be the result of some other CPU accessing the rx | 119 | - contention can only be the result of some other CPU accessing the rx |
120 | ring. This happens only in close() and suspend() (when these methods | 120 | ring. This happens only in close() and suspend() (when these methods |
@@ -510,7 +510,7 @@ static int my_poll (struct net_device *dev, int *budget) | |||
510 | an interrupt will be generated */ | 510 | an interrupt will be generated */ |
511 | goto done; | 511 | goto done; |
512 | } | 512 | } |
513 | /* done! at least thats what it looks like ;-> | 513 | /* done! at least that's what it looks like ;-> |
514 | if new packets came in after our last check on status bits | 514 | if new packets came in after our last check on status bits |
515 | they'll be caught by the while check and we go back and clear them | 515 | they'll be caught by the while check and we go back and clear them |
516 | since we havent exceeded our quota */ | 516 | since we havent exceeded our quota */ |
@@ -535,11 +535,11 @@ done: | |||
535 | * 1. it can race with disabling irqs in irq handler (which are done to | 535 | * 1. it can race with disabling irqs in irq handler (which are done to |
536 | * schedule polls) | 536 | * schedule polls) |
537 | * 2. it can race with dis/enabling irqs in other poll threads | 537 | * 2. it can race with dis/enabling irqs in other poll threads |
538 | * 3. if an irq raised after the begining of the outer beginning | 538 | * 3. if an irq raised after the beginning of the outer beginning |
539 | * loop(marked in the code above), it will be immediately | 539 | * loop (marked in the code above), it will be immediately |
540 | * triggered here. | 540 | * triggered here. |
541 | * | 541 | * |
542 | * Summarizing: the logic may results in some redundant irqs both | 542 | * Summarizing: the logic may result in some redundant irqs both |
543 | * due to races in masking and due to too late acking of already | 543 | * due to races in masking and due to too late acking of already |
544 | * processed irqs. The good news: no events are ever lost. | 544 | * processed irqs. The good news: no events are ever lost. |
545 | */ | 545 | */ |
@@ -601,7 +601,7 @@ a) | |||
601 | 601 | ||
602 | 5) dev->close() and dev->suspend() issues | 602 | 5) dev->close() and dev->suspend() issues |
603 | ========================================== | 603 | ========================================== |
604 | The driver writter neednt worry about this. The top net layer takes | 604 | The driver writer needn't worry about this; the top net layer takes |
605 | care of it. | 605 | care of it. |
606 | 606 | ||
607 | 6) Adding new Stats to /proc | 607 | 6) Adding new Stats to /proc |
@@ -622,9 +622,9 @@ FC should be programmed to apply in the case when the system cant pull out | |||
622 | packets fast enough i.e send a pause only when you run out of rx buffers. | 622 | packets fast enough i.e send a pause only when you run out of rx buffers. |
623 | Note FC in itself is a good solution but we have found it to not be | 623 | Note FC in itself is a good solution but we have found it to not be |
624 | much of a commodity feature (both in NICs and switches) and hence falls | 624 | much of a commodity feature (both in NICs and switches) and hence falls |
625 | under the same category as using NIC based mitigation. Also experiments | 625 | under the same category as using NIC based mitigation. Also, experiments |
626 | indicate that its much harder to resolve the resource allocation | 626 | indicate that it's much harder to resolve the resource allocation |
627 | issue (aka lazy receiving that NAPI offers) and hence quantify its usefullness | 627 | issue (aka lazy receiving that NAPI offers) and hence quantify its usefulness |
628 | proved harder. In any case, FC works even better with NAPI but is not | 628 | proved harder. In any case, FC works even better with NAPI but is not |
629 | necessary. | 629 | necessary. |
630 | 630 | ||
@@ -678,10 +678,10 @@ routine: | |||
678 | CSR5 bit of interest is only the rx status. | 678 | CSR5 bit of interest is only the rx status. |
679 | If you look at the last if statement: | 679 | If you look at the last if statement: |
680 | you just finished grabbing all the packets from the rx ring .. you check if | 680 | you just finished grabbing all the packets from the rx ring .. you check if |
681 | status bit says theres more packets just in ... it says none; you then | 681 | status bit says there are more packets just in ... it says none; you then |
682 | enable rx interrupts again; if a new packet just came in during this check, | 682 | enable rx interrupts again; if a new packet just came in during this check, |
683 | we are counting that CSR5 will be set in that small window of opportunity | 683 | we are counting that CSR5 will be set in that small window of opportunity |
684 | and that by re-enabling interrupts, we would actually triger an interrupt | 684 | and that by re-enabling interrupts, we would actually trigger an interrupt |
685 | to register the new packet for processing. | 685 | to register the new packet for processing. |
686 | 686 | ||
687 | [The above description nay be very verbose, if you have better wording | 687 | [The above description nay be very verbose, if you have better wording |