# Patent

## Title
Packet ordering system using an atomic ticket release command of a transactional memory

## Abstract

An Island-Based Network Flow Processor (IB-NFP) receives packets of many flows, and classifies them as belonging to an ordering context. These packets are distributed to a set of Worker Processors (WPs), so that each packet of the context is processed by one WP, but multiple WPs operate on packets of the context at a given time. The WPs use an atomic ticket release functionality of a transactional memory to assist in determining when to release packets to another set of Output Processors (OP). The packets are indicated to the set of OPs in the correct order, even though the WPs may complete their processing of the packets in an out-of-order fashion. For a packet that is indicated as to be released, an OP generates a “transmit command” such that the packet (or a descriptor of the packet) is then put into a properly ordered stream for output from the IB-NFP.

## Background
TECHNICAL FIELD
The described embodiments relate generally to packet ordering systems that maintain the order of packets as packets are output from a multi-processor NFP (Network Flow Processor), and to atomic ticket release functions employed in such systems, and to related structures and methods.
BACKGROUND INFORMATION AND PRIOR ART
A type of integrated circuit referred to here as a “network flow processor” is a useful component in the design and manufacture of various types of networking equipment. For example, one particular prior art network flow processor integrated circuit has various processors and transactional memories, special processing circuitry and hardware engines, as well as ingress circuitry and egress circuitry. The transactional memories can perform several different atomic transactional memory operations, one of which is an atomic ticket release operation. To use the ticket release function of a transactional memory that has a ticket lock functionality, a processor passes the transactional memory a value in what is called an atomic “ticket release” command. This command is really a request to release. In response to receiving the ticket release command, the transactional memory compares the value carried by the command to a “next expected value” stored in a block of memory. If the value carried in the command is determined to match the next expected value stored in the block of memory, then the transactional memory outputs an indication of this. The value is said to have been “released”. In addition, the transactional memory also indicates how many, if any, subsequent consecutive values were previously flagged by the transactional memory as having been previously received in other ticket release commands where the previously received values were not “released”. The transactional memory outputs an indication that all such consecutive values should also be released. After outputting this information, the transactional memory updates the “next expected value” stored so that it points to the first value in the sequence of values that is not flagged. If, on the other hand, the value carried in the ticket release command is determined not to match the “next expected value” stored in the block of memory, then a bit in a bitmap maintained by the transactional memory is set to flag the fact that the out-of-sequence value was received, but that it was not released. The transactional memory is then available to process another atomic ticket release command. When the transactional memory outputs an indication of one or more consecutive values in response to a ticket release command, these values are said to have been “released”. This ticket release mechanism is a general purpose mechanism provided by transactional memories on one type of prior art network flow processor. The transactional memories also provide other general purpose mechanisms. In the prior art network flow processor, packets are received onto the integrated circuit, and pass through the ingress circuitry, and are classified as belonging to one of a plurality of groups of flows. In one example, packets of each such group of flows are processed by a separate software pipeline. Packets are put into the software pipeline for processing the proper order, so the packets are then output from the software pipeline in the proper order, or in roughly the proper order. The packets of such a group of flows then pass through the egress circuitry, including the reordering hardware circuitry of the egress circuitry, and pass out of the network flow processor. For additional information on this prior art network flow processor, as well as for additional information on transactional memories in prior art network flow processors in general, see: 1) U.S. Pat. No. 8,775,686, entitled “Transactional Memory That Performs An Atomic Metering Command”, by Gavin J. Stark, filed Aug. 29, 2012; 2) U.S. Patent Publication Number 20140075147, having U.S. patent application Ser. No. 13/609,039, entitled “Transactional Memory That Performs An Atomic Look-Up, Add and Lock Operation”, by Gavin J. Stark et al., filed Sep. 10, 2012; and 3) U.S. patent application Ser. No. 14/172,844, entitled “Network Interface Device That Maps Host Bus Writes Of Configuration Information For Virtual NIDs Into A Small Transactional Memory”, filed Feb. 4, 2014, by Gavin J. Stark et al. (the entire subject matter of these three patent documents is incorporated by reference herein).
SUMMARY
An Island-Based Network Flow Processor (IB-NFP) integrated circuit receives packets of many flows, and classifies each of these incoming packets as belonging to one of a number of ordering contexts. As packets of this ordering context flow through the IB-NFP they are distributed to a set of Worker Processors (WPs), so that each packet is processed by one and only one WP, but multiple WPs are typically operating on packets of the ordering context at the same time.
In a first novel aspect, a distributed packet ordering system includes this first set of WPs, and also includes a second set of Output Processors (OPs). In one example of the ordering system there are more than one hundred WPs and less than twenty-five OPs. The ordering system handles releasing packets from the first set of WPs to the second set of OPs in the correct order, even though the WPs may complete their application layer processing of individual packets in an out-of-order fashion. Packets are released to the OPs, and are processed through the OPs, and are passed to egress circuitry, in the proper sequential order in accordance with “ordering sequence numbers” for the ordering context. There is one and only one OP that is responsible for generating “transmit commands” for packets of each ordering context, and there are multiple such OPs to support the generation of transmit commands for many different ordering contexts. For a given packet, the OP for an ordering context generates a transmit command in the correct format as required by the particular egress circuit destination through which the packet will exit the IB-NFP. For example, the OP can generate a transmit command to be of a first format if the destination of a packet is a first egress circuit, and the OP can generate the transmit command to be of a second format if the destination of the packet is a second egress circuit, where the first and second formats are different. The ordering system code executing on the WPs does not include code for generating these transmit commands, and the ordering system code executing on the OPs does not include application layer code nor does it include code for handling the reording of packets and the generation release messages to OPs. This novel distributed and segmented architecture of having a first set of WPs and a second set of OPs serves to simplify software operation, to reduce the amount of memory required to store the program code of the ordering system, and facilitates good usage of IB-NFP processing resources. The system is flexible and scalable to instances involving thousands of WPs.
In a second novel aspect, an Island-Based Network Flow Processor (IB-NFP) receives packets of many flows, and classifies each of these packets as belonging to one of a plurality of ordering contexts. The packets of an ordering context are distributed to a set of Worker Processors (WPs), so that each packet of the ordering context is processed by one and only one WP, but multiple WPs are typically operating on packets of the ordering context at a given same time. In this novel aspect, the WPs use a special atomic ticket release functionality of a special transactional memory to assist in determining when to indicate to another set of Output Processors (OP) that a packet of the ordering context should be released. The transactional memory maintains a ticket release bitmap for the ordering context. In this way, packets of the ordering context are indicated to the set of OPs as being to be released in the correct order (in accordance with their “ordering sequence numbers”), even though the WPs may complete their application layer processing of the packets in an out-of-order fashion. For a packet that is indicated as to be released, an OP generates a “transmit command” to the proper destination egress circuit such that an egress packet descriptor for the packet is then put into a properly ordered stream of packet egress packet descriptors, so that the corresponding packet will then be output from the IB-NFP. The packets that correspond to the egress packet descriptors in the stream are in order in accordance with their “ordering sequence numbers”. For a given packet, the OP generates a transmit command in the correct format as required by the particular egress destination circuit through which the packet will exit the IB-NFP. In one example, a first packet of an ordering context is to exit from the IB-NFP through a first egress destination circuit. The OP therefore generates the transmit command for this first packet so that the transmit command has a first format. A second packet of the same ordering context is, however, to exit from the IB-NFP through a second egress destination circuit. The OP therefore generates the transmit command for this second packet so that the transmit command has a second format.
Further details and embodiments and methods and techniques are described in the detailed description below. This summary does not purport to define the invention. The invention is defined by the claims.



