Anyone to review? Please could you go a step further and remove one useless header level, fix links, enclose code with double backticks and other basic stuff? Thanks
01/06/2022 11:57, Kai Ji: > Update and rephrasing some sentences, small improvements > made to the multi-process sample application user guide > > Fixes: d0dff9ba445e ("doc: sample application user guide") > Cc: bernard.iremon...@intel.com > > Signed-off-by: Kai Ji <kai...@intel.com> > --- > doc/guides/sample_app_ug/multi_process.rst | 67 +++++++++++----------- > 1 file changed, 33 insertions(+), 34 deletions(-) > > diff --git a/doc/guides/sample_app_ug/multi_process.rst > b/doc/guides/sample_app_ug/multi_process.rst > index c53331def3..e2a311a426 100644 > --- a/doc/guides/sample_app_ug/multi_process.rst > +++ b/doc/guides/sample_app_ug/multi_process.rst > @@ -1,5 +1,5 @@ > .. SPDX-License-Identifier: BSD-3-Clause > - Copyright(c) 2010-2014 Intel Corporation. > + Copyright(c) 2010-2022 Intel Corporation. > > .. _multi_process_app: > > @@ -111,7 +111,7 @@ How the Application Works > The core of this example application is based on using two queues and a > single memory pool in shared memory. > These three objects are created at startup by the primary process, > since the secondary process cannot create objects in memory as it cannot > reserve memory zones, > -and the secondary process then uses lookup functions to attach to these > objects as it starts up. > +thus the secondary process uses lookup functions to attach to these objects > as it starts up. > > .. literalinclude:: ../../../examples/multi_process/simple_mp/main.c > :language: c > @@ -119,25 +119,25 @@ and the secondary process then uses lookup functions to > attach to these objects > :end-before: >8 End of ring structure. > :dedent: 1 > > -Note, however, that the named ring structure used as send_ring in the > primary process is the recv_ring in the secondary process. > +Note, that the named ring structure used as send_ring in the primary process > is the recv_ring in the secondary process. > > Once the rings and memory pools are all available in both the primary and > secondary processes, > the application simply dedicates two threads to sending and receiving > messages respectively. > -The receive thread simply dequeues any messages on the receive ring, prints > them, > -and frees the buffer space used by the messages back to the memory pool. > -The send thread makes use of the command-prompt library to interactively > request user input for messages to send. > -Once a send command is issued by the user, a buffer is allocated from the > memory pool, filled in with the message contents, > -then enqueued on the appropriate rte_ring. > +The receiver thread simply dequeues any messages on the receive ring and > prints out in terminal, > +then the buffer space used by the messages is released back to the memory > pool. > +The sender thread makes use of the command-prompt library to interactively > request user input for messages to send. > +Once a send command is issued, the message contents are put into a buffer > that was allocated from the memory pool, > +which is then enqueued on the appropriate rte_ring. > > Symmetric Multi-process Example > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > -The second example of DPDK multi-process support demonstrates how a set of > processes can run in parallel, > -with each process performing the same set of packet- processing operations. > -(Since each process is identical in functionality to the others, > -we refer to this as symmetric multi-processing, to differentiate it from > asymmetric multi- processing - > -such as a client-server mode of operation seen in the next example, > -where different processes perform different tasks, yet co-operate to form a > packet-processing system.) > +The second DPDK multi-process example demonstrates how a set of processes > can run in parallel, > +where each process is performing the same set of packet-processing > operations. > +(As each process is identical in functionality to the others, > +we refer to this as symmetric multi-processing. In the asymmetric > multi-processing example, > +the different client-server mode processes perform different tasks, > +yet co-operate to form a packet-processing system.) > The following diagram shows the data-flow through the application, using two > processes. > > .. _figure_sym_multi_proc_app: > @@ -155,9 +155,8 @@ Similarly, each process writes outgoing packets to a > different TX queue on each > Running the Application > ^^^^^^^^^^^^^^^^^^^^^^^ > > -As with the simple_mp example, the first instance of the symmetric_mp > process must be run as the primary instance, > -though with a number of other application- specific parameters also provided > after the EAL arguments. > -These additional parameters are: > +The first instance of the symmetric_mp process must be run as the primary > instance, > +with the following application parameters: > > * -p <portmask>, where portmask is a hexadecimal bitmask of what ports on > the system are to be used. > For example: -p 3 to use ports 0 and 1 only. > @@ -169,7 +168,7 @@ These additional parameters are: > This identifies which symmetric_mp instance is being run, so that each > process can read a unique receive queue on each network port. > > The secondary symmetric_mp instances must also have these parameters > specified, > -and the first two must be the same as those passed to the primary instance, > or errors result. > +and the <portmask> and <N> parameters need to be configured with the same > values as the primary instance. > > For example, to run a set of four symmetric_mp instances, running on lcores > 1-4, > all performing level-2 forwarding of packets between ports 0 and 1, > @@ -202,7 +201,7 @@ How the Application Works > ^^^^^^^^^^^^^^^^^^^^^^^^^ > > The initialization calls in both the primary and secondary instances are the > same for the most part, > -calling the rte_eal_init(), 1 G and 10 G driver initialization and then > probing devices. > +calling the rte_eal_init(), 1G and 10G driver initialization and then > probing devices. > Thereafter, the initialization done depends on whether the process is > configured as a primary or secondary instance. > > In the primary instance, a memory pool is created for the packet mbufs and > the network ports to be used are initialized - > @@ -217,7 +216,7 @@ therefore will be accessible by the secondary process as > it initializes. > :dedent: 1 > > In the secondary instance, rather than initializing the network ports, the > port information exported by the primary process is used, > -giving the secondary process access to the hardware and software rings for > each network port. > +giving the secondary process is able to access to the hardware and software > rings for each network port. > Similarly, the memory pool of mbufs is accessed by doing a lookup for it by > name: > > .. code-block:: c > @@ -234,7 +233,7 @@ Client-Server Multi-process Example > The third example multi-process application included with the DPDK shows how > one can > use a client-server type multi-process design to do packet processing. > In this example, a single server process performs the packet reception from > the ports being used and > -distributes these packets using round-robin ordering among a set of client > processes, > +distributes these packets using round-robin ordering among a set of client > processes, > which perform the actual packet processing. > In this case, the client applications just perform level-2 forwarding of > packets by sending each packet out on a different network port. > > @@ -250,8 +249,8 @@ The following diagram shows the data-flow through the > application, using two cli > Running the Application > ^^^^^^^^^^^^^^^^^^^^^^^ > > -The server process must be run initially as the primary process to set up > all memory structures for use by the clients. > -In addition to the EAL parameters, the application- specific parameters are: > +The server process must be run initially as the primary process to set up > all memory structures for use by the client processes. > +In addition to the EAL parameters, the application-specific parameters are: > > * -p <portmask >, where portmask is a hexadecimal bitmask of what ports on > the system are to be used. > For example: -p 3 to use ports 0 and 1 only. > @@ -285,23 +284,23 @@ the following commands could be used: > How the Application Works > ^^^^^^^^^^^^^^^^^^^^^^^^^ > > -The server process performs the network port and data structure > initialization much as the symmetric multi-process application does when run > as primary. > -One additional enhancement in this sample application is that the server > process stores its port configuration data in a memory zone in hugepage > shared memory. > -This eliminates the need for the client processes to have the portmask > parameter passed into them on the command line, > -as is done for the symmetric multi-process application, and therefore > eliminates mismatched parameters as a potential source of errors. > +The server process performs the network port and data structure > initialization similar to the primary symmetric multi-process application. > +The server process stores port configuration data in a memory zone in > hugepage shared memory, this eliminates > +the need for the client processes to have the same portmask parameter in the > command line. > +This enhancement can be done for the symmetric multi-process application in > the future. > > In the same way that the server process is designed to be run as a primary > process instance only, > the client processes are designed to be run as secondary instances only. > -They have no code to attempt to create shared memory objects. > -Instead, handles to all needed rings and memory pools are obtained via calls > to rte_ring_lookup() and rte_mempool_lookup(). > -The network ports for use by the processes are obtained by loading the > network port drivers and probing the PCI bus, > -which will, as in the symmetric multi-process example, > -automatically get access to the network ports using the settings already > configured by the primary/server process. > +The client process does not support creating shared memory objects. > +Instead, the client process can access required rings and memory pools via > rte_ring_lookup() and rte_mempool_lookup() function calls. > +The available network ports use by the processes are obtained by loading the > network port drivers and probing the PCI bus. > +Same as the implementation in the symmetric multi-process example, the > client process automatically gets > +access to the network ports settings where configured by the primary/server > process. > > -Once all applications are initialized, the server operates by reading > packets from each network port in turn and > +Once all applications are initialized, the server operates by reading > packets from each network port in turns and > distributing those packets to the client queues (software rings, one for > each client process) in round-robin order. > On the client side, the packets are read from the rings in as big of bursts > as possible, then routed out to a different network port. > -The routing used is very simple. All packets received on the first NIC port > are transmitted back out on the second port and vice versa. > +The routing used is very simple, all packets received on the first NIC port > are transmitted back out on the second port and vice versa. > Similarly, packets are routed between the 3rd and 4th network ports and so > on. > The sending of packets is done by writing the packets directly to the > network ports; they are not transferred back via the server process. > >