freebsd-nq/sys/dev/cxgbe
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
..
common sys/dev: minor spelling fixes. 2016-05-03 03:41:25 +00:00
cxgbei sys/dev: minor spelling fixes. 2016-05-03 03:41:25 +00:00
firmware Revert r298955 for the cxgbe firmware. 2016-05-03 11:49:29 +00:00
iw_cxgbe Cleanup unnecessary semicolons from the kernel. 2016-04-10 23:07:00 +00:00
tom Use DDP to implement zerocopy TCP receive with aio_read(). 2016-05-07 00:33:35 +00:00
adapter.h sys/dev: minor spelling fixes. 2016-05-03 03:41:25 +00:00
if_cxl.c cxgbe(4): Add a minimal if_cxl module that pulls in the real driver as 2015-02-06 01:10:04 +00:00
offload.h Use DDP to implement zerocopy TCP receive with aio_read(). 2016-05-07 00:33:35 +00:00
osdep.h cxgbe(4): Remove __devinit and SPEED_<foo> as part of catch up with 2016-03-08 08:13:37 +00:00
t4_ioctl.h sys/dev: minor spelling fixes. 2016-05-03 03:41:25 +00:00
t4_l2t.c sys/dev: minor spelling fixes. 2016-05-03 03:41:25 +00:00
t4_l2t.h
t4_main.c Use DDP to implement zerocopy TCP receive with aio_read(). 2016-05-07 00:33:35 +00:00
t4_mp_ring.c sys/dev: minor spelling fixes. 2016-05-03 03:41:25 +00:00
t4_mp_ring.h cxgbe(4): major tx rework. 2014-12-31 23:19:16 +00:00
t4_netmap.c sys: Make use of our rounddown() macro when sys/param.h is available. 2016-04-30 14:41:18 +00:00
t4_sge.c sys/dev: minor spelling fixes. 2016-05-03 03:41:25 +00:00
t4_tracer.c cxgbe(4): Remove stray if_up from the code that creates the tracing ifnet. 2014-05-23 01:45:44 +00:00