BRIEF DESCRIPTION OF THE DRAWINGS
The accompanying drawings, where like numerals indicate like components, illustrate embodiments of the invention.
FIG. 1 is a diagram of a distributed packet ordering system in accordance with one novel aspect.
FIG. 2A is a part of a larger FIG. 2, where FIG. 2 is a flowchart of a method in accordance with one novel aspect.
FIG. 2B is a part of the larger FIG. 2.
FIG. 2C is a part of the larger FIG. 2.
FIG. 3 is a diagram that illustrates various parts of a “preclassification results” value that is generated by a picoengine pool.
FIG. 4 is a diagram that illustrates various parts of an ingress packet descriptor.
FIG. 5 is a diagram of mapping table used in the distributed packet ordering system.
FIG. 6 is a diagram that illustrates various parts of an egress packet descriptor.
FIG. 7 is a diagram of an example of a release request.
FIG. 8 is a diagram of an example of a release message.
FIG. 9 is a diagram that shows a first example of a “transmit command”, which in this case is a “packet complete command”.
FIG. 10 is a table that various parts of the packet complete command of FIG. 9.
FIG. 11 is a diagram that shows a second example of a “transmit command”, which in this case is an “NFD Out Send Message”.
FIG. 12 is a diagram of an Island-Based Network Flow Processor (IB-NFP) integrated circuit that implements one example of the novel distributed packet ordering system.
FIG. 13 is a diagram of one of the SerDes circuit blocks in the IB-NFP of FIG. 12.
FIG. 14 is a diagram of one of the ingress MAC islands 208 in the IB-NFP of FIG. 12.
FIG. 15 is a diagram of one of the ingress NBI islands 209 in the IB-NFP of FIG. 12.
FIG. 16 is a diagram of an ME island in the IB-NFP of FIG. 12.
FIG. 17 is a diagram of the CTM (Cluster Target Memory) in the ME island of FIG. 16.
FIG. 18 is a diagram of an MU (Memory Unit) island in the IB-NFP of FIG. 12.
FIG. 19 is a diagram of one of the egress NBI islands 200 in the IB-NFP of FIG. 12.
FIG. 20 is a diagram of one of the egress MAC islands 207 in the IB-NFP of FIG. 12.
FIG. 21 is a diagram of one of the PCIe islands in the IB-NFP of FIG. 12.
FIG. 22 is a diagram of the PCIe block within the PCIe island of FIG. 21.
FIG. 23 is a flowchart that illustrates steps involved in a CPP write operation.
FIG. 24 is a diagram of a CPP bus transaction value.
FIG. 25 is a table that sets forth the various fields in a command payload of a CPP bus command.
FIG. 26 is a table that sets forth the various fields in a pull-id payload of a CPP bus transaction.
FIG. 27 is a table that sets forth the various fields in a data payload of a CPP bus transaction.
FIG. 28 is a table that sets forth the various fields of a CPP data payload in the case of a pull.
FIG. 29 is a table that sets forth the various fields of a CPP data payload in the case of a push.
FIG. 30 is a flowchart that illustrates steps involved in a CPP read operation.



