The following figure illustrates the difference between the normal UDP receive mode and the zero-copy method.
When using the standard POSIX socket calls, the adapter delivers packets to an Onload packet buffer which is described by a descriptor previously placed in the RX descriptor ring. When the application calls recv()
, Onload copies the data from the packet buffer to an application-supplied buffer.
Using the zero-copy UDP receive API the application calls the onload_zc_recv()
function including a callback function which will be called when data is ready. The callback can directly access the data inside the Onload packet buffer avoiding a copy.
A single call using onload_zc_recv()
function can result in multiple datagrams being delivered to the callback function. Each time the callback returns to Onload the next datagram is delivered. Processing stops when the callback instructs Onload to cease delivery or there are no further received datagrams.
If the receiving application is filtering and so does not require to look at all data received this can result in a considerable performance advantage because this data is not pulled into the processor's cache, thereby reducing the application cache footprint.
As a general rule, the callback function should avoid calling other system calls which attempt to modify or close the current socket.
Zero-copy UDP Receive is implemented within the Onload Extensions API.