freebsd-dev/sys/dev/cxgbe/tom
John Baldwin dc9643853d Use DDP to implement zerocopy TCP receive with aio_read().
Chelsio's TCP offload engine supports direct DMA of received TCP payload
into wired user buffers.  This feature is known as Direct-Data Placement.
However, to scale well the adapter needs to prepare buffers for DDP
before data arrives.  aio_read() is more amenable to this requirement than
read() as applications often call read() only after data is available in
the socket buffer.

When DDP is enabled, TOE sockets use the recently added pru_aio_queue
protocol hook to claim aio_read(2) requests instead of letting them use
the default AIO socket logic.  The DDP feature supports scheduling DMA
to two buffers at a time so that the second buffer is ready for use
after the first buffer is filled.  The aio/DDP code optimizes the case
of an application ping-ponging between two buffers (similar to the
zero-copy bpf(4) code) by keeping the two most recently used AIO buffers
wired.  If a buffer is reused, the aio/DDP code is able to reuse the
vm_page_t array as well as page pod mappings (a kind of MMU mapping the
Chelsio NIC uses to describe user buffers).  The generation of the
vmspace of the calling process is used in conjunction with the user
buffer's address and length to determine if a user buffer matches a
previously used buffer.  If an application queues a buffer for AIO that
does not match a previously used buffer then the least recently used
buffer is unwired before the new buffer is wired.  This ensures that no
more than two user buffers per socket are ever wired.

Note that this feature is best suited to applications sending a steady
stream of data vs short bursts of traffic.

Discussed with:	np
Relnotes:	yes
Sponsored by:	Chelsio Communications
2016-05-07 00:33:35 +00:00
..
t4_connect.c cxgbe: catch up with the latest hardware-related definitions. 2016-02-19 00:29:16 +00:00
t4_cpl_io.c Use DDP to implement zerocopy TCP receive with aio_read(). 2016-05-07 00:33:35 +00:00
t4_ddp.c Use DDP to implement zerocopy TCP receive with aio_read(). 2016-05-07 00:33:35 +00:00
t4_listen.c Set the correct vnet in TOE event handlers. 2016-05-06 23:49:10 +00:00
t4_tom_l2t.c
t4_tom_l2t.h
t4_tom.c Use DDP to implement zerocopy TCP receive with aio_read(). 2016-05-07 00:33:35 +00:00
t4_tom.h Use DDP to implement zerocopy TCP receive with aio_read(). 2016-05-07 00:33:35 +00:00