DETAILED DESCRIPTION
Reference will now be made in detail to background examples and some embodiments of the invention, examples of which are illustrated in the accompanying drawings.
FIG. 1 is a diagram of a distributed packet ordering system that is embodied in an Island-Based Network Flow Processor (IB-NFP) integrated circuit 1. The distributed packet ordering system includes an amount of library code (denoted “LIB” in the diagram) executing in each of a plurality of Worker Processors (WPs) 2-6, a plurality of ticket release bitmaps 7-10, a plurality of queues 11-14 of metadata, and a plurality of ordering Output Processors (OP) 15-16. The amount of library code executing in a WP is identical to the library code executing in each other of the WPs. In the diagram, amount of library code 17 is executing on WP 2, amount of library code 18 is executing on WP 3, amount of library code 19 is executing on WP 4, and amount of library code 20 is executing on WP 5, and an amount of library code 21 is executing on WP 6. The term “code” here means processor-executable instructions that are stored in a processor-readable medium (for example, a memory). A processor fetches such instructions from the memory, and executes them. A transactional memory 22 maintains the plurality of ticket release bitmaps 7-10. There is one ticket release bitmap for each one of a corresponding plurality of “ordering contexts”. The ticket release bitmap for an ordering context maintains or tracks the release state of each packet belonging to the ordering context. The ticket release bitmap tracks a packet by tracking its associated “ordering sequence number”. For each “ordering context”, there is also a queue of metadata. These queues 11-14 of metadata are stored in a second memory 23. The distributed packet ordering system also includes an amount of output processing code executing on OP 15, and another amount of output processing code executing on OP 16. In the diagram, the blocks representing the various parts of the distributed ordering system are darkened and denoted by stippling.
In addition to the parts outlined above, the IB-NFP 1 includes four “sources” of packets for the distributed ordering system. A first source is ingress NBI(1) circuit 24. Packets can pass into the IB-NFP via input/output circuitry 25, and via an ingress MAC(1) circuit 26, and then through the ingress NBI(1) circuit 24 and on to the distributed packet ordering system. In this sense, the ingress NBI(1) circuit is a first source. A second source is PCIe(1) circuit 27. Packets can pass into the IB-NFP via input/output circuitry 28 and then through the PCIe(1) circuit 27 and on to the distributed packet ordering system. In this sense, the PCIe(1) circuit 27 is a second source. A third source is ingress NBI(2) circuit 29. This circuit is substantially identical to the ingress NBI(1) circuit. Each of the two circuits 24 and 29 assigns packet sequence numbers to packets without reference to, or knowledge of, how the other circuit is assigning its packet sequence numbers. Packets can pass into the IB-NFP via input/output circuitry 30, and pass through an ingress MAC(2) circuit 31, and then through the ingress NBI(2) circuit 29, and on to the distributed packet ordering system. In this sense, the ingress NBI(2) circuit 29 is a third source. A fourth source is an Interlaken LA(1) circuit 32. Packets can pass into the IB-NFP via input/output circuitry 33 and then through the Interlaken LA(1) circuit 32 and on to the distributed packet ordering system. In this sense, the Interlaken LA(1) circuit 32 is a fourth source. The input/output circuits 25, 28, 30, 33, 36 and 39 depicted in FIG. 1 include integrated circuit terminals and SerDes circuitry as necessary to interface to circuitry outside the IB-NFP.
The IB-NFP 1 also includes four “destinations” for packets. A first destination is egress NBI(1) circuit 34. Packets can pass out of the IB-NFP via egress NBI(1) circuit 34, and then through an egress MAC(1) circuit 35, and then through input/output circuitry 36, and out of the IB-NFP. In this sense, the egress NBI(1) circuit 34 is a first destination for packets. Packets can also pass out of the IB-NFP via PCIe(1) circuit 27, and then through input/output circuitry 28. Although the destination circuit is shown again as another block in the illustration, the PCIe(1) circuit has both ingress and egress circuitry, so the same block 27 is shown as being a source and a destination. Packets can also pass out of the IB-NFP via egress NBI(2) circuit 37, and then through an egress MAC(2) circuit 38, and then through input/output circuitry 39. In this sense, the egress NBI(2) circuit 37 is a third destination for packets. Packets can also pass out of the IB-NFP via Interlaken LA(1) circuit 32, and then through input/output circuitry 33. Although the destination circuit is shown again as another block in the illustration, the Interlaken LA(1) circuit has both ingress and egress circuitry, so the same block 32 is shown as being a source and a destination.
In one particular example, the PCIe(1) circuit 27 is used to communicate packets and other information back and forth between the IB-NFP 1 and a host computer. The Interlaken LA(1) circuit 32 is used to communicate packets and other information back and forth between the IB-NFP integrated circuit and another identical IB-NFP integrated circuit. The two IB-NFP integrated circuits may, for example, be disposed on an expansion card (a printed circuit board) that is coupled to, and works with, the host computer. The host computer and the expansion card together are a physical network device (such as a server). In one example, the physical network device is a physical server machine that implements multiple virtual web servers as set forth in: U.S. patent application Ser. No. 14/172,844, entitled “Network Interface Device That Maps Host Bus Writes Of Configurable Information For Virtual NIDs Into A Small Transactional Memory”, filed Feb. 4, 2014, by Gavin J. Stark et al. (the entire subject matter of this patent application is incorporated by reference herein).
In addition, IB-NFP 1 of FIG. 1 includes an external memory unit (E-MU) interface circuit 40. This E-MU interface circuit 40 allows circuitry on the IB-NFP to access an amount of external DRAM 41 via the E-MU interface circuit 40. Processors and other circuits on the IB-NFP can interact with the E-MU using a Command/Push/Pull (CPP) bus as described in further detail below. In addition, the IB-NFP 1 includes a number of transactional memories referred to here as Cluster Target Memories (CTMs). Although only one CTM 42 is shown in the diagram of FIG. 1 due to space limitations in the diagram, the IB-NFP 1 actually has multiple such CTMs. As explained in further detail below, there is one such CTM in each ME island of the IB-NFP. Each CTM has a Packet Engine (PE) and an amount of memory. For CTM 42, the packet engine is identified by reference numeral 43 and the memory is identified by reference numeral 44.
In a high-level description of an operation of the distributed packet ordering system, packets of many different flows of are received onto the IB-NFP via various different sources. These flows are grouped into subsets of flows. A packet of such a subset is referred to as belonging to an “ordering context”. Packets belonging to many different ordering contexts are typically passing into the IB-NFP, are being processed by processors inside the IB-NFP, and are being output from the IB-NFP, at a given time. Each packet of an ordering context is assigned an “ordering sequence number” by the source that receives the packet, where the sequence numbers (“ordering sequence numbers”) of the packets of an ordering context indicate the order in which the packets were received onto the IB-NFP. In one example, an “ordering sequence number” is a 16-bit value, the lower eight bits of which are significant. Accordingly, assignment of the ordering sequence numbers for the associated “ordering context” start at “0000 0000 0000 0000”, and increment up to “0000 0000 1111 1111”, and then roll over and start again at “0000 0000 0000 0000”. Each packet of the ordering context is stamped with one of these “ordering sequence numbers” such that successive packets that are received onto the IB-NFP are assigned consecutive “ordering sequence numbers”.
After being stamped with the “ordering sequence numbers”, the packets of an “ordering context” are then spread out, or are distributed to, a set of Worker Processors (WP) that then perform application layer processing on the packets. Rather than having one WP perform this application layer processing on each packet, one by one, in a purely serial fashion, the processing load of performing this application layer processing is spread out among the many WPs of the set. Each packet is typically processed by one and only one such WP, and many such WPs are typically performing application layer processing on different packets of a particular “ordering context” at a given time. One of these WPs may carry out its processing more slowly than another, or for some other reason, the completion of the application layer processing by the WPs does not occur in the same order in which the packets were initially supplied to the WPs for processing. The distributed packet ordering system therefore effectively holds up the forwarding of selected packets as output by WPs as necessary so that when “egress packet descriptors” of the packets of the ordering context are supplied in a stream to an output scheduler in a destination circuit, the packets (to which these “egress packet descriptors” refer) as supplied to this scheduler (or traffic manager) are in the same order (with respect to one another) in which the packets were when the packets were received onto the IB-NFP. The packets may not be actually output from the IB-NFP in the received order, but their descriptors are present in the stream (as the stream is supplied to the scheduler or to the traffic manager) in the proper order.
FIG. 2 is a simplified flowchart that illustrates a method of operation of the distributed packet ordering system. A circled reference numeral appearing in the diagram of FIG. 1 corresponds to the method step in the flowchart of FIG. 2 that is labeled with the same circled reference numeral. A packet is received (step 101) onto the IB-NFP, and passes through the SerDes input/output circuitry 25, and through the ingress MAC(1) circuit 26, and to the ingress NBI(1) circuit 24. There is a group of small processors called the “picoengine pool” in the ingress NBI(1) circuit 24. A picoengine processor in this picoengine pool performs a hash function (step 102) on various fields in the header of the packet and thereby classifies the packet as belonging to a set or group of flows. In one example, the IP source address, IP destination address, TCP source port, and TCP destination port and the application layer protocol type (the so-called 5-tuple) are supplied as inputs to the hashing function, and the hashing function outputs a hash value. The hashing function employed determines which particular flows will be hashed to the same hash value. The picoengine pool includes an output data reader block. The output data reader block of the picoengine pool includes eight different digital counters. Each of these eight digital counters generates or outputs a corresponding sequence of “input sequence numbers”. These input sequence numbers are thirty-two bits long, but only the lower order sixteen bits are significant. When a packet is received that hashes to a given hash value, the picoengine uses the hash value to classify the packet into one of eight classes, and then includes a 3-bit value in its output data that indicates one of the eight classes. As the output data passes out of the picoengine pool, the output data passes through the output data reader block and the one of the digital counters identified by the 3-bit value inserts into the output data its counter output value (also referred to here as the “input sequence number”). After the input sequence number is inserted, the counter increments for the next occurrence. The resulting “preclassification results” for the packet therefore includes, among many other things, the following: 1) a 6-bit value (indicating one of a plurality of “buffer pools”), 2) a 32-bit “input sequence number” (only sixteen bits of which are significant), and 3) about 100 bits of metadata. A 2-bit value of the metadata indicates the particular island that is the source of the packet. A 3-bit value of the metadata indicates which NBI counter generated the “input sequence number”. In the present example, the source of the packet is the ingress NBI(1) island. For each packet analyzed by the picoengine pool, the picoengine pool outputs one such “preclassification results” value.
FIG. 3 is a diagram that illustrates the “preclassification results” for a packet.
The ingress-NBI(1) circuit 24 also maintains a list of values. Each such list is called a “buffer pool”. The criteria that the picoengine uses to determine which particular buffer pool to use for a given packet is different from the criteria used to select the NBI counter that generates the “input sequence number”. Each value in a buffer pool identifies a target in an ME island where a header portion of a packet can be stored. In the example of FIG. 2, a buffer pool entry identifies a packet engine (PE) in one of the ME islands. The DMA engine in the ingress NBI island that receives the preclassification results uses the buffer pool number (the first field of the “preclassification results”) to pull an entry value off the proper “buffer pool”. It then uses this entry value to identify a PE in a particular Cluster Target Memory (CTM) in a particular ME island (step 103).
In addition to containing a list of buffer pool entries, a buffer pool also has associated attributes. These attributes include: 1) an indication of a maximum CTM buffer size to use to store header portions in the CTM (the remaining packet data goes into an MU buffer); 2) a primary list of MU buffers to use to store the remaining packet data; 3) a backup list of MU buffers to use to store the packet data (when the first list is exhausted); 4) an offset to the start of the packet data where the packet data is stored in the CTM buffer; 5) a list of buffer pool entries, each of which identifies an ME island and packet engine to receive the packet. Multiple buffer pools can be used to send packet data to the same island.
In the example of the flowchart of FIG. 2, the DMA engine in the ingress-NBI(1) circuit 24 communicates with the identified packet engine (PE) across the CPP data bus of the IB-NFP integrated circuit and receives back from the PE a PPI (Packet Portion Identifier). The DMA engine then sends an “ingress packet descriptor” (that includes the picoengine preclassification results and metadata) and the initial portion of the packet (including initial headers) to the PE along with the PPI.
FIG. 4 is a diagram that illustrates the various fields of an “ingress packet descriptor” as the ingress packet descriptor is output by the DMA engine of the ingress NBI island. The PE handles storing this ingress packet descriptor and the header portion in the memory of the CTM (the particular CTM that contains the PE identified by the buffer pool entry value). In the example of FIG. 2, the ingress packet descriptor and header portion is stored in memory 44.
The ingress packet descriptor of FIG. 4 includes a 32-bit field that indicates where the header portion of the packet is stored in the CTM. In this example, because the ingress packet descriptor is stored in the CTM at a location immediately before the location that stores the corresponding header portion. Accordingly, the 32-bit field also indicates where the ingress packet descriptor is stored. The information in this 32-bit field includes: 1) information that identifies the packet engine PE that is responsible for storing the ingress packet descriptor, 2) information that identifies the island where the PE is located, and 3) the 9-bit PPI number associated with the packet header.
The ingress NBI(1) circuit 24 also maintains a “buffer list”. The buffer list is a list of addresses of buffers (starting addresses of buffers) where packet payloads can be stored. The DMA engine in the ingress NBI block pops the buffer list, and then sends (step 104) the remainder of the packet (typically this includes the payload) that exceeds the size of the CTM buffer to the buffer identified by the popped address. In this case, the address where the remainder of the packet (the payload) is stored indicates a buffer accessed by E-MU 40, such that the payload is actually stored in a buffer in the external DRAM 41. Note that the ingress packet descriptor of FIG. 4 also includes a 32-bit field that refers to this secondary buffer (where the payload of the packet is stored in external DRAM in this example).
At this point in the example of FIG. 2, the ingress packet descriptor and a portion of the header are stored in the memory 44 of the CTM 42. These values are stored in association with the PPI of the packet, so the PE can later use the PPI to retrieve these values. The payload of the packet, on the other hand, is stored in the external DRAM 41. The location where the payload is stored is a part of the ingress packet descriptor.
The PE 43 maintains a “work queue” of entries. Each entry value on this work queue identifies a WP that is available to process a packet. A microengine thread can put itself on a work queue of the PE in any island (including those islands outside of the island that contains the microengine). The PE pops the work queue, and thereby obtains an entry value that identifies which WP will process the packet. In this way, the PE selects (step 105) which WP will process the packet. Generally, any WPs in an island that works on packets can work on a packet regardless of which ordering context it belongs to. Due to this capability, scalability of the ordering system is enhanced because the full set of WPs can be used at all times, even when there is an imbalance in how packets are assigned to ordering contexts. Because there are multiple WPs having entries in the work queue, packet headers (of packets belonging to the ordering context) to be operated on are distributed out to these WPs.
In the example of FIG. 2, the ingress packet descriptor and header portion is forwarded by the PE 43 to the WP 2. WP 2 performs application layer processing on the packet. This processing is performed (step 106) by identical application layer code 45 that executes on WP 2. Each WP that processes packets has a copy of this code. In FIG. 1, these amounts of application layer code are identified by reference numerals 45-49. In the example of FIG. 2, WP 2 as selected by the PE from the “work queue”, so application layer code 45 performs application layer processing on the packet.
Upon receiving the ingress packet descriptor and header portion, the WP 2 performs an initial mapping operation to assign the packet to one of the plurality of “ordering contexts”. There is a one-to-one relationship between each counter (the counters in the ingress devices that generate the “input sequence numbers”) and a corresponding one of the “ordering contexts”. For each of these counters, there is one and only one ordering context.
FIG. 5 is a diagram of a mapping table used by the WP to perform this mapping function. There are eight counters in each ingress NBI island, and each is designated by a 3-bit number. The ingress NBI(1) island, the ingress NBI(2) island, the PCIe(1) island, and the Interlaken LA (1) island are designated in this example by numbers “001000”, “000100”, “000010” and “000001”, respectively. From the 3-bit counter number (the counter number within the source island where the counter is found) and the 6-bit source island number, a 6-bit number indicating the “ordering context” is determined using the mapping table. In the event the source island is a PCIe island, then the 3-bit field indicates the ring number and the source field identifies which PCIe island it was that is the source island where the ring is located. In the event the source island is an Interlaken LA island, then the 3-bit field indicates a queue and the 6-bit source field identifies which Interlaken LA island it was where the queue is located. The source field value is a 6-bit value because there are up to sixty-three islands. The same identical mapping table can be hardcoded into each of the WPs, or alternatively a single version of the mapping table can be provided as a central resource for all the WPs to use. The single mapping table may, for example, be stored in SRAM memory that is accessible to the WPs via the CPP bus through the I-MU island 205.
In addition to determining the 6-bit “ordering context number”, the WP also determines an “ordering sequence number”. In the present example, the “ordering sequence number” (as used by the global distributed packet ordering system) is simply the “input sequence number” (in the present example, as generated by one of the counters in the ingress-NBI. The “ordering sequence number” is a 16-bit value, however the application may choose to disregard some of the upper bits in this sequence number on a ordering-context-by-ordering-context basis. In the present example of FIG. 2, only the lower eight bits of the 16-bit ordering sequence number are significant. There is one such set of ordering sequence numbers for each “ordering context”.
In addition to determining the “ordering context” and in addition to assigning the packet an “ordering sequence number”, the application layer code executing on the WP also determines a “destination” for the packet (step 107). In the example of FIG. 1, the destination is one of the four egress circuits: the egress NBI(1) circuit 34, the PCIe circuit 27, the egress NBI circuit 37, and the Interlaken LA(1) circuit 32. Prior to this stage of processing of the packet, the destination of the packet is not known.
In one example, WP 2 uses information obtained by the application layer processing of the packet to modify the “ingress packet descriptor” to be an “egress packet descriptor”, and then causes the egress packet descriptor to be restored in the CTM in association with the PPI. The worker ME does this by reading the “ingress packet descriptor” out of the CTM using the PPI, by modifying the ingress packet descriptor into an egress packet descriptor, and by then causing the “egress packet descriptor” to be written back into the CTM. The ingress and egress packet descriptors are stored in the CTM (as controlled by the PE) at the same location, as determined by the PPI that has been allocated to the packet by the PE.
In another example, rather than the worker ME causing the egress packet descriptor to be stored back in the CTM, the application layer functionality in the WP generates the egress packet descriptor from information in the ingress packet descriptor as described above but most of that is forwarded directly from an OP processor to the destination. Operation of the OP processor is described below. Either way of storing and forwarding the egress packet descriptor can be used.
FIG. 6 is a diagram that shows the various fields of an “egress packet descriptor”. In addition to determining the destination, and in addition to generating the egress packet descriptor, the WP 2 causes the metadata to be stored (enqueued) in a queue for the “ordering context” (step 108). In the I-MU 23 memory, there is one queue for each ordering context, and the metadata is stored in the queue for the ordering context of the packet. This stored metadata includes: 1) an indication of the destination, and 2) information about how to format a “transmit command” for the packet. This metadata is stored in the queue in memory 23 in association with the “ordering sequence number” of the packet. In one advantageous aspect, the memory 23 that stores the queues 11-14 is a different memory from the memory 22 that stores the ticket release bitmaps 7-10.
In the example of FIG. 2, when WP 2 has completed its application layer processing of the packet, the WP 2 sends a “release request” (step 109) to the distributed packet ordering system. This “release request” is a request to release the packet having a particular “ordering sequence number” indicated in the release request. The term “release” here means to forward the packet to the egress circuitry of the IB-NFP so that the packet will then be output from the IB-NFP. This forwarding may involving forwarding the actual packet, or may involve forwarding a descriptor or other information about the packet. As mentioned above, in the example of FIG. 2, each WP has an amount of library code. The “release request” sent by application code 45 of WP 2 is a function call referred to as the “release function call”. This function call is a call to the library code 17 executing on the WP 2.
FIG. 7 is a diagram that depicts the “release function call”. The release function call includes: 1) a parameter that identifies the 6-bit “ordering context number” of the packet, 2) a parameter that identifies the “ordering sequence number” of the packet, 3) a parameter that identifies the metadata. The identified metadata in turn identifies: 4) the PPI that the packet engine assigned to the packet, 5) the particular packet engine (PE) that assigned the PPI, and 6) the destination to which the packet will be sent. In the specific example of FIG. 7, the PPI, the identifier of the PE, and the destination of the packet information are indicated by the “release function call” by identifying a write transfer register that in turn contains this information.
The distributed packet ordering system maintains one ticket release bitmap for each ordering context. In the example of FIG. 1, these ticket release bitmaps 7-10 are maintained in the transactional memory 22, and each ticket release bitmap includes enough flag bits to track the release state for all the possible sequence numbers of the ordering context. In addition, a “next expected sequence number” value (or “next sequence number expected” value) is maintained for each ticket release bitmap. In the illustration of FIG. 1, the “AE” stands for “atomic engine”.
In the example of FIG. 2, the library code 17 uses the ticket release bitmap 7 to request release of the packet, such that the packet is only indicated as being “to be released” if the packet is the next packet in the ordering sequence (for that “ordering context”) to be released. If a release request has not yet been received by the ticket release bitmap functionality for another packet having a lower “ordering sequence number”, then the receipt of the “release request” will be flagged in the bitmap by setting a flag bit for the “ordering sequence number” set forth in the release request. In such a case, no packet will be indicated (by the ticket release function) as “to be released” in response to the release request. If, however, the release request is a request to release the packet whose ordering sequence number is the next sequence number expected as maintained by the transactional memory, then the release request will result in the release of the packet indicated by the release request. In addition, any subsequent packet or packets whose flag bits were set in the bitmap will also be indicated as “to be released” provided that there are no unflagged sequence numbers with “ordering sequence numbers” smaller than the packet being released. The terms “release” and “to be released” are used interchangeably here, and mean that an indication of a packet to be sent out of the IB-NFP is supplied to the egress circuitry of the chip, so that the packet will then be output from the IB-NFP. There is a stream 50 (of packets, or egress packet descriptors) present in the egress circuitry, where the packets or egress packets descriptors are present there in the stream 50 in the same order as the corresponding packets were received onto the IB-NFP.
In the example of FIG. 2, library code 17 sends an atomic ticket release command (step 110) to the Atomic Engine (AE) of the transactional memory 22. An atomic ticket release command in this example is a command/push/pull (CPP) bus command that: 1) identifies the “ordering sequence number” of a packet whose release is being requested, and 2) identifies the bitmap for the appropriate ordering context. The CPP command identifies the bitmap because it includes the starting address in the transactional memory where the bitmap is found. The transactional memory 22 responds to the atomic ticket release command by accessing the indicated ticket release bitmap, performing its atomic ticket release function, and then returning an amount of “return data” (step 111). The “return data” is returned as part of the overall CPP bus transaction of the atomic ticket release command. The return data includes a number, where this number is a number of consecutive “ordering sequence numbers” the corresponding packets of which are to be released. If any such packets are indicated by the return data as to be released, then the transactional memory 22 automatically updates the “next sequence number expected” value it stores so that the stored “next sequence number expected” value as stored in the transactional memory now points to the next ordering sequence number for which a release request has not been received. The operation of the transactional memory 22 is “atomic” in that once a first WP has initiated an atomic ticket release operation, no other ticket release operation from another WP can be initiated or can interfere with the bitmap or “next sequence number expected” value until the atomic ticket release operation of the first WP has been completed and the return data for that operation has been sent to the first WP.
In one novel aspect, there is one and only one Output Processor (OP) that handles generating “transmit commands” for an ordering context. In the present example, OP 15 is the OP that handles generating transmit commands for the “ordering context” of the packet that was just processed by WP 2. Accordingly, library code 17 responds to the “return data” that it receives back from the transactional memory 22 by sending a “release message” to OP 15 (step 112).
FIG. 8 is a diagram that sets forth the format of the 32-bit payload of the release message. The release message is a CPP bus transaction whose payload communicates the single 32-bit value. Bits 0-2 of this 32-bit value indicate the ordering context, for which a release is being done. Bits 3-15 of this 32-bit value are unused. Bits 16-21 of this 32-bit value are a number, where the number is the number of next “ordering sequence numbers” that are to be released. The number can be one, or a larger number. Bits 22-30 of this 32-bit value are unused. Bit 31 of this 32-bit value is a valid bit that is set to “1”.
The OP that receives the “release message” keeps track of the last “ordering sequence number” that it released for the indicated “ordering context”, so when the OP receives indication that the next certain number of ordering sequence numbers are to be released in a release a message, the OP can determine what the corresponding “ordering sequence numbers” are. The release message therefor need not contain the actual ordering sequence numbers of the packets to be released, but rather the release message only needs to contain a number of sequence numbers. In the example of FIG. 2, OP 15 handles generating “transmit commands” for the ordering context of the packet, so the release message is sent to OP 15.
In response to receiving a release message, the OP uses the “ordering sequence number” of any packet that is indicated to be released to retrieve (step 113) the associated metadata from the memory 23. This is referred to as “dequeueing” the metadata. As mentioned above, the metadata was originally stored (enqueued) in memory 23 such that it was indexed by the ordering sequence number of the packet. Accordingly, the ordering sequence number of the packet to be released can later be used to identify the particular metadata for the desired packet and to read (dequeue) that metadata out of memory 23. The metadata as dequeued in this way from memory 23 indicates the destination through which the packet will be output when it is output from the IB-NFP.
Each different type of destination to which a packet may be sent may require a “transmit command” that has a different form. For example, a transmit command to cause a packet to be sent out through the egress NBI(1) circuit 34 has a first format, and a transmit command to cause a packet to be sent out through the PCIe(1) circuit 27 has a second format, where the first and second formats are different. OP 15 has specialized code for generating “transmit commands” of the various different formats, as required by the different possible destinations to which a packet can be sent. The OP uses the destination information (as obtained from the dequeued metadata) to generate a “transmit command” of the appropriate form to cause the packet to be output from the indicated destination.
For each NBI destination circuit, there is a separate 12-bit “transmit sequence number” that the NBI destination circuit uses to order packets as they are being output. For example, egress NBI(1) circuit 34 uses a first set of 12-bit “transmit sequence numbers” that are all in a first range. Egress NBI(2) circuit 37, on the other hand, uses a second set of 12-bit “transmit sequence numbers” that are all in a second range. These ranges overlap one another. The OP 15 converts the “ordering sequence number” of the packet to be released into a proper 12-bit “transmit sequence number” for the particular destination to which the packet is destined. To do this, the OP maintains a record of the last “transmit sequence number” for each egress NBI destination through which it causes packets to be output from the IB-NFP. When the OP seeks to release the next packet of the ordering context to that particular destination, the “transmit sequence number” assigned to the packet is the prior transmit sequence number plus one. In this way, the OP generates (step 114) the “transmit sequence number” that is includes in the “transmit command.”
The 12-bit transmit sequence numbers apply onto the egress NBI islands. To cause transmission out of an egress PCIe island or out of an egress ILA island, further processing by other software elements is required. The OPs use hardware-managed queues to preserve the order of requests, and these requests are supplied out of the OPs to the egress PCIe and egress ILA islands from these hardware-managed queues. Thus, transmission from an egress PCIe island or from an egress ILA island does not require that the OP generate a “transmit sequence number”. The particular OP that handles generating the proper form of transmit command that this island requires contains this specialized code. The hardware-managed queue is in one of the memory units.
In the case that the destination is an egress NBI island, the OP determines the 5-bit number of a “reorder queue” in the destination, where the particular “reorder queue” is the reorder queue for the “ordering context” of the packet to be released. The OP makes the 5-bit number a part of the egress packet descriptor, and uses the PPI to cause the PE to update the “egress packet descriptor” (as it is stored in the CTM) to contain this 5-bit “reorder queue” value.
FIG. 9 is a diagram that shows the various fields of a type of CPP command called a “packet complete” command. For additional information on the packet complete command, the packet engine, and how the packet engine works and handles the packet complete command, see: U.S. patent application Ser. No. 14/464,690, entitled “Packet Engine That Uses PPI Addressing”, filed Aug. 20, 2014, by Salma Mirza et al. (the entire subject matter of this patent application is incorporated by reference herein).
FIG. 10 is a table that shows more detail about the various fields of the packet complete command of FIG. 9. In the case of the destination being an egress NBI circuit, the “transmit command” is a packet complete command of the format set forth in the FIG. 9 and FIG. 10. In the example of FIG. 2, OP 15 generates (step 115) this “packet complete command” and sends it to PE (step 116) that originally allocated the PPI. The OP 15 knows from the release message which particular PE it was that originally assigned the PPI. The PE and the PPI are set forth in the egress packet descriptor.
The resulting “packet complete command” as it is sent out of the OP includes, among other things: 1) the PPI number of the packet, 2) the assigned 12-bit “transmit sequence number”, 3) a 5-bit number indicating the “reorder queue” in the egress device destination, and 4) an indication of the egress device destination to which the PE should forward the packet complete command. As shown in FIG. 10, the 12-bit “transmit sequence number” is spread out and is carried by three fields of the packet complete command: four bits of the data master island field, four bits of the master ID field, and four bits of the signal master field. These bits of these concatenated fields are the actual 12-bit “transmit sequence number”. Note that the “ordering sequence number” is not carried by the “packet complete command”.
The PE receives this “packet complete” command, and responds by forwarding (step 117) it on the egress destination. The PE also uses the PPI (from the packet complete command) to retrieve the egress packet descriptor from its memory 44, and then to send (step 118) that egress packet descriptor on to the destination. The 12-bit “transmit sequence” number is also embedded in the egress packet descriptor as part of the 32-bit “sequence number of the packet” field. Only the lower twelve bits of this 32-bit field are significant. Note that the egress packet descriptor as retrieved by the PE and as sent to the destination does not include the “ordering sequence number”. A portion of the metadata may not fit within the packet complete command, so the egress NBI may actually then retrieve this information from the CTM.
Accordingly, the reordering hardware in the destination (in the egress NBI(1) circuit 34 in this example) receives: 1) a number indicating the ordering context, 2) the 12-bit “transmit sequence number”, 3) a 5-bit number indicating the “reorder queue”, and 4) the egress packet descriptor. The reordering hardware uses the 12-bit “transmit sequence number” to do micro reordering (step 119) on the egress packet descriptors within the ordering context. The reordering hardware maintains one dedicated “reorder queue” for each “ordering context” for this purpose. All incoming egress packet descriptors of this ordering context are all stored into this same one reorder queue. Regardless of how the egress packet descriptors are loaded into this reorder queue, the reordering hardware only takes the egress packet descriptors out of the reorder queue in the proper order (in accordance with their 12-bit “transmit sequence numbers”). By virtue of the fact that the egress packet descriptors are properly ordered with respect to the “transmit sequence numbers”, the egress packet descriptors are also properly ordered with respect to the “ordering sequence numbers”.
In actuality, the egress NBI's ordering is really “best effort” in extreme cases. It is possible in an extreme situation for packets to arrive at the egress NBI sufficiently out of order that the egress NBI is overloaded and forwards on the packets out of order.
Even though the packet information is sent to the egress NBI(1) circuit 34 in the proper order, there may be delays in the communication across the bus structure of the IB-NFP integrated circuit from the PE 43 to the egress NBI(1) circuit 34 such that the information as received at the egress NBI(1) circuit 34 is out of order. For example, the egress packet descriptor for a first packet may be sent from the PE 43 to the egress NBI(1) circuit 34 before the egress packet descriptor of a second packet is sent, but yet the egress packet descriptor of the second packet as received by the egress NBI(1) circuit 34 is received first. The 12-bit “transmit sequence number” is used to correct for this possible erroneous reordering.
A stream of properly ordered egress packet descriptors as output by the reordering hardware is then pushed onto one or more “scheduler queues” (also called transmit queues) of a scheduler (or traffic manager). The egress packet descriptors in a “scheduler queue” are in the proper order, one with respect to the next, so that the corresponding packet (as referenced by the egress packet descriptor) that is top on a particular scheduler queue is always the oldest packet (the first received by the IB-NFP) of all the packets identified by egress packet descriptors in that scheduler queue. More than one scheduler queue can hold egress packet descriptors of packets of a given ordering context, but a given egress packet descriptor is only put onto one of the scheduler queues. The scheduler queues are used for QoS processing, and have nothing to do with packet ordering.
The scheduler and associated egress circuitry in the egress NBI(1) circuit 34 pops its scheduler queues (step 12) in some order. The order is determined by a scheduling rule. When a scheduler queue is popped, the egress packet descriptor obtained includes information about where the header portion of the packet is stored. The DMA engine of the egress NBI(1) circuit 34 uses this information to retrieve the packet header (step 120) from the CTM memory 42 where it is stored. The egress packet descriptor also includes information about where the payload of the packet is stored in the E-MU. The DMA engine of the egress NBI(1) circuit 34 uses this information to retrieve the payload (step 121) from external DRAM 41. The resulting assembled packet passes through a packet modifier (step 122) in the egress NBI(1) circuit 34, and is output from the egress NBI(1) circuit 34. The packet then passes through the egress MAC(1) circuit 35, and through the input/output circuitry 36, and out of the IB-NFP.
FIG. 11 is a diagram that illustrates the format of another type of “transmit command” used when the destination of a packet is the PCIe(1) circuit 27. In the case of the destination being the PCIe(1) circuit 27, the transmit command is sent directly from the OP 15 to the PCIe(1) circuit 27. The format shown in the diagram is the format of the sixteen bytes of information that is sent to the PCIe transmit subsystem, which in turn then transmits the packet to a “receive queue”. Transmission to the host requires further processing. This software (called “NFD”) allocates host memory buffers, builds master DMA transmissions to the host, enqueues host descriptors of packet metadata, and adjusts head/tail pointers and receive queue and freelists.
In the case of the destination being an egress PCIe island, the transmit command includes the following fields in order: 1) an indicator of the CTM island where the PE is located (6 bits); 2) unused (1 bit); 3) the PPI (9 bits); 4) buffer list number (2 bits); 5) start-of-packet/end-of-packet flags (2 bits); 6) offset to the start of the packet (12 bits); 7) CTM buffer size (2 bits); 8) an indication of which of the two ingress NBIs received the packet (1 bit); an MU buffer pointer (29 bits); 10) a valid bit (1 bit); 11) the prepended metadata length (7 bits); 12) the PCIe receive queue indicator (8 bits); 13) an indicator of the total length of the packet (16 bits); 14) stripped VLAN (16 bits); and 15) packet metadata flags (16 bits). The PCIe subsystem will deliver the packet to one of sixty-four “receive queues”, each of which is serviced independently by the host. Not all sixty-four “receive queues” may be in use. A queue may deliver packets to one of: 1) the host operating system, 2) the host application running in user space, 3) a virtual machine operating system; or 4) an application running in the user space of a virtual machine.
Some packets of an ordering context may be sent out of the IB-NFP via one destination, whereas other packets of the same ordering context may be sent out of the IB-NFP via another destination. The OP that handles the ordering context handles generating “transmit commands” of the appropriate format, depending on what the destination of the particular packet is. In one example, the program code for doing this is not stored in the form of many copies in the many WPs, but rather is provided only once in one OP. This architecture of the ordering system reduces the amount of memory space required to store the code for this formatting function of the ordering system, and better uses the combined processing throughput of the processors (the WPs and the OPs).
The architecture of the ordering system streamlines and simplifies the process of dequeueing and processing transmit descriptors. Without the OPs, the process of transmission would be complicated by locking mechanisms required for egress queue access, transmit sequence number assignment, and even serialization of access to ticket bitmaps. Although each ticket release is atomic, the return data is not delivered to separate WPs in order. The architecture that includes separate OPs provides uniform, serialized access for delivering packets within a set of ordering contexts.
For a general description of a transactional memory that operates with a CPP bus, see: 1) U.S. Pat. No. 8,775,686, entitled “Transactional Memory That Performs An Atomic Metering Command”, by Gavin J. Stark, filed Aug. 29, 2012; and 2) U.S. Patent Publication Number 20140075147, having U.S. patent application Ser. No. 13/609,039, entitled “Transactional Memory That Performs An Atomic Look-Up, Add and Lock Operation”, by Gavin J. Stark et al., filed Sep. 10, 2012 (the entire subject matter of these two patent documents is hereby incorporated by reference).
FIGS. 12-20 illustrate an example of an IB-NFP integrated circuit 150, within which an example of the novel distributed packet ordering system is embodied in accordance with one novel aspect. FIG. 12 is a simplified top-down diagram of the IB-NFP integrated circuit 150. For more detail on the IB-NFP 150 of FIG. 12, see: U.S. Patent Publication Number 20130219091, having U.S. patent application Ser. No. 13/399,888, entitled “Island-Based Network Flow Processor Integrated Circuit”, by Gavin J. Stark et al., filed Feb. 17, 2012 (the entire contents of which is hereby incorporated by reference). The IB-NFP integrated circuit 150 includes a peripheral first area of input/output circuit blocks 151-179. Each of the SerDes I/O circuit blocks 156-167 and 168-179 is duplex in that it has four 10 Gbps lanes for receiving SerDes information and it also has four 10 Gbps lanes for transmitting SerDes information. A SerDes circuit block can communicate information in both directions simultaneously. The three SerDes circuit blocks 162-164 can therefore communicate information at 120 gigabits per second in both directions. Respective ones of the DDR physical interfaces 151, 152, 154, 155, 166 and 167 are used to communicate with corresponding external memory integrated circuits 180, 181, 183, 184, 185 and 186, respectively. GPIO interface block 153 is used to receive configuration information from external PROM 182.
In addition to the first peripheral area of I/O blocks, the IB-NFP integrated circuit 150 also includes a second tiling area of islands 187-211. Each of these islands is either a full rectangular shape, or is half the size of the full rectangular shape. For example, the island 192 is a full island. The island 197 is a half island. The functional circuits in the various islands of this second tiling area are interconnected by: 1) a configurable mesh Command/Push/Pull (CPP) data bus, 2) a configurable mesh control bus, and 3) a configurable mesh event bus. Each such mesh bus extends over the two-dimensional space of islands with a regular grid or “mesh” pattern. In the case of the CPP data bus, as described in further detail below, functional circuitry in one island can use the CPP data bus to send a command to functional circuitry in another island, to read data from functional circuitry in another island, or a write data to functional circuitry in another island.
In addition to the second tiling area, there is a third area of larger sized blocks 212-216. The mesh bus structures do not extend into or over any of these larger blocks. The functional circuitry of a larger sized block may connect by direct dedicated connections to an interface island within the tiling area and through this interface island achieve connectivity to the mesh buses and other islands.
In the packet flow operation illustrated in FIG. 12, packet traffic is received into three SerDes blocks 162-164. The packet data in this particular example passes through dedicated connections from three SerDes circuit blocks 162-164 to the ingress MAC island 208 and then to the ingress NBI (Network Bus Interface) island 209. A picoengine pool with the ingress NBI island 209 performs a hash function on the incoming packets, and generates preclassification results for each packet. The packets are spread out to be processed by various worker microengines (or “Worker Processors” (WPs)) disposed in various ME islands 203, 199, 194 and 190. For each packet, the payload portion of the packet is generally stored either in internal SRAM block 215, or in external DRAMs 185 and 186. An ingress packet descriptor and a header portion of the packet is passed to the WP via a packet engine (the packet engine may, for example, be located in the CTM of the ME island containing one of the worker microengines). The WP then uses the header portion and the ingress packet descriptor to perform application layer processing on the packet.
When WP completes its application layer processing of the packet, it sends a release request to the distributed packet ordering system. In one example, this release request is a function call to an amount of local “library code” being executed by the WP. The library code is actually stored in a local shared memory that the WP shares with one other neighboring ME. Execution of the library code results in an atomic ticket release command being sent to a transactional memory 205 and 215 that maintains a ticket release bitmap for the ordering context. The transactional memory returns “return data”, that the library code then uses to issue a “release message” to an Output Processor (OP). The OP is another ME, that may be located in yet another ME island. The OP outputs a “transmit command” to the packet engine (PE) such that the header portion and an egress packet descriptor are passed to an intended destination of the packet. In the example of FIG. 12, the packet is passed to egress NBI(1) island 200. The egress NBI(1) island 200 performs hardware reordering, and supplies the packets (in the form of a egress packet descriptors) in a kind of stream into a scheduling queue or queues. Other circuits on the egress NBI(1) island 200 then perform scheduling, and packet modification, on the packets, and the resulting modified packets are passed from egress NBI(1) island 200 and to egress MAC island 207. Egress MAC island 207 buffers the packets, and converts them into symbols. The symbols are then delivered by dedicated conductors from the egress MAC island 207 to three SerDes circuit blocks 171-173 and out of the IB-NFP integrated circuit 150. Packets of a given “ordering context” are therefore processed by WPs located in multiple ME islands 190, 194, 199 and 203. After application layer processing, these packets can be made to be output from the IB-NFP by one or a smaller number of destinations.
FIG. 13 is a more detailed diagram of one of the SerDes circuit blocks 162.
FIG. 14 is a more detailed diagram of one of the ingress MAC islands 208. The ingress MAC island 208 receives packet data from six SerDes circuit blocks 162-167.
FIG. 15 is a more detailed diagram of one of the ingress NBI islands 209. The island 209 includes a picoengine pool 222, a DMA engine 223, and a DB interface 224 for interfacing with the CPP data bus. Eight counters that generate “input sequence numbers” are located in the picoengine pool 222. The DMA engine 223 causes the initial portion of the packet (for example, the header portion) and the ingress packet descriptor to be stored in a CTM in accordance with buffer pool information. The DMA engine 223 causes the payload portion to be stored in memory (for example, external DRAM) in accordance with buffer list information.
FIG. 16 is a more detailed diagram of one of the ME islands 203. The island includes twelve ME processors ME1-ME12, a DB island bridge 225 and DB interface circuits 226-227, and a Cluster Target Memory 228.
FIG. 17 is a more detailed diagram of the CTM 228 in ME island 203. The CTM 228 includes an amount of memory 229, a packet engine (PE) 230, and an Atomic Engine (AE) 231. The CTM 228 is one type of transactional memory on the IB-NFP that has the atomic ticket release functionality described above.
FIG. 18 is a more detailed diagram of one of the MU islands 205 and its companion SRAM block 215. The MU island/SRAM island pair is a transactional memory that has the atomic ticket release functionality. The MU island/SRAM island pair includes, among other things, a CPP data bus interface 232, an Atomic Engine (AE) 233, and data cache SRAM 234. The E-MU island 206 is of identical construction to the I-MU island 205, except that the E-MU island 206 has no associated memory companion SRAM block within the IB-NFP but rather has a companion memory in the form of external DRAM 185,186.
FIG. 19 is a more detailed diagram of one of the egress NBI islands 200. The egress NBI(1) island 200 includes a DB interface 235 for interfacing with the CPP data bus, a hardware packet reorder block 236, a scheduler queue SRAM 237, a scheduler 238, a DMA engine 239, an output FIFO 240, and a packet modifier 241. The hardware packet reorder block 236 is the block that performs micro ordering based on “transmit sequence numbers” as described above, and outputs a stream (of egress packet descriptors) where the indicated packets (as indicated by egress packet descriptors in the stream) are in the same order that they were in when they were received onto the IB-NFP.
FIG. 20 is a more detailed diagram of one of the egress MAC islands 207. The egress MAC island 207 outputs packets via six SerDes circuit blocks 173-168.
FIG. 21 is a diagram of the PCIe island 198 in the IB-NFP 150 of FIG. 12. The PCIe island 198 has the same general structure as an ME island, except that the PCIe island includes a PCIe block 217.
FIG. 22 is a diagram of the PCIe block 217 in the PCIe island 198 of FIG. 21. For additional detail on the structure and operation of the PCIe island 198 and PCIe block 217, see: U.S. patent application Ser. No. 14/172,844, entitled “Network Interface Device That Maps Host Bus Writes Of Configuration Information For Virtual NIDs Into A Small Transactional Memory”, filed Feb. 4, 2014, by Gavin J. Stark et al. (the entire subject matter of which is incorporated herein by reference).
CCP Data Bus Operation: Operation of the Command/Push/Pull data bus of the IB-NFP is described below in connection with FIGS. 23-30. The CPP data bus includes four “meshes”: a command mesh, a pull-id mesh, and two data meshes data0 and data1. FIG. 23 is a flowchart of a write operation method 1000 that might occur across the configurable mesh CPP data bus. In a first step (step 1001), certain functional circuitry in one of the islands uses its data bus interface to output a bus transaction value onto the configurable mesh CPP data bus. This functional circuitry is referred to as the “master” of the write operation. The format of the bus transaction value is as set forth in FIG. 24. A bus transaction value 1006 includes a metadata portion 1007 and a payload portion 1008 as shown. The metadata portion 1007 includes a final destination value 1009 and a valid bit 1010. In the case of the bus transaction value being a command, the payload is of the form shown in FIG. 25.
The bus transaction value in this case is a write command to write data into functional circuitry in another island. The functional circuitry that receives the bus transaction value and the data to be written is referred to as the “target” of the write operation. The write command is said to be “posted” by the master circuit onto the command mesh. As indicated in FIG. 24, the write command includes a metadata portion and a payload portion. The metadata portion includes the 6-bit final destination value. This final destination value identifies an island by number, where the island identified is the final destination of the bus transaction value. The final destination value is used by the various crossbar switches of the command mesh to route the bus transaction value (i.e., the command) from the master circuit to the appropriate target circuit. All bus transaction values on the data bus that originate from the same island that have the same final destination value will traverse through the configurable mesh data bus along the same one path all the way to the indicated final destination island.
A final destination island may have more than one potential target circuit. The 4-bit target field of payload portion indicates which one of these targets in the destination island it is that is the target of the command. The 5-bit action field of the payload portion indicates that the command is a write. The 14-bit data reference field is a reference usable by the master circuit to determine where in the master the data is to be found. The address field indicates an address in the target where the data is to be written. The length field indicates the amount of data.
In a next step (step 1002) in the method 1000 of FIG. 23, the target circuit receives the write command from the command mesh and examines the payload portion of the write command. From the action field the target circuit determines that it is to perform a write action. To carry out this action, the target circuit writes (i.e., posts) a bus transaction value (step 1003) called a pull-id onto the pull-id mesh. The pull-id is also of the format indicated in FIG. 24. The payload portion of the pull-id is of the format set forth in FIG. 26. The final destination field of the metadata portion of the pull-id indicates the island where the master circuit is located. The target port field identifies which sub-circuit target it is within the target's island that is the target circuit of the command. The pull-id is communicated through the pull-id mesh back to the master circuit.
The master circuit receives the pull-id from the pull-id mesh and uses the content of the data reference field of the pull-id to find the data. In the overall write operation, the master circuit knows the data it is trying to write into the target circuit. The data reference value that is returned with the pull-id is used by the master circuit as a flag to match the returning pull-id with the write operation the master circuit had previously initiated.
The master circuit responds by sending (step 1004) the identified data to the target across one of the data meshes data0 or data1 as a “pull” data bus transaction value. The term “pull” means that the data of the operation passes from the master to the target. The term “push” means that the data of the operation passes from the target to the master. The format of the “pull” data bus transaction value sent in this sending of data is also as indicated in FIG. 24. The format of the payload portion in the case of the payload being pull data is as set forth in FIG. 28. The first bit of the payload portion is asserted. This bit being a digital high indicates that the transaction is a data pull as opposed to a data push. The target circuit then receives (step 1005) the data pull bus transaction value across the data1 or data0 mesh. The target circuit writes the content of the data field (the data field of FIG. 28) of the pull data payload portion into target memory at the appropriate location indicated by the address field of the original write command.
FIG. 30 is a flowchart of a read operation method 2000 that might occur across the configurable mesh CPP data bus. In a first step (step 2001), a master circuit in one of the islands uses its data bus interface to output (to “post”) a bus transaction value onto the command mesh bus of the configurable mesh CPP data bus. In this case, the bus transaction value is a read command to read data from a target circuit. The format of the read command is as set forth in FIGS. 24 and 25. The read command includes a metadata portion and a payload portion. The metadata portion includes the 6-bit final destination value that indicates the island where the target is located. The action field of the payload portion of the read command indicates that the command is a read. The 14-bit data reference field is usable by the master circuit as a flag to associated returned data with the original read operation the master circuit previously initiated. The address field in the payload portion indicates an address in the target where the data is to be obtained. The length field indicates the amount of data.
The target receives the read command (step 2002) and examines the payload portion of the command. From the action field of the command payload portion the target circuit determines that it is to perform a read action. To carry out this action, the target circuit uses the address field and the length field to obtain the data requested. The target then pushes (step 2003) the obtained data back to the master circuit across data mesh data1 or data0. To push the data, the target circuit outputs a push bus transaction value onto the data1 or data0 mesh. FIG. 29 sets forth the format of the payload portion of this push bus transaction value. The first bit of the payload portion indicates that the bus transaction value is for a data push, as opposed to a data pull. The master circuit receives the bus transaction value of the data push (step 2004) from the data mesh bus. The master circuit then uses the data reference field of the push bus transaction value to associate the incoming data with the original read command, and from the original read command determines where the pushed data (data in the date field of the push bus transaction value) should be written into the master circuit. The master circuit then writes the content of the data field of the data field into the master's memory at the appropriate location. For a general description of the Command/Push/Pull data bus of the IB-NFP, and its four meshes, see: U.S. Patent Publication Number 20130219103, having U.S. patent application Ser. No. 13/399,324, entitled “Configurable Mesh Data Bus In An Island-Based Network Flow Processor”, filed Feb. 17, 2012, by Gavin J. Stark (all the subject matter of which is hereby incorporated by reference).
Each of the atomic ticket release commands described above in connection with the method of FIG. 2 is a CPP bus command. In the command bus transaction value of the atomic ticket release CPP bus command, the 5-bit action field is “01011” and the 2-bit token field is “00”. These two fields (see FIG. 25) together identify the command as an atomic ticket release command. The address that identifies the start of the particular ticket release bitmap to be used is carried in the 40-bit field of the command bus transaction value. The “result data” that is returned by the transactional memory in response to the atomic ticket release CPP command is returned in the 64-bit data field (see FIG. 27) of a data payload bus transaction value. As in an ordinary CPP bus transaction, the data payload is returned on one of the data meshes of the CPP data bus.
Although certain specific embodiments are described above for instructional purposes, the teachings of this patent document have general applicability and are not limited to the specific embodiments described above. A transactional memory that implements the atomic ticket release command functionality can be implemented by specifying the above-described functions of the circuit in a hardware description language (such as CDL, or Verilog, or VHDL), and then supplying that hardware description language code into a commercially available hardware synthesizer program such that the program then outputs layout data for making a hardware circuit that performs the specified functions. In one example, a single ticket release bitmap is implemented as a plurality of ticket release bitmap blocks that are chained together as set forth in: U.S. patent application Ser. No. 14/579,458, entitled “Ordering System That Employs Chained Ticket Release Bitmap Block Functions”, filed Dec. 22, 2014, by Christopher A. Telfer (all the subject matter of which is hereby incorporated by reference). Accordingly, various modifications, adaptations, and combinations of various features of the described embodiments can be practiced without departing from the scope of the invention as set forth in the claims.

