When establishing its first socket, an application is allocated an Onload stack which allocates the required VNICs.
When a packet arrives, IP filtering in the adapter identifies the socket and the data is written to the next available receive buffer in the corresponding Onload stack. The adapter then writes an event to an “event queue” managed by Onload. If the application is regularly making socket calls, Onload is regularly polling this event queue, and then processing events directly rather than interrupts are the normal means by which an application is able to rendezvous with its data.
User-level processing significantly reduces kernel/user-level context switching and interrupts are only required when the application blocks - because when the application is making socket calls, Onload is busy processing the event queue picking up new network events.