When multiple NVMe controllers are being initialized during spdk_nvme_probe(), we can overlap the hardware resets of all controllers to improve startup time. Rewrite the initialization sequence as a polling function, nvme_ctrlr_process_init(), that maintains a per-controller state machine to determine which initialization step is underway. Each step also has a timeout to ensure the process will terminate if the hardware is hung. Currently, only the hardware reset (toggling of CC.EN and waiting for CSTS.RDY) is done in parallel; the rest of initialization is done sequentially in nvme_ctrlr_start() as before. These steps could also be parallelized in a similar framework if measurements indicate that they take a significant amount of time. Change-Id: I02ce5863f1b5c13ad65ccd8be571085528d98bd5 Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
Storage Performance Development Kit
The Storage Performance Development Kit (SPDK) provides a set of tools and libraries for writing high performance, scalable, user-mode storage applications. It achieves high performance by moving all of the necessary drivers into userspace and operating in a polled mode instead of relying on interrupts, which avoids kernel context switches and eliminates interrupt handling overhead.
Documentation
Prerequisites
To build SPDK, some dependencies must be installed.
Fedora/CentOS:
- gcc
- libpciaccess-devel
- CUnit-devel
- libaio-devel
Ubuntu/Debian:
- gcc
- libpciaccess-dev
- make
- libcunit1-dev
- libaio-dev
FreeBSD:
- gcc
- libpciaccess
- gmake
- cunit
Additionally, DPDK is required.
1) cd /path/to/spdk
2) wget http://dpdk.org/browse/dpdk/snapshot/dpdk-2.2.0.tar.gz
3) tar xfz dpdk-2.2.0.tar.gz
Linux:
4) (cd dpdk-2.2.0 && make install T=x86_64-native-linuxapp-gcc DESTDIR=.)
FreeBSD:
4) (cd dpdk-2.2.0 && gmake install T=x86_64-native-bsdapp-clang DESTDIR=.)
Building
Once the prerequisites are installed, run 'make' within the SPDK directory to build the SPDK libraries and examples.
make DPDK_DIR=/path/to/dpdk
If you followed the instructions above for building DPDK:
Linux:
make DPDK_DIR=./dpdk-2.2.0/x86_64-native-linuxapp-gcc
FreeBSD:
gmake DPDK_DIR=./dpdk-2.2.0/x86_64-native-bsdapp-clang
Hugepages and Device Binding
Before running an SPDK application, some hugepages must be allocated and any NVMe and I/OAT devices must be unbound from the native kernel drivers. SPDK includes scripts to automate this process on both Linux and FreeBSD.
1) scripts/configure_hugepages.sh
2) scripts/setup.sh