## Claims

1. A method comprising:
(a) receiving packets of a plurality of flows onto an integrated circuit;
(b) assigning the packets of some but not all of the flows to an ordering context, wherein each packet of the ordering context is assigned a corresponding ordering sequence number, wherein the ordering sequence number is not a part of the packet as the packet is received in (a) onto the integrated circuit;
(c) maintaining a ticket release bitmap in a transactional memory;
(d) using the ticket release bitmap to track which packets of the ordering context have been flagged for future release by an ordering system but have not yet been released from the ordering system; and
(e) using a plurality of processors to perform application layer processing on the packets, wherein each processor further executes a corresponding amount of ordering system code, wherein each packet of the ordering context is processed by one of the processors as a result of execution of the amount of ordering system code such that after the application layer processing of the packet the processor issues an atomic ticket release command to the transactional memory thereby accessing the ticket release bitmap and such that the processor receives information in return back from the transactional memory, wherein the ordering system includes: 1) a plurality of ticket release bitmaps, one of which is the ticket release bitmap of (d), and 2) the amount of ordering system code executing on each processor of the plurality of processors, and wherein the transactional memory and the plurality of processors are parts of the integrated circuit.

2. The method of claim 1, wherein multiple ones of the processors perform application layer processing on packets of the ordering context, the method further comprising:
(f) outputting release messages from the multiple processors, wherein each release message indicates that one or more packets of the ordering context is to be released, wherein the release messages indicate packets to be released such that the packets are released in sequential order in accordance with their ordering sequence numbers, and wherein a packet is only indicated to be released by one of the release messages if the application layer processing of (e) has been completed on the packet.

