numam-spdk/mk
paul luse e58e9fbda8 lib/idxd: add low level idxd library
Module, etc., will follow. Notes:

* IDXD is an Intel silicon feature available in future Intel CPUs.
Initial development is being done on a simulator. Once HW is
available and the code fully tested the experimental label will be
lifted. Spec can be found here: https://software.intel.com/en-us/download/intel-data-streaming-accelerator-preliminary-architecture-specification

* The current implementation will only work with VFIO.

* DSA has a number of engines that can be grouped based on application
need such as type of memory being served or QoS. Engines are processing
units and are assigned to groups. Work queues are on device structures
that act as front-end groups for queueing descriptors. Full details on
what is configurable & how will come in later doc patches.

* There is a finite number of work queue slots that are divided amongst
the number of desired work queues in some fashion (ie evenly).

* SW (outside of the idxd lib) is required to manage flow control, to not
over-run the work queues.This is provided in the accel plug-in module.
The upper layers use public API to manage this.

* Work queue submissions are done with a 64 byte atomic instruction

* The design here creates a set of descriptor rings per channel that match
the size of the work queues. Then, an spdk_bit_array is used to make sure
we don't overrun a queue.  If there are not slots available, the operation
is put on a linked list to be retried later from the poller.

* As we need to support any number of channels (we can't limit ourselves
to the number of work queues) we need to dynamically size/resize our
per channel descriptor rings based on the number of current channels. This
is done from upper layers via public API into the lib.

* As channels are created, the total number of work queue slots is divided
across the channels evenly. Same thing when they are destroyed, remaining
channels with see the ring sizes increase. This is done from upper layers
via public API into the lib.

* The sim has 64 total work queue entries (WQE) that get dolled out to the
work queues (WQ) evenly.

Signed-off-by: paul luse <paul.e.luse@intel.com>
Change-Id: I899bbeda3cef3db05bea4197b8757e89dddb579d
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1809
Community-CI: Mellanox Build Bot
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Vitaliy Mysak <vitaliy.mysak@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
2020-04-23 15:48:32 +00:00
..
nvme.libtest.mk make: don't link vpp into fio plugins. 2020-03-26 08:12:04 +00:00
spdk.app_cxx.mk Makefile: Add possibility to uninstall spdk. 2019-05-16 20:56:18 +00:00
spdk.app_vars.mk mk: force --no-as-needed for spdk libs. 2019-08-12 21:12:16 +00:00
spdk.app.mk Makefile: Add possibility to uninstall spdk. 2019-05-16 20:56:18 +00:00
spdk.common.mk make: rev SO versions individually for libraries. 2020-03-18 08:02:30 +00:00
spdk.deps.mk build: add copyright header where missing 2016-11-22 16:41:47 -07:00
spdk.lib_deps.mk lib/idxd: add low level idxd library 2020-04-23 15:48:32 +00:00
spdk.lib.mk make: add a map file for libspdk_accel. 2020-04-03 06:31:46 +00:00
spdk.mock.unittest.mk test: Add mocks for sendmsg and recvmsg 2019-11-01 17:56:16 +00:00
spdk.modules.mk sock/uring: Add the async network I/O support for socket 2020-03-20 08:41:28 +00:00
spdk.nvmecli.mk mk: add nvme-cli make fragment to mk dir. 2020-04-22 09:22:44 +00:00
spdk.subdirs.mk Makefile: Add possibility to uninstall spdk. 2019-05-16 20:56:18 +00:00
spdk.unittest.mk make/unittest: don't link against shared env lib. 2020-04-22 09:21:55 +00:00