3. The method of claim 1, wherein the ticket release bitmap of (c) includes a plurality of flag bits, wherein there is one flag bit of the plurality of flag bits for each corresponding ordering sequence number of the ordering context.

4. The method of claim 3, wherein there is a next sequence number expected value for the ordering context, and wherein the bitmap of (c) further includes a value indicative of the next sequence number expected value of the ordering context.

5. The method of claim 1, wherein the atomic ticket release command issued by the processor in (e) includes an ordering sequence number.

6. A method involving a plurality of packets of an ordering context, wherein each packet of the ordering context has an ordering sequence number, the method comprising:
(a) using a ticket release bitmap in a packet ordering system to track which packets of the ordering context of packets have been flagged for future release but have not yet been released, wherein the ticket release bitmap includes a flag bit for each ordering sequence number in the ordering context, and wherein the ticket release bitmap is maintained in one or more transactional memories.

7. The method of claim 6, wherein the using in (a) of the ticket release bitmap involves supplying atomic ticket release commands to the one or more transactional memories such that the one or more transactional memories access the ticket release bitmap.

8. The method of claim 7, further comprising:
(b) assigning ordering sequence numbers to the plurality of packets of the ordering context, wherein the packets of the ordering context are received onto an integrated circuit, wherein the one or more transactional memories are parts of the integrated circuit, and wherein none of the packets includes any of the assigned ordering sequence numbers upon being received onto the integrated circuit.

9. The method of claim 8, further comprising:
(c) outputting one or more release messages, wherein each release message indicates one or more of the packets of the ordering context that are to be released, wherein the release messages are output such that the packets of the ordering context are indicated to be released in sequential order in accordance with their ordering sequence numbers.

10. The method of claim 9, wherein a packet is only indicated to be released by a release message if an amount of application layer processing has first been performed on the packet after the assigning of ordering sequence numbers.

11. The method of claim 8, wherein the ordering context has an associated next sequence number expected value, and wherein the ticket release bitmap stores an indication of the next sequence number expected value.

12. The method of claim 11, wherein the packet ordering system indicates packets to be released, and wherein the atomic ticket release command updates the indicated next sequence number expected value as the packet ordering system indicates packets are to be released.

13. The method of claim 8, wherein each atomic ticket release command supplied to the one or more transactional memories includes an ordering sequence number.

14. The method of claim 8, wherein each atomic ticket release command supplied to the one or more transactional memories includes an ordering sequence number and an identification of a ticket release bitmap.

15. The method of claim 6, further comprising:
storing a second ticket release bitmap in the one or more transactional memories, wherein the second ticket release bitmap is used by the packet ordering system to track which packets of a second ordering context have been flagged for future release but have not yet been released.

16. The method of claim 6, wherein a packet is flagged for future release by supplying an atomic ticket release command to the one or more transactional memories, wherein the atomic ticket release command includes the ordering sequence number of the packet to be flagged.

17. A packet ordering system for ordering packets of an ordering context, wherein each packet of the ordering context has an ordering sequence number, the packet ordering system comprising:
a transactional memory that stores a ticket release bitmap, wherein the ticket release bitmap tracks which packets of the ordering context have been flagged for future release but have not yet been released from the packet ordering system, wherein the ticket release bitmap includes a flag bit for each ordering sequence number in the ordering context; and
means for: 1) supplying atomic ticket release commands to the transactional memory, wherein each atomic ticket release command includes an ordering sequence number.

18. The packet ordering system of claim 17, wherein the means is also for: 2) receiving data back from the transactional memory in response to the atomic ticket release commands, and 3) generating release messages, wherein each release message generated by the means indicates one or more of the packets of the ordering context that is/are to be released, wherein the release messages are generated such that the packets of the ordering context are indicated to be released in sequential order in accordance with their ordering sequence numbers.

19. The packet ordering system of claim 18, wherein the means comprises a plurality of processors, and wherein the packet ordering system is embodied in a network flow processor integrated circuit.

20. The packet ordering system of claim 18, wherein the transactional memory also stores a second ticket release bitmap, wherein the second ticket release bitmap tracks which packets of a second ordering context have been flagged for future release but have not yet been released from the packet ordering system.