2016-09-19 17:01:52 +00:00
|
|
|
/*-
|
|
|
|
* BSD LICENSE
|
|
|
|
*
|
nvmf/rdma: Add shared receive queue support
This is a new feature for NVMEoF RDMA target, that is intended to save
resource allocation (by sharing them) and utilize the
locality (completions and memory) to get the best performance with
Shared Receive Queues (SRQs). We'll create a SRQ per core (poll
group), per device and associate each created QP/CQ with an
appropriate SRQ.
Our testing environment has 2 hosts.
Host 1:
CPU: Intel(R) Xeon(R) CPU E5-2609 0 @ 2.40GHz dual socket (8 cores total)
Network: ConnectX-5, ConnectX-5 VPI , 100GbE, single-port QSFP28, PCIe3.0 x16
Disk: Intel Optane SSD 900P Series
OS: Fedora 27 x86_64
Host 2:
CPU: Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.60GHz dual-socket (24 cores total)
Network: ConnectX-4 VPI , 100GbE, dual-port QSFP28
Disk: Intel Optane SSD 900P Series
OS : CentOS 7.5.1804 x86_64
Hosts are connected via Spectrum switch.
Host 1 is running SPDK NVMeoF target.
Host 2 is used as initiator running fio with SPDK plugin.
Configuration:
- SPDK NVMeoF target: cpu mask 0x0F (4 cores), max queue depth 128,
max SRQ depth 1024, max QPs per controller 1024
- Single NVMf subsystem with single namespace backed by physical SSD disk
- fio with SPDK plugin: randread pattern, 1-256 jobs, block size 4k,
IO depth 16, cpu_mask 0xFFF0, IO rate 10k, rate process “poisson”
Here is a full fio command line:
fio --name=Job --stats=1 --group_reporting=1 --idle-prof=percpu \
--loops=1 --numjobs=1 --thread=1 --time_based=1 --runtime=30s \
--ramp_time=5s --bs=4k --size=4G --iodepth=16 --readwrite=randread \
--rwmixread=75 --randrepeat=1 --ioengine=spdk --direct=1 \
--gtod_reduce=0 --cpumask=0xFFF0 --rate_iops=10k \
--rate_process=poisson \
--filename='trtype=RDMA adrfam=IPv4 traddr=1.1.79.1 trsvcid=4420 ns=1'
SPDK allocates the following entities for every work request in
receive queue (shared or not): reqs (1024 bytes), recvs (96 bytes),
cmds (64 bytes), cpls (16 bytes), in_capsule_buffer. All except the
last one are fixed size. In capsule data size is configured to 4096.
Memory consumption calculation (target):
- Multiple SRQ: core_num * ib_devs_num * SRQ_depth * (1200 +
in_capsule_data_size)
- Multiple RQ: queue_num * RQ_depth * (1200 + in_capsule_data_size)
We ignore admin queues in calculations for simplicity.
Cases:
1. Multiple SRQ with 1024 entries:
- Mem = 4 * 1 * 1024 * (1200 + 4096) = 20.7 MiB
(Constant number – does not depend on initiators number)
2. RQ with 128 entries for 64 initiators:
- Mem = 64 * 128 * (1200 + 4096) = 41.4 MiB
Results:
FIO_JOBS kIOPS Bandwidth,MiB/s AvgLatency,us MaxResidentSize,kiB
RQ SRQ RQ SRQ RQ SRQ RQ SRQ
1 8.623 8.623 33.7 33.7 13.89 14.03 144376 155624
2 17.3 17.3 67.4 67.4 14.03 14.1 145776 155700
4 34.5 34.5 135 135 14.15 14.23 146540 156184
8 69.1 69.1 270 270 14.64 14.49 148116 156960
16 138 138 540 540 14.84 15.38 151216 158668
32 276 276 1079 1079 16.5 16.61 157560 161936
64 513 502 2005 1960 1673 1612 170408 168440
128 535 526 2092 2054 3329 3344 195796 181524
256 571 571 2232 2233 6854 6873 246484 207856
We can see the benefit in memory consumption.
Change-Id: I40c70f6ccbad7754918bcc6cb397e955b09d1033
Signed-off-by: Evgeniy Kochetov <evgeniik@mellanox.com>
Signed-off-by: Sasha Kotchubievsky <sashakot@mellanox.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/428458
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
2018-10-04 14:59:08 +00:00
|
|
|
* Copyright (c) Intel Corporation. All rights reserved.
|
2019-04-15 09:54:38 +00:00
|
|
|
* Copyright (c) 2018-2019 Mellanox Technologies LTD. All rights reserved.
|
2016-09-19 17:01:52 +00:00
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
*
|
|
|
|
* * Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in
|
|
|
|
* the documentation and/or other materials provided with the
|
|
|
|
* distribution.
|
|
|
|
* * Neither the name of Intel Corporation nor the names of its
|
|
|
|
* contributors may be used to endorse or promote products derived
|
|
|
|
* from this software without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
|
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/** \file
|
|
|
|
* NVMe over Fabrics target public API
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef SPDK_NVMF_H
|
|
|
|
#define SPDK_NVMF_H
|
|
|
|
|
2017-05-01 20:22:48 +00:00
|
|
|
#include "spdk/stdinc.h"
|
2016-09-19 17:01:52 +00:00
|
|
|
|
2016-10-31 22:43:02 +00:00
|
|
|
#include "spdk/env.h"
|
2017-07-13 19:36:44 +00:00
|
|
|
#include "spdk/nvme.h"
|
2016-09-19 17:01:52 +00:00
|
|
|
#include "spdk/nvmf_spec.h"
|
|
|
|
#include "spdk/queue.h"
|
2018-02-22 00:09:56 +00:00
|
|
|
#include "spdk/uuid.h"
|
2016-09-19 17:01:52 +00:00
|
|
|
|
2017-12-07 20:25:19 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2019-08-15 17:34:12 +00:00
|
|
|
#define NVMF_TGT_NAME_MAX_LENGTH 256
|
|
|
|
|
2017-08-18 22:38:33 +00:00
|
|
|
struct spdk_nvmf_tgt;
|
2017-11-29 20:46:00 +00:00
|
|
|
struct spdk_nvmf_subsystem;
|
|
|
|
struct spdk_nvmf_ctrlr;
|
|
|
|
struct spdk_nvmf_qpair;
|
|
|
|
struct spdk_nvmf_request;
|
|
|
|
struct spdk_bdev;
|
|
|
|
struct spdk_nvmf_request;
|
|
|
|
struct spdk_nvmf_host;
|
2020-02-15 05:47:36 +00:00
|
|
|
struct spdk_nvmf_subsystem_listener;
|
2017-11-29 20:46:00 +00:00
|
|
|
struct spdk_nvmf_poll_group;
|
2018-05-07 18:26:13 +00:00
|
|
|
struct spdk_json_write_ctx;
|
2020-06-03 14:03:03 +00:00
|
|
|
struct spdk_json_val;
|
2018-08-22 23:04:16 +00:00
|
|
|
struct spdk_nvmf_transport;
|
2017-08-18 22:38:33 +00:00
|
|
|
|
2019-08-15 16:12:46 +00:00
|
|
|
struct spdk_nvmf_target_opts {
|
2019-08-15 17:34:12 +00:00
|
|
|
char name[NVMF_TGT_NAME_MAX_LENGTH];
|
2019-08-15 16:12:46 +00:00
|
|
|
uint32_t max_subsystems;
|
2020-06-29 17:56:47 +00:00
|
|
|
uint32_t acceptor_poll_rate;
|
2019-08-15 16:12:46 +00:00
|
|
|
};
|
|
|
|
|
2018-08-22 23:04:16 +00:00
|
|
|
struct spdk_nvmf_transport_opts {
|
2019-04-26 21:25:20 +00:00
|
|
|
uint16_t max_queue_depth;
|
|
|
|
uint16_t max_qpairs_per_ctrlr;
|
|
|
|
uint32_t in_capsule_data_size;
|
|
|
|
uint32_t max_io_size;
|
|
|
|
uint32_t io_unit_size;
|
|
|
|
uint32_t max_aq_depth;
|
|
|
|
uint32_t num_shared_buffers;
|
|
|
|
uint32_t buf_cache_size;
|
2019-06-26 07:45:25 +00:00
|
|
|
bool dif_insert_or_strip;
|
2020-06-03 14:03:03 +00:00
|
|
|
|
2020-07-09 01:50:03 +00:00
|
|
|
uint32_t abort_timeout_sec;
|
2020-08-20 05:54:03 +00:00
|
|
|
/* ms */
|
2020-06-21 07:47:34 +00:00
|
|
|
uint32_t association_timeout;
|
2020-06-03 14:03:03 +00:00
|
|
|
|
|
|
|
const struct spdk_json_val *transport_specific;
|
2018-08-22 23:04:16 +00:00
|
|
|
};
|
|
|
|
|
2019-04-15 09:54:38 +00:00
|
|
|
struct spdk_nvmf_poll_group_stat {
|
2019-05-22 19:12:35 +00:00
|
|
|
uint32_t admin_qpairs;
|
|
|
|
uint32_t io_qpairs;
|
2019-05-22 19:25:34 +00:00
|
|
|
uint64_t pending_bdev_io;
|
2019-04-15 09:54:38 +00:00
|
|
|
};
|
|
|
|
|
2019-05-23 11:26:50 +00:00
|
|
|
struct spdk_nvmf_rdma_device_stat {
|
|
|
|
const char *name;
|
|
|
|
uint64_t polls;
|
|
|
|
uint64_t completions;
|
2019-03-06 11:38:07 +00:00
|
|
|
uint64_t requests;
|
|
|
|
uint64_t request_latency;
|
2019-05-23 11:43:56 +00:00
|
|
|
uint64_t pending_free_request;
|
|
|
|
uint64_t pending_rdma_read;
|
|
|
|
uint64_t pending_rdma_write;
|
2019-05-23 11:26:50 +00:00
|
|
|
};
|
|
|
|
|
2019-05-23 09:04:49 +00:00
|
|
|
struct spdk_nvmf_transport_poll_group_stat {
|
|
|
|
spdk_nvme_transport_type_t trtype;
|
|
|
|
union {
|
|
|
|
struct {
|
2019-05-23 11:43:56 +00:00
|
|
|
uint64_t pending_data_buffer;
|
2019-05-23 11:26:50 +00:00
|
|
|
uint64_t num_devices;
|
|
|
|
struct spdk_nvmf_rdma_device_stat *devices;
|
2019-05-23 09:04:49 +00:00
|
|
|
} rdma;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2020-02-05 21:17:40 +00:00
|
|
|
/**
|
2020-07-09 21:57:37 +00:00
|
|
|
* Function to be called once asynchronous listen add and remove
|
|
|
|
* operations are completed. See spdk_nvmf_subsystem_add_listener()
|
|
|
|
* and spdk_nvmf_transport_stop_listen_async().
|
2020-02-05 21:17:40 +00:00
|
|
|
*
|
|
|
|
* \param ctx Context argument passed to this function.
|
|
|
|
* \param status 0 if it completed successfully, or negative errno if it failed.
|
|
|
|
*/
|
|
|
|
typedef void (*spdk_nvmf_tgt_subsystem_listen_done_fn)(void *ctx, int status);
|
|
|
|
|
2017-08-18 22:38:33 +00:00
|
|
|
/**
|
2018-02-28 06:27:31 +00:00
|
|
|
* Construct an NVMe-oF target.
|
|
|
|
*
|
2019-08-15 20:51:08 +00:00
|
|
|
* \param opts a pointer to an spdk_nvmf_target_opts structure.
|
2017-08-18 22:38:33 +00:00
|
|
|
*
|
2018-02-28 06:27:31 +00:00
|
|
|
* \return a pointer to a NVMe-oF target on success, or NULL on failure.
|
2017-08-18 22:38:33 +00:00
|
|
|
*/
|
2019-08-15 20:51:08 +00:00
|
|
|
struct spdk_nvmf_tgt *spdk_nvmf_tgt_create(struct spdk_nvmf_target_opts *opts);
|
2016-09-19 17:01:52 +00:00
|
|
|
|
2018-06-05 22:34:04 +00:00
|
|
|
typedef void (spdk_nvmf_tgt_destroy_done_fn)(void *ctx, int status);
|
|
|
|
|
2017-08-18 22:38:33 +00:00
|
|
|
/**
|
2018-02-28 06:27:31 +00:00
|
|
|
* Destroy an NVMe-oF target.
|
2017-08-18 22:38:33 +00:00
|
|
|
*
|
|
|
|
* \param tgt The target to destroy. This releases all resources.
|
2018-06-18 14:39:39 +00:00
|
|
|
* \param cb_fn A callback that will be called once the target is destroyed
|
|
|
|
* \param cb_arg A context argument passed to cb_fn.
|
2017-08-18 22:38:33 +00:00
|
|
|
*/
|
2018-06-05 22:34:04 +00:00
|
|
|
void spdk_nvmf_tgt_destroy(struct spdk_nvmf_tgt *tgt,
|
|
|
|
spdk_nvmf_tgt_destroy_done_fn cb_fn,
|
|
|
|
void *cb_arg);
|
2016-09-19 17:01:52 +00:00
|
|
|
|
2019-09-13 18:09:07 +00:00
|
|
|
/**
|
|
|
|
* Get the name of an NVMe-oF target.
|
|
|
|
*
|
|
|
|
* \param tgt The target from which to get the name.
|
|
|
|
*
|
|
|
|
* \return The name of the target as a null terminated string.
|
|
|
|
*/
|
|
|
|
const char *spdk_nvmf_tgt_get_name(struct spdk_nvmf_tgt *tgt);
|
|
|
|
|
2019-08-15 18:32:11 +00:00
|
|
|
/**
|
|
|
|
* Get a pointer to an NVMe-oF target.
|
|
|
|
*
|
|
|
|
* In order to support some legacy applications and RPC methods that may rely on the
|
|
|
|
* concept that there is only one target, the name parameter can be passed as NULL.
|
|
|
|
* If there is only one available target, that target will be returned.
|
|
|
|
* Otherwise, name is a required parameter.
|
|
|
|
*
|
|
|
|
* \param name The name provided when the target was created.
|
|
|
|
*
|
|
|
|
* \return The target with the given name, or NULL if no match was found.
|
|
|
|
*/
|
|
|
|
struct spdk_nvmf_tgt *spdk_nvmf_get_tgt(const char *name);
|
|
|
|
|
2019-09-13 18:09:07 +00:00
|
|
|
/**
|
|
|
|
* Get the pointer to the first NVMe-oF target.
|
|
|
|
*
|
|
|
|
* Combined with spdk_nvmf_get_next_tgt to iterate over all available targets.
|
|
|
|
*
|
|
|
|
* \return The first NVMe-oF target.
|
|
|
|
*/
|
|
|
|
struct spdk_nvmf_tgt *spdk_nvmf_get_first_tgt(void);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the pointer to the first NVMe-oF target.
|
|
|
|
*
|
|
|
|
* Combined with spdk_nvmf_get_first_tgt to iterate over all available targets.
|
|
|
|
*
|
|
|
|
* \param prev A pointer to the last NVMe-oF target.
|
|
|
|
*
|
|
|
|
* \return The first NVMe-oF target.
|
|
|
|
*/
|
|
|
|
struct spdk_nvmf_tgt *spdk_nvmf_get_next_tgt(struct spdk_nvmf_tgt *prev);
|
|
|
|
|
2018-05-07 18:26:13 +00:00
|
|
|
/**
|
|
|
|
* Write NVMe-oF target configuration into provided JSON context.
|
|
|
|
* \param w JSON write context
|
|
|
|
* \param tgt The NVMe-oF target
|
|
|
|
*/
|
|
|
|
void spdk_nvmf_tgt_write_config_json(struct spdk_json_write_ctx *w, struct spdk_nvmf_tgt *tgt);
|
|
|
|
|
2017-08-21 18:41:51 +00:00
|
|
|
/**
|
|
|
|
* Begin accepting new connections at the address provided.
|
|
|
|
*
|
|
|
|
* The connections will be matched with a subsystem, which may or may not allow
|
|
|
|
* the connection based on a subsystem-specific whitelist. See
|
|
|
|
* spdk_nvmf_subsystem_add_host() and spdk_nvmf_subsystem_add_listener()
|
2017-08-23 17:23:44 +00:00
|
|
|
*
|
2018-02-28 06:27:31 +00:00
|
|
|
* \param tgt The target associated with this listen address.
|
|
|
|
* \param trid The address to listen at.
|
2017-08-23 17:23:44 +00:00
|
|
|
*
|
2020-02-13 19:44:00 +00:00
|
|
|
* \return 0 on success or a negated errno on failure.
|
2017-08-21 18:41:51 +00:00
|
|
|
*/
|
2020-02-13 19:44:00 +00:00
|
|
|
int spdk_nvmf_tgt_listen(struct spdk_nvmf_tgt *tgt,
|
|
|
|
struct spdk_nvme_transport_id *trid);
|
2017-08-21 18:41:51 +00:00
|
|
|
|
2020-01-02 19:00:45 +00:00
|
|
|
/**
|
|
|
|
* Stop accepting new connections at the provided address.
|
|
|
|
*
|
|
|
|
* This is a counterpart to spdk_nvmf_tgt_listen().
|
|
|
|
*
|
|
|
|
* \param tgt The target associated with the listen address.
|
|
|
|
* \param trid The address to stop listening at.
|
|
|
|
*
|
|
|
|
* \return int. 0 on success or a negated errno on failure.
|
|
|
|
*/
|
|
|
|
int spdk_nvmf_tgt_stop_listen(struct spdk_nvmf_tgt *tgt,
|
|
|
|
struct spdk_nvme_transport_id *trid);
|
|
|
|
|
2017-09-25 22:27:01 +00:00
|
|
|
/**
|
|
|
|
* Create a poll group.
|
2018-02-28 06:27:31 +00:00
|
|
|
*
|
|
|
|
* \param tgt The target to create a poll group.
|
|
|
|
*
|
|
|
|
* \return a poll group on success, or NULL on failure.
|
2017-09-25 22:27:01 +00:00
|
|
|
*/
|
|
|
|
struct spdk_nvmf_poll_group *spdk_nvmf_poll_group_create(struct spdk_nvmf_tgt *tgt);
|
|
|
|
|
2019-05-15 12:40:12 +00:00
|
|
|
/**
|
|
|
|
* Get optimal nvmf poll group for the qpair.
|
|
|
|
*
|
|
|
|
* \param qpair Requested qpair
|
|
|
|
*
|
|
|
|
* \return a poll group on success, or NULL on failure.
|
|
|
|
*/
|
|
|
|
struct spdk_nvmf_poll_group *spdk_nvmf_get_optimal_poll_group(struct spdk_nvmf_qpair *qpair);
|
|
|
|
|
2020-02-13 10:03:16 +00:00
|
|
|
typedef void(*spdk_nvmf_poll_group_destroy_done_fn)(void *cb_arg, int status);
|
|
|
|
|
2017-09-25 22:27:01 +00:00
|
|
|
/**
|
|
|
|
* Destroy a poll group.
|
2018-02-28 06:27:31 +00:00
|
|
|
*
|
|
|
|
* \param group The poll group to destroy.
|
2020-02-13 10:03:16 +00:00
|
|
|
* \param cb_fn A callback that will be called once the poll group is destroyed.
|
|
|
|
* \param cb_arg A context argument passed to cb_fn.
|
2017-09-25 22:27:01 +00:00
|
|
|
*/
|
2020-02-13 10:03:16 +00:00
|
|
|
void spdk_nvmf_poll_group_destroy(struct spdk_nvmf_poll_group *group,
|
|
|
|
spdk_nvmf_poll_group_destroy_done_fn cb_fn,
|
|
|
|
void *cb_arg);
|
2017-09-25 22:27:01 +00:00
|
|
|
|
2017-11-29 20:49:30 +00:00
|
|
|
/**
|
|
|
|
* Add the given qpair to the poll group.
|
2018-02-28 06:27:31 +00:00
|
|
|
*
|
|
|
|
* \param group The group to add qpair to.
|
|
|
|
* \param qpair The qpair to add.
|
|
|
|
*
|
|
|
|
* \return 0 on success, -1 on failure.
|
2017-11-29 20:49:30 +00:00
|
|
|
*/
|
|
|
|
int spdk_nvmf_poll_group_add(struct spdk_nvmf_poll_group *group,
|
|
|
|
struct spdk_nvmf_qpair *qpair);
|
|
|
|
|
2019-04-15 09:54:38 +00:00
|
|
|
/**
|
|
|
|
* Get current poll group statistics.
|
|
|
|
*
|
|
|
|
* \param tgt The NVMf target.
|
|
|
|
* \param stat Pointer to allocated statistics structure to fill with values.
|
|
|
|
*
|
|
|
|
* \return 0 upon success.
|
|
|
|
* \return -EINVAL if either group or stat is NULL.
|
|
|
|
*/
|
|
|
|
int spdk_nvmf_poll_group_get_stat(struct spdk_nvmf_tgt *tgt,
|
|
|
|
struct spdk_nvmf_poll_group_stat *stat);
|
|
|
|
|
2018-06-29 19:09:47 +00:00
|
|
|
typedef void (*nvmf_qpair_disconnect_cb)(void *ctx);
|
|
|
|
|
2018-06-14 17:34:04 +00:00
|
|
|
/**
|
|
|
|
* Disconnect an NVMe-oF qpair
|
|
|
|
*
|
|
|
|
* \param qpair The NVMe-oF qpair to disconnect.
|
2018-06-29 19:09:47 +00:00
|
|
|
* \param cb_fn The function to call upon completion of the disconnect.
|
|
|
|
* \param ctx The context to pass to the callback function.
|
|
|
|
*
|
|
|
|
* \return 0 upon success.
|
|
|
|
* \return -ENOMEM if the function specific context could not be allocated.
|
2018-06-14 17:34:04 +00:00
|
|
|
*/
|
2018-06-29 19:09:47 +00:00
|
|
|
int spdk_nvmf_qpair_disconnect(struct spdk_nvmf_qpair *qpair, nvmf_qpair_disconnect_cb cb_fn,
|
|
|
|
void *ctx);
|
2018-06-14 17:34:04 +00:00
|
|
|
|
2018-08-02 22:08:12 +00:00
|
|
|
/**
|
|
|
|
* Get the peer's transport ID for this queue pair.
|
|
|
|
*
|
|
|
|
* \param qpair The NVMe-oF qpair
|
|
|
|
* \param trid Output parameter that will contain the transport id.
|
|
|
|
*
|
|
|
|
* \return 0 for success.
|
|
|
|
* \return -EINVAL if the qpair is not connected.
|
|
|
|
*/
|
|
|
|
int spdk_nvmf_qpair_get_peer_trid(struct spdk_nvmf_qpair *qpair,
|
|
|
|
struct spdk_nvme_transport_id *trid);
|
|
|
|
|
2018-09-10 21:28:04 +00:00
|
|
|
/**
|
|
|
|
* Get the local transport ID for this queue pair.
|
|
|
|
*
|
|
|
|
* \param qpair The NVMe-oF qpair
|
|
|
|
* \param trid Output parameter that will contain the transport id.
|
|
|
|
*
|
|
|
|
* \return 0 for success.
|
|
|
|
* \return -EINVAL if the qpair is not connected.
|
|
|
|
*/
|
|
|
|
int spdk_nvmf_qpair_get_local_trid(struct spdk_nvmf_qpair *qpair,
|
|
|
|
struct spdk_nvme_transport_id *trid);
|
|
|
|
|
2018-09-07 20:41:41 +00:00
|
|
|
/**
|
|
|
|
* Get the associated listener transport ID for this queue pair.
|
|
|
|
*
|
|
|
|
* \param qpair The NVMe-oF qpair
|
|
|
|
* \param trid Output parameter that will contain the transport id.
|
|
|
|
*
|
|
|
|
* \return 0 for success.
|
|
|
|
* \return -EINVAL if the qpair is not connected.
|
|
|
|
*/
|
|
|
|
int spdk_nvmf_qpair_get_listen_trid(struct spdk_nvmf_qpair *qpair,
|
|
|
|
struct spdk_nvme_transport_id *trid);
|
|
|
|
|
2017-12-19 23:39:04 +00:00
|
|
|
/**
|
|
|
|
* Create an NVMe-oF subsystem.
|
|
|
|
*
|
|
|
|
* Subsystems are in one of three states: Inactive, Active, Paused. This
|
|
|
|
* state affects which operations may be performed on the subsystem. Upon
|
|
|
|
* creation, the subsystem will be in the Inactive state and may be activated
|
|
|
|
* by calling spdk_nvmf_subsystem_start(). No I/O will be processed in the Inactive
|
|
|
|
* or Paused states, but changes to the state of the subsystem may be made.
|
|
|
|
*
|
|
|
|
* \param tgt The NVMe-oF target that will own this subsystem.
|
|
|
|
* \param nqn The NVMe qualified name of this subsystem.
|
|
|
|
* \param type Whether this subsystem is an I/O subsystem or a Discovery subsystem.
|
2020-10-22 22:23:21 +00:00
|
|
|
* \param num_ns The maximum number of namespaces this subsystem may contain.
|
2017-12-19 23:39:04 +00:00
|
|
|
*
|
2018-02-28 06:27:31 +00:00
|
|
|
* \return a pointer to a NVMe-oF subsystem on success, or NULL on failure.
|
2016-09-19 17:01:52 +00:00
|
|
|
*/
|
2017-12-19 23:39:04 +00:00
|
|
|
struct spdk_nvmf_subsystem *spdk_nvmf_subsystem_create(struct spdk_nvmf_tgt *tgt,
|
2017-08-18 22:57:03 +00:00
|
|
|
const char *nqn,
|
2016-10-10 17:25:01 +00:00
|
|
|
enum spdk_nvmf_subtype type,
|
2017-08-28 21:21:41 +00:00
|
|
|
uint32_t num_ns);
|
2016-09-19 17:01:52 +00:00
|
|
|
|
2017-12-19 23:39:04 +00:00
|
|
|
/**
|
|
|
|
* Destroy an NVMe-oF subsystem. A subsystem may only be destroyed when in
|
|
|
|
* the Inactive state. See spdk_nvmf_subsystem_stop().
|
|
|
|
*
|
|
|
|
* \param subsystem The NVMe-oF subsystem to destroy.
|
|
|
|
*/
|
|
|
|
void spdk_nvmf_subsystem_destroy(struct spdk_nvmf_subsystem *subsystem);
|
|
|
|
|
2018-04-16 08:43:19 +00:00
|
|
|
/**
|
|
|
|
* Function to be called once the subsystem has changed state.
|
|
|
|
*
|
|
|
|
* \param subsytem NVMe-oF subsystem that has changed state.
|
|
|
|
* \param cb_arg Argument passed to callback function.
|
|
|
|
* \param status 0 if it completed successfully, or negative errno if it failed.
|
|
|
|
*/
|
2017-12-19 23:39:04 +00:00
|
|
|
typedef void (*spdk_nvmf_subsystem_state_change_done)(struct spdk_nvmf_subsystem *subsystem,
|
|
|
|
void *cb_arg, int status);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Transition an NVMe-oF subsystem from Inactive to Active state.
|
|
|
|
*
|
|
|
|
* \param subsystem The NVMe-oF subsystem.
|
|
|
|
* \param cb_fn A function that will be called once the subsystem has changed state.
|
|
|
|
* \param cb_arg Argument passed to cb_fn.
|
|
|
|
*
|
2018-02-28 06:27:31 +00:00
|
|
|
* \return 0 on success, or negated errno on failure. The callback provided will only
|
|
|
|
* be called on success.
|
2017-12-19 23:39:04 +00:00
|
|
|
*/
|
2018-01-10 21:03:24 +00:00
|
|
|
int spdk_nvmf_subsystem_start(struct spdk_nvmf_subsystem *subsystem,
|
|
|
|
spdk_nvmf_subsystem_state_change_done cb_fn,
|
|
|
|
void *cb_arg);
|
2017-12-19 23:39:04 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Transition an NVMe-oF subsystem from Active to Inactive state.
|
|
|
|
*
|
|
|
|
* \param subsystem The NVMe-oF subsystem.
|
|
|
|
* \param cb_fn A function that will be called once the subsystem has changed state.
|
|
|
|
* \param cb_arg Argument passed to cb_fn.
|
|
|
|
*
|
2018-02-28 06:27:31 +00:00
|
|
|
* \return 0 on success, or negated errno on failure. The callback provided will only
|
|
|
|
* be called on success.
|
2017-12-19 23:39:04 +00:00
|
|
|
*/
|
2018-01-10 21:03:24 +00:00
|
|
|
int spdk_nvmf_subsystem_stop(struct spdk_nvmf_subsystem *subsystem,
|
|
|
|
spdk_nvmf_subsystem_state_change_done cb_fn,
|
|
|
|
void *cb_arg);
|
2017-12-19 23:39:04 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Transition an NVMe-oF subsystem from Active to Paused state.
|
|
|
|
*
|
|
|
|
* \param subsystem The NVMe-oF subsystem.
|
|
|
|
* \param cb_fn A function that will be called once the subsystem has changed state.
|
|
|
|
* \param cb_arg Argument passed to cb_fn.
|
|
|
|
*
|
2018-02-28 06:27:31 +00:00
|
|
|
* \return 0 on success, or negated errno on failure. The callback provided will only
|
|
|
|
* be called on success.
|
2017-12-19 23:39:04 +00:00
|
|
|
*/
|
2018-01-10 21:03:24 +00:00
|
|
|
int spdk_nvmf_subsystem_pause(struct spdk_nvmf_subsystem *subsystem,
|
|
|
|
spdk_nvmf_subsystem_state_change_done cb_fn,
|
|
|
|
void *cb_arg);
|
2017-12-19 23:39:04 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Transition an NVMe-oF subsystem from Paused to Active state.
|
|
|
|
*
|
|
|
|
* \param subsystem The NVMe-oF subsystem.
|
|
|
|
* \param cb_fn A function that will be called once the subsystem has changed state.
|
|
|
|
* \param cb_arg Argument passed to cb_fn.
|
|
|
|
*
|
2018-02-28 06:27:31 +00:00
|
|
|
* \return 0 on success, or negated errno on failure. The callback provided will only
|
|
|
|
* be called on success.
|
2017-12-19 23:39:04 +00:00
|
|
|
*/
|
2018-01-10 21:03:24 +00:00
|
|
|
int spdk_nvmf_subsystem_resume(struct spdk_nvmf_subsystem *subsystem,
|
|
|
|
spdk_nvmf_subsystem_state_change_done cb_fn,
|
|
|
|
void *cb_arg);
|
2017-12-19 23:39:04 +00:00
|
|
|
|
2017-08-18 23:05:13 +00:00
|
|
|
/**
|
2018-02-28 06:27:31 +00:00
|
|
|
* Search the target for a subsystem with the given NQN.
|
|
|
|
*
|
|
|
|
* \param tgt The NVMe-oF target to search from.
|
|
|
|
* \param subnqn NQN of the subsystem.
|
|
|
|
*
|
|
|
|
* \return a pointer to the NVMe-oF subsystem on success, or NULL on failure.
|
2017-08-18 23:05:13 +00:00
|
|
|
*/
|
|
|
|
struct spdk_nvmf_subsystem *spdk_nvmf_tgt_find_subsystem(struct spdk_nvmf_tgt *tgt,
|
|
|
|
const char *subnqn);
|
|
|
|
|
2017-11-20 18:16:06 +00:00
|
|
|
/**
|
|
|
|
* Begin iterating over all known subsystems. If no subsystems are present, return NULL.
|
2018-02-28 06:27:31 +00:00
|
|
|
*
|
|
|
|
* \param tgt The NVMe-oF target to iterate.
|
|
|
|
*
|
2018-06-18 14:39:39 +00:00
|
|
|
* \return a pointer to the first NVMe-oF subsystem on success, or NULL on failure.
|
2017-11-20 18:16:06 +00:00
|
|
|
*/
|
|
|
|
struct spdk_nvmf_subsystem *spdk_nvmf_subsystem_get_first(struct spdk_nvmf_tgt *tgt);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Continue iterating over all known subsystems. If no additional subsystems, return NULL.
|
2018-02-28 06:27:31 +00:00
|
|
|
*
|
2018-06-18 14:39:39 +00:00
|
|
|
* \param subsystem Previous subsystem returned from \ref spdk_nvmf_subsystem_get_first or
|
|
|
|
* \ref spdk_nvmf_subsystem_get_next.
|
2018-02-28 06:27:31 +00:00
|
|
|
*
|
2018-06-18 14:39:39 +00:00
|
|
|
* \return a pointer to the next NVMe-oF subsystem on success, or NULL on failure.
|
2017-11-20 18:16:06 +00:00
|
|
|
*/
|
|
|
|
struct spdk_nvmf_subsystem *spdk_nvmf_subsystem_get_next(struct spdk_nvmf_subsystem *subsystem);
|
|
|
|
|
2017-08-18 21:08:29 +00:00
|
|
|
/**
|
|
|
|
* Allow the given host NQN to connect to the given subsystem.
|
|
|
|
*
|
2018-02-28 06:27:31 +00:00
|
|
|
* \param subsystem Subsystem to add host to.
|
2018-06-18 14:39:39 +00:00
|
|
|
* \param hostnqn The NQN for the host.
|
2018-02-28 06:27:31 +00:00
|
|
|
*
|
|
|
|
* \return 0 on success, or negated errno value on failure.
|
2017-08-18 21:08:29 +00:00
|
|
|
*/
|
|
|
|
int spdk_nvmf_subsystem_add_host(struct spdk_nvmf_subsystem *subsystem,
|
|
|
|
const char *hostnqn);
|
|
|
|
|
2018-01-23 22:03:38 +00:00
|
|
|
/**
|
2020-10-06 20:50:37 +00:00
|
|
|
* Remove the given host NQN from the list of allowed hosts.
|
2018-01-23 22:03:38 +00:00
|
|
|
*
|
2020-10-06 20:50:37 +00:00
|
|
|
* This call only removes the host from the allowed list of hosts.
|
|
|
|
* If a host with the given NQN is already connected it will not be disconnected,
|
|
|
|
* but it will not be able to create new connections.
|
2018-01-23 22:03:38 +00:00
|
|
|
*
|
2018-02-28 06:27:31 +00:00
|
|
|
* \param subsystem Subsystem to remove host from.
|
2018-06-18 14:39:39 +00:00
|
|
|
* \param hostnqn The NQN for the host.
|
2018-02-28 06:27:31 +00:00
|
|
|
*
|
|
|
|
* \return 0 on success, or negated errno value on failure.
|
2018-01-23 22:03:38 +00:00
|
|
|
*/
|
|
|
|
int spdk_nvmf_subsystem_remove_host(struct spdk_nvmf_subsystem *subsystem, const char *hostnqn);
|
|
|
|
|
2020-10-07 15:48:47 +00:00
|
|
|
/**
|
|
|
|
* Disconnect all connections originating from the provided hostnqn
|
|
|
|
*
|
|
|
|
* To disconnect and block all new connections from a host, first call
|
|
|
|
* spdk_nvmf_subsystem_remove_host() to remove it from the list of allowed hosts, then
|
|
|
|
* call spdk_nvmf_subsystem_disconnect_host() to close any remaining connections.
|
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to operate on
|
|
|
|
* \param hostnqn The NQN for the host
|
|
|
|
* \param cb_fn The function to call on completion.
|
|
|
|
* \param cb_arg The argument to pass to the cb_fn.
|
|
|
|
*
|
|
|
|
* \return int. 0 when the asynchronous process starts successfully or a negated errno on failure.
|
|
|
|
*/
|
|
|
|
int spdk_nvmf_subsystem_disconnect_host(struct spdk_nvmf_subsystem *subsystem,
|
|
|
|
const char *hostnqn,
|
|
|
|
spdk_nvmf_tgt_subsystem_listen_done_fn cb_fn,
|
|
|
|
void *cb_arg);
|
|
|
|
|
2017-08-30 20:21:12 +00:00
|
|
|
/**
|
|
|
|
* Set whether a subsystem should allow any host or only hosts in the allowed list.
|
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to modify.
|
2018-02-28 06:27:31 +00:00
|
|
|
* \param allow_any_host true to allow any host to connect to this subsystem,
|
|
|
|
* or false to enforce the whitelist configured with spdk_nvmf_subsystem_add_host().
|
|
|
|
*
|
|
|
|
* \return 0 on success, or negated errno value on failure.
|
2017-08-30 20:21:12 +00:00
|
|
|
*/
|
2018-01-17 22:33:27 +00:00
|
|
|
int spdk_nvmf_subsystem_set_allow_any_host(struct spdk_nvmf_subsystem *subsystem,
|
2017-08-30 20:21:12 +00:00
|
|
|
bool allow_any_host);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check whether a subsystem should allow any host or only hosts in the allowed list.
|
|
|
|
*
|
2019-10-16 05:06:30 +00:00
|
|
|
* \param subsystem Subsystem to query.
|
2018-02-28 06:27:31 +00:00
|
|
|
*
|
|
|
|
* \return true if any host is allowed to connect to this subsystem, or false if
|
|
|
|
* connecting hosts must be in the whitelist configured with spdk_nvmf_subsystem_add_host().
|
2017-08-30 20:21:12 +00:00
|
|
|
*/
|
|
|
|
bool spdk_nvmf_subsystem_get_allow_any_host(const struct spdk_nvmf_subsystem *subsystem);
|
|
|
|
|
2017-08-18 21:08:29 +00:00
|
|
|
/**
|
|
|
|
* Check if the given host is allowed to connect to the subsystem.
|
|
|
|
*
|
2018-02-28 06:27:31 +00:00
|
|
|
* \param subsystem The subsystem to query.
|
|
|
|
* \param hostnqn The NQN of the host.
|
|
|
|
*
|
2017-08-18 21:08:29 +00:00
|
|
|
* \return true if allowed, false if not.
|
|
|
|
*/
|
2016-11-23 17:32:07 +00:00
|
|
|
bool spdk_nvmf_subsystem_host_allowed(struct spdk_nvmf_subsystem *subsystem, const char *hostnqn);
|
|
|
|
|
2017-08-18 21:08:29 +00:00
|
|
|
/**
|
2018-02-28 06:27:31 +00:00
|
|
|
* Get the first allowed host in a subsystem.
|
2017-08-18 21:08:29 +00:00
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to query.
|
2018-02-28 06:27:31 +00:00
|
|
|
*
|
|
|
|
* \return first allowed host in this subsystem, or NULL if none allowed.
|
2017-08-18 21:08:29 +00:00
|
|
|
*/
|
|
|
|
struct spdk_nvmf_host *spdk_nvmf_subsystem_get_first_host(struct spdk_nvmf_subsystem *subsystem);
|
|
|
|
|
|
|
|
/**
|
2018-02-28 06:27:31 +00:00
|
|
|
* Get the next allowed host in a subsystem.
|
2017-08-18 21:08:29 +00:00
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to query.
|
|
|
|
* \param prev_host Previous host returned from this function.
|
2018-02-28 06:27:31 +00:00
|
|
|
*
|
|
|
|
* \return next allowed host in this subsystem, or NULL if prev_host was the last host.
|
2017-08-18 21:08:29 +00:00
|
|
|
*/
|
|
|
|
struct spdk_nvmf_host *spdk_nvmf_subsystem_get_next_host(struct spdk_nvmf_subsystem *subsystem,
|
|
|
|
struct spdk_nvmf_host *prev_host);
|
|
|
|
|
|
|
|
/**
|
2018-02-28 06:27:31 +00:00
|
|
|
* Get a host's NQN.
|
2017-08-18 21:08:29 +00:00
|
|
|
*
|
|
|
|
* \param host Host to query.
|
2018-02-28 06:27:31 +00:00
|
|
|
*
|
2017-08-18 21:08:29 +00:00
|
|
|
* \return NQN of host.
|
|
|
|
*/
|
2020-02-25 17:45:04 +00:00
|
|
|
const char *spdk_nvmf_host_get_nqn(const struct spdk_nvmf_host *host);
|
2017-08-18 21:08:29 +00:00
|
|
|
|
2017-08-18 21:43:15 +00:00
|
|
|
/**
|
2018-02-28 06:27:31 +00:00
|
|
|
* Accept new connections on the address provided.
|
2017-08-18 21:43:15 +00:00
|
|
|
*
|
2020-01-02 19:00:45 +00:00
|
|
|
* This does not start the listener. Use spdk_nvmf_tgt_listen() for that.
|
|
|
|
*
|
2018-01-17 22:33:27 +00:00
|
|
|
* May only be performed on subsystems in the PAUSED or INACTIVE states.
|
|
|
|
*
|
2018-02-28 06:27:31 +00:00
|
|
|
* \param subsystem Subsystem to add listener to.
|
|
|
|
* \param trid The address to accept connections from.
|
2020-02-05 21:17:40 +00:00
|
|
|
* \param cb_fn A callback that will be called once the association is complete.
|
|
|
|
* \param cb_arg Argument passed to cb_fn.
|
2017-08-18 21:43:15 +00:00
|
|
|
*/
|
2020-02-05 21:17:40 +00:00
|
|
|
void spdk_nvmf_subsystem_add_listener(struct spdk_nvmf_subsystem *subsystem,
|
|
|
|
struct spdk_nvme_transport_id *trid,
|
|
|
|
spdk_nvmf_tgt_subsystem_listen_done_fn cb_fn,
|
|
|
|
void *cb_arg);
|
2016-09-19 17:01:52 +00:00
|
|
|
|
2018-02-06 16:00:03 +00:00
|
|
|
/**
|
2020-01-02 19:00:45 +00:00
|
|
|
* Remove the listener from subsystem.
|
|
|
|
*
|
|
|
|
* New connections to the address won't be propagated to the subsystem.
|
|
|
|
* However to stop listening at target level one must use the
|
|
|
|
* spdk_nvmf_tgt_stop_listen().
|
2018-02-06 16:00:03 +00:00
|
|
|
*
|
|
|
|
* May only be performed on subsystems in the PAUSED or INACTIVE states.
|
|
|
|
*
|
2018-02-28 06:27:31 +00:00
|
|
|
* \param subsystem Subsystem to remove listener from.
|
|
|
|
* \param trid The address to no longer accept connections from.
|
|
|
|
*
|
|
|
|
* \return 0 on success, or negated errno value on failure.
|
2018-02-06 16:00:03 +00:00
|
|
|
*/
|
|
|
|
int spdk_nvmf_subsystem_remove_listener(struct spdk_nvmf_subsystem *subsystem,
|
|
|
|
const struct spdk_nvme_transport_id *trid);
|
|
|
|
|
2017-08-18 21:43:15 +00:00
|
|
|
/**
|
2018-02-28 06:27:31 +00:00
|
|
|
* Check if connections originated from the given address are allowed to connect
|
|
|
|
* to the subsystem.
|
2017-08-18 21:43:15 +00:00
|
|
|
*
|
2018-02-28 06:27:31 +00:00
|
|
|
* \param subsystem The subsystem to query.
|
|
|
|
* \param trid The listen address.
|
|
|
|
*
|
|
|
|
* \return true if allowed, or false if not.
|
2017-08-18 21:43:15 +00:00
|
|
|
*/
|
2017-05-31 23:17:50 +00:00
|
|
|
bool spdk_nvmf_subsystem_listener_allowed(struct spdk_nvmf_subsystem *subsystem,
|
2020-02-15 05:57:06 +00:00
|
|
|
const struct spdk_nvme_transport_id *trid);
|
2017-05-31 23:17:50 +00:00
|
|
|
|
2017-08-18 21:43:15 +00:00
|
|
|
/**
|
2018-02-28 06:27:31 +00:00
|
|
|
* Get the first allowed listen address in the subsystem.
|
2017-08-18 21:43:15 +00:00
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to query.
|
2018-02-28 06:27:31 +00:00
|
|
|
*
|
|
|
|
* \return first allowed listen address in this subsystem, or NULL if none allowed.
|
2017-08-18 21:43:15 +00:00
|
|
|
*/
|
2020-02-15 05:47:36 +00:00
|
|
|
struct spdk_nvmf_subsystem_listener *spdk_nvmf_subsystem_get_first_listener(
|
2017-08-18 21:43:15 +00:00
|
|
|
struct spdk_nvmf_subsystem *subsystem);
|
2017-08-18 21:08:29 +00:00
|
|
|
|
2017-08-18 21:43:15 +00:00
|
|
|
/**
|
2018-02-28 06:27:31 +00:00
|
|
|
* Get the next allowed listen address in a subsystem.
|
2017-08-18 21:43:15 +00:00
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to query.
|
2018-02-28 06:27:31 +00:00
|
|
|
* \param prev_listener Previous listen address for this subsystem.
|
|
|
|
*
|
|
|
|
* \return next allowed listen address in this subsystem, or NULL if prev_listener
|
|
|
|
* was the last address.
|
2017-08-18 21:43:15 +00:00
|
|
|
*/
|
2020-02-15 05:47:36 +00:00
|
|
|
struct spdk_nvmf_subsystem_listener *spdk_nvmf_subsystem_get_next_listener(
|
2017-08-18 21:43:15 +00:00
|
|
|
struct spdk_nvmf_subsystem *subsystem,
|
2020-02-15 05:47:36 +00:00
|
|
|
struct spdk_nvmf_subsystem_listener *prev_listener);
|
2017-08-18 21:43:15 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Get a listen address' transport ID
|
|
|
|
*
|
2018-02-28 06:27:31 +00:00
|
|
|
* \param listener This listener.
|
|
|
|
*
|
|
|
|
* \return the transport ID for this listener.
|
2017-08-18 21:43:15 +00:00
|
|
|
*/
|
2020-02-15 05:47:36 +00:00
|
|
|
const struct spdk_nvme_transport_id *spdk_nvmf_subsystem_listener_get_trid(
|
|
|
|
struct spdk_nvmf_subsystem_listener *listener);
|
2016-09-19 17:01:52 +00:00
|
|
|
|
2019-10-11 07:12:43 +00:00
|
|
|
/**
|
|
|
|
* Set whether a subsystem should allow any listen address or only addresses in the allowed list.
|
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to allow dynamic listener assignment.
|
|
|
|
* \param allow_any_listener true to allow dynamic listener assignment for
|
|
|
|
* this subsystem, or false to enforce the whitelist configured during
|
|
|
|
* subsystem setup.
|
|
|
|
*/
|
|
|
|
void spdk_nvmf_subsystem_allow_any_listener(
|
|
|
|
struct spdk_nvmf_subsystem *subsystem,
|
|
|
|
bool allow_any_listener);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check whether a subsystem allows any listen address or only addresses in the allowed list.
|
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to query.
|
|
|
|
*
|
|
|
|
* \return true if this subsystem allows dynamic management of listen address list,
|
|
|
|
* or false if only allows addresses in the whitelist configured during subsystem setup.
|
|
|
|
*/
|
|
|
|
bool spdk_nvmf_subsytem_any_listener_allowed(
|
|
|
|
struct spdk_nvmf_subsystem *subsystem);
|
|
|
|
|
2020-08-19 04:51:54 +00:00
|
|
|
/**
|
|
|
|
* Set whether a subsystem supports Asymmetric Namespace Access (ANA)
|
|
|
|
* reporting.
|
|
|
|
*
|
|
|
|
* May only be performed on subsystems in the INACTIVE state.
|
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to modify.
|
|
|
|
* \param ana_reporting true to support or false not to support ANA reporting.
|
|
|
|
*
|
|
|
|
* \return 0 on success, or negated errno value on failure.
|
|
|
|
*/
|
|
|
|
int spdk_nvmf_subsystem_set_ana_reporting(struct spdk_nvmf_subsystem *subsystem,
|
|
|
|
bool ana_reporting);
|
|
|
|
|
2017-08-22 15:54:12 +00:00
|
|
|
/** NVMe-oF target namespace creation options */
|
|
|
|
struct spdk_nvmf_ns_opts {
|
|
|
|
/**
|
|
|
|
* Namespace ID
|
|
|
|
*
|
|
|
|
* Set to 0 to automatically assign a free NSID.
|
|
|
|
*/
|
|
|
|
uint32_t nsid;
|
2018-02-13 00:03:01 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Namespace Globally Unique Identifier
|
|
|
|
*
|
|
|
|
* Fill with 0s if not specified.
|
|
|
|
*/
|
|
|
|
uint8_t nguid[16];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* IEEE Extended Unique Identifier
|
|
|
|
*
|
|
|
|
* Fill with 0s if not specified.
|
|
|
|
*/
|
|
|
|
uint8_t eui64[8];
|
2018-02-22 00:09:56 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Namespace UUID
|
|
|
|
*
|
|
|
|
* Fill with 0s if not specified.
|
|
|
|
*/
|
|
|
|
struct spdk_uuid uuid;
|
2017-08-22 15:54:12 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get default namespace creation options.
|
|
|
|
*
|
|
|
|
* \param opts Namespace options to fill with defaults.
|
|
|
|
* \param opts_size sizeof(struct spdk_nvmf_ns_opts)
|
|
|
|
*/
|
|
|
|
void spdk_nvmf_ns_opts_get_defaults(struct spdk_nvmf_ns_opts *opts, size_t opts_size);
|
|
|
|
|
2017-06-14 20:00:11 +00:00
|
|
|
/**
|
2020-09-30 19:22:21 +00:00
|
|
|
* Add a namespace to a subsytem (deprecated, please use spdk_nvmf_subsystem_add_ns_ext).
|
2017-06-14 20:00:11 +00:00
|
|
|
*
|
2018-01-17 22:33:27 +00:00
|
|
|
* May only be performed on subsystems in the PAUSED or INACTIVE states.
|
|
|
|
*
|
2017-06-14 20:00:11 +00:00
|
|
|
* \param subsystem Subsystem to add namespace to.
|
|
|
|
* \param bdev Block device to add as a namespace.
|
2017-08-22 15:54:12 +00:00
|
|
|
* \param opts Namespace options, or NULL to use defaults.
|
|
|
|
* \param opts_size sizeof(*opts)
|
2019-05-22 05:56:37 +00:00
|
|
|
* \param ptpl_file Persist through power loss file path.
|
2017-06-14 20:00:11 +00:00
|
|
|
*
|
2018-02-28 06:27:31 +00:00
|
|
|
* \return newly added NSID on success, or 0 on failure.
|
2017-06-14 20:00:11 +00:00
|
|
|
*/
|
|
|
|
uint32_t spdk_nvmf_subsystem_add_ns(struct spdk_nvmf_subsystem *subsystem, struct spdk_bdev *bdev,
|
2019-05-22 05:56:37 +00:00
|
|
|
const struct spdk_nvmf_ns_opts *opts, size_t opts_size,
|
|
|
|
const char *ptpl_file);
|
2016-09-19 17:01:52 +00:00
|
|
|
|
2020-09-30 19:22:21 +00:00
|
|
|
/**
|
|
|
|
* Add a namespace to a subsystems in the PAUSED or INACTIVE states.
|
|
|
|
*
|
|
|
|
* May only be performed on subsystems in the PAUSED or INACTIVE states.
|
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to add namespace to.
|
|
|
|
* \param bdev_name Block device name to add as a namespace.
|
|
|
|
* \param opts Namespace options, or NULL to use defaults.
|
|
|
|
* \param opts_size sizeof(*opts)
|
|
|
|
* \param ptpl_file Persist through power loss file path.
|
|
|
|
*
|
|
|
|
* \return newly added NSID on success, or 0 on failure.
|
|
|
|
*/
|
|
|
|
uint32_t spdk_nvmf_subsystem_add_ns_ext(struct spdk_nvmf_subsystem *subsystem,
|
|
|
|
const char *bdev_name,
|
|
|
|
const struct spdk_nvmf_ns_opts *opts, size_t opts_size,
|
|
|
|
const char *ptpl_file);
|
|
|
|
|
2017-12-14 02:38:18 +00:00
|
|
|
/**
|
|
|
|
* Remove a namespace from a subsytem.
|
|
|
|
*
|
2018-01-17 22:33:27 +00:00
|
|
|
* May only be performed on subsystems in the PAUSED or INACTIVE states.
|
|
|
|
*
|
2017-12-14 02:38:18 +00:00
|
|
|
* \param subsystem Subsystem the namespace belong to.
|
|
|
|
* \param nsid Namespace ID to be removed.
|
|
|
|
*
|
2018-02-28 06:27:31 +00:00
|
|
|
* \return 0 on success, -1 on failure.
|
2017-12-14 02:38:18 +00:00
|
|
|
*/
|
2019-06-27 11:46:42 +00:00
|
|
|
int spdk_nvmf_subsystem_remove_ns(struct spdk_nvmf_subsystem *subsystem, uint32_t nsid);
|
2017-12-14 02:38:18 +00:00
|
|
|
|
2017-08-18 01:20:49 +00:00
|
|
|
/**
|
2018-02-28 06:27:31 +00:00
|
|
|
* Get the first allocated namespace in a subsystem.
|
2017-08-18 01:20:49 +00:00
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to query.
|
2018-02-28 06:27:31 +00:00
|
|
|
*
|
|
|
|
* \return first allocated namespace in this subsystem, or NULL if this subsystem
|
|
|
|
* has no namespaces.
|
2017-08-18 01:20:49 +00:00
|
|
|
*/
|
|
|
|
struct spdk_nvmf_ns *spdk_nvmf_subsystem_get_first_ns(struct spdk_nvmf_subsystem *subsystem);
|
|
|
|
|
|
|
|
/**
|
2018-02-28 06:27:31 +00:00
|
|
|
* Get the next allocated namespace in a subsystem.
|
2017-08-18 01:20:49 +00:00
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to query.
|
|
|
|
* \param prev_ns Previous ns returned from this function.
|
2018-02-28 06:27:31 +00:00
|
|
|
*
|
|
|
|
* \return next allocated namespace in this subsystem, or NULL if prev_ns was the
|
|
|
|
* last namespace.
|
2017-08-18 01:20:49 +00:00
|
|
|
*/
|
|
|
|
struct spdk_nvmf_ns *spdk_nvmf_subsystem_get_next_ns(struct spdk_nvmf_subsystem *subsystem,
|
|
|
|
struct spdk_nvmf_ns *prev_ns);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get a namespace in a subsystem by NSID.
|
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to search.
|
|
|
|
* \param nsid Namespace ID to find.
|
2018-02-28 06:27:31 +00:00
|
|
|
*
|
|
|
|
* \return namespace matching nsid, or NULL if nsid was not found.
|
2017-08-18 01:20:49 +00:00
|
|
|
*/
|
|
|
|
struct spdk_nvmf_ns *spdk_nvmf_subsystem_get_ns(struct spdk_nvmf_subsystem *subsystem,
|
|
|
|
uint32_t nsid);
|
|
|
|
|
2018-06-12 17:11:45 +00:00
|
|
|
/**
|
|
|
|
* Get the maximum number of namespaces allowed in a subsystem.
|
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to query.
|
|
|
|
*
|
|
|
|
* \return Maximum number of namespaces allowed in the subsystem, or 0 for unlimited.
|
|
|
|
*/
|
|
|
|
uint32_t spdk_nvmf_subsystem_get_max_namespaces(const struct spdk_nvmf_subsystem *subsystem);
|
|
|
|
|
2017-08-18 01:20:49 +00:00
|
|
|
/**
|
|
|
|
* Get a namespace's NSID.
|
|
|
|
*
|
|
|
|
* \param ns Namespace to query.
|
2018-02-28 06:27:31 +00:00
|
|
|
*
|
2017-08-18 01:20:49 +00:00
|
|
|
* \return NSID of ns.
|
|
|
|
*/
|
|
|
|
uint32_t spdk_nvmf_ns_get_id(const struct spdk_nvmf_ns *ns);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get a namespace's associated bdev.
|
|
|
|
*
|
2018-02-28 06:27:31 +00:00
|
|
|
* \param ns Namespace to query.
|
|
|
|
*
|
|
|
|
* \return backing bdev of ns.
|
2017-08-18 01:20:49 +00:00
|
|
|
*/
|
|
|
|
struct spdk_bdev *spdk_nvmf_ns_get_bdev(struct spdk_nvmf_ns *ns);
|
|
|
|
|
2017-08-22 15:54:12 +00:00
|
|
|
/**
|
|
|
|
* Get the options specified for a namespace.
|
|
|
|
*
|
|
|
|
* \param ns Namespace to query.
|
|
|
|
* \param opts Output parameter for options.
|
|
|
|
* \param opts_size sizeof(*opts)
|
|
|
|
*/
|
|
|
|
void spdk_nvmf_ns_get_opts(const struct spdk_nvmf_ns *ns, struct spdk_nvmf_ns_opts *opts,
|
|
|
|
size_t opts_size);
|
|
|
|
|
2018-02-28 06:27:31 +00:00
|
|
|
/**
|
|
|
|
* Get the serial number of the specified subsystem.
|
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to query.
|
|
|
|
*
|
|
|
|
* \return serial number of the specified subsystem.
|
|
|
|
*/
|
2017-06-01 00:01:00 +00:00
|
|
|
const char *spdk_nvmf_subsystem_get_sn(const struct spdk_nvmf_subsystem *subsystem);
|
|
|
|
|
2018-02-28 06:27:31 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Set the serial number for the specified subsystem.
|
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to set for.
|
|
|
|
* \param sn serial number to set.
|
|
|
|
*
|
|
|
|
* \return 0 on success, -1 on failure.
|
|
|
|
*/
|
2016-09-19 17:01:52 +00:00
|
|
|
int spdk_nvmf_subsystem_set_sn(struct spdk_nvmf_subsystem *subsystem, const char *sn);
|
|
|
|
|
2018-12-29 19:39:48 +00:00
|
|
|
/**
|
|
|
|
* Get the model number of the specified subsystem.
|
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to query.
|
|
|
|
*
|
|
|
|
* \return model number of the specified subsystem.
|
|
|
|
*/
|
|
|
|
const char *spdk_nvmf_subsystem_get_mn(const struct spdk_nvmf_subsystem *subsystem);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set the model number for the specified subsystem.
|
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to set for.
|
|
|
|
* \param mn model number to set.
|
|
|
|
*
|
|
|
|
* \return 0 on success, -1 on failure.
|
|
|
|
*/
|
|
|
|
int spdk_nvmf_subsystem_set_mn(struct spdk_nvmf_subsystem *subsystem, const char *mn);
|
|
|
|
|
2018-02-28 06:27:31 +00:00
|
|
|
/**
|
|
|
|
* Get the NQN of the specified subsystem.
|
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to query.
|
|
|
|
*
|
|
|
|
* \return NQN of the specified subsystem.
|
|
|
|
*/
|
2020-02-25 17:45:04 +00:00
|
|
|
const char *spdk_nvmf_subsystem_get_nqn(const struct spdk_nvmf_subsystem *subsystem);
|
2018-02-28 06:27:31 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the type of the specified subsystem.
|
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to query.
|
|
|
|
*
|
|
|
|
* \return the type of the specified subsystem.
|
|
|
|
*/
|
2016-10-10 17:25:01 +00:00
|
|
|
enum spdk_nvmf_subtype spdk_nvmf_subsystem_get_type(struct spdk_nvmf_subsystem *subsystem);
|
|
|
|
|
2020-01-02 22:59:33 +00:00
|
|
|
/**
|
|
|
|
* Get maximum namespace id of the specified subsystem.
|
|
|
|
*
|
|
|
|
* \param subsystem Subsystem to query.
|
|
|
|
*
|
|
|
|
* \return maximum namespace id
|
|
|
|
*/
|
|
|
|
uint32_t spdk_nvmf_subsystem_get_max_nsid(struct spdk_nvmf_subsystem *subsystem);
|
|
|
|
|
2018-08-27 22:27:47 +00:00
|
|
|
/**
|
|
|
|
* Initialize transport options
|
|
|
|
*
|
2019-12-23 23:27:35 +00:00
|
|
|
* \param transport_name The transport type to create
|
2018-08-27 22:27:47 +00:00
|
|
|
* \param opts The transport options (e.g. max_io_size)
|
|
|
|
*
|
|
|
|
* \return bool. true if successful, false if transport type
|
|
|
|
* not found.
|
|
|
|
*/
|
|
|
|
bool
|
2019-12-23 23:27:35 +00:00
|
|
|
spdk_nvmf_transport_opts_init(const char *transport_name,
|
2018-08-27 22:27:47 +00:00
|
|
|
struct spdk_nvmf_transport_opts *opts);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a protocol transport
|
|
|
|
*
|
2019-12-23 23:27:35 +00:00
|
|
|
* \param transport_name The transport type to create
|
2018-08-27 22:27:47 +00:00
|
|
|
* \param opts The transport options (e.g. max_io_size)
|
|
|
|
*
|
|
|
|
* \return new transport or NULL if create fails
|
|
|
|
*/
|
2019-12-23 23:27:35 +00:00
|
|
|
struct spdk_nvmf_transport *spdk_nvmf_transport_create(const char *transport_name,
|
2018-08-27 22:27:47 +00:00
|
|
|
struct spdk_nvmf_transport_opts *opts);
|
|
|
|
|
2020-11-20 05:50:52 +00:00
|
|
|
typedef void (*spdk_nvmf_transport_destroy_done_cb)(void *cb_arg);
|
|
|
|
|
2018-08-27 22:27:47 +00:00
|
|
|
/**
|
|
|
|
* Destroy a protocol transport
|
|
|
|
*
|
|
|
|
* \param transport The transport to destory
|
2020-11-20 05:50:52 +00:00
|
|
|
* \param cb_fn A callback that will be called once the transport is destroyed
|
|
|
|
* \param cb_arg A context argument passed to cb_fn.
|
2018-08-27 22:27:47 +00:00
|
|
|
*
|
|
|
|
* \return 0 on success, -1 on failure.
|
|
|
|
*/
|
2020-11-20 05:50:52 +00:00
|
|
|
int spdk_nvmf_transport_destroy(struct spdk_nvmf_transport *transport,
|
|
|
|
spdk_nvmf_transport_destroy_done_cb cb_fn, void *cb_arg);
|
2018-08-27 22:27:47 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Get an existing transport from the target
|
|
|
|
*
|
|
|
|
* \param tgt The NVMe-oF target
|
2020-01-07 17:36:40 +00:00
|
|
|
* \param transport_name The name of the transport type to get.
|
2018-08-27 22:27:47 +00:00
|
|
|
*
|
|
|
|
* \return the transport or NULL if not found
|
|
|
|
*/
|
|
|
|
struct spdk_nvmf_transport *spdk_nvmf_tgt_get_transport(struct spdk_nvmf_tgt *tgt,
|
2020-01-07 17:36:40 +00:00
|
|
|
const char *transport_name);
|
2018-08-27 22:27:47 +00:00
|
|
|
|
2018-10-23 21:37:22 +00:00
|
|
|
/**
|
|
|
|
* Get the first transport registered with the given target
|
|
|
|
*
|
|
|
|
* \param tgt The NVMe-oF target
|
|
|
|
*
|
|
|
|
* \return The first transport registered on the target
|
|
|
|
*/
|
|
|
|
struct spdk_nvmf_transport *spdk_nvmf_transport_get_first(struct spdk_nvmf_tgt *tgt);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the next transport in a target's list.
|
|
|
|
*
|
|
|
|
* \param transport A handle to a transport object
|
|
|
|
*
|
|
|
|
* \return The next transport associated with the NVMe-oF target
|
|
|
|
*/
|
|
|
|
struct spdk_nvmf_transport *spdk_nvmf_transport_get_next(struct spdk_nvmf_transport *transport);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the opts for a given transport.
|
|
|
|
*
|
|
|
|
* \param transport The transport to query
|
|
|
|
*
|
|
|
|
* \return The opts associated with the given transport
|
|
|
|
*/
|
|
|
|
const struct spdk_nvmf_transport_opts *spdk_nvmf_get_transport_opts(struct spdk_nvmf_transport
|
|
|
|
*transport);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the transport type for a given transport.
|
|
|
|
*
|
|
|
|
* \param transport The transport to query
|
|
|
|
*
|
|
|
|
* \return the transport type for the given transport
|
|
|
|
*/
|
|
|
|
spdk_nvme_transport_type_t spdk_nvmf_get_transport_type(struct spdk_nvmf_transport *transport);
|
|
|
|
|
2020-01-17 11:20:29 +00:00
|
|
|
/**
|
|
|
|
* Get the transport name for a given transport.
|
|
|
|
*
|
|
|
|
* \param transport The transport to query
|
|
|
|
*
|
|
|
|
* \return the transport name for the given transport
|
|
|
|
*/
|
|
|
|
const char *spdk_nvmf_get_transport_name(struct spdk_nvmf_transport *transport);
|
|
|
|
|
2018-08-27 22:27:47 +00:00
|
|
|
/**
|
|
|
|
* Function to be called once transport add is complete
|
|
|
|
*
|
|
|
|
* \param cb_arg Callback argument passed to this function.
|
|
|
|
* \param status 0 if it completed successfully, or negative errno if it failed.
|
|
|
|
*/
|
|
|
|
typedef void (*spdk_nvmf_tgt_add_transport_done_fn)(void *cb_arg, int status);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Add a transport to a target
|
|
|
|
*
|
|
|
|
* \param tgt The NVMe-oF target
|
|
|
|
* \param transport The transport to add
|
|
|
|
* \param cb_fn A callback that will be called once the transport is created
|
|
|
|
* \param cb_arg A context argument passed to cb_fn.
|
|
|
|
*
|
|
|
|
* \return void. The callback status argument will be 0 on success
|
|
|
|
* or a negated errno on failure.
|
|
|
|
*/
|
|
|
|
void spdk_nvmf_tgt_add_transport(struct spdk_nvmf_tgt *tgt,
|
|
|
|
struct spdk_nvmf_transport *transport,
|
|
|
|
spdk_nvmf_tgt_add_transport_done_fn cb_fn,
|
|
|
|
void *cb_arg);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Add listener to transport and begin accepting new connections.
|
|
|
|
*
|
|
|
|
* \param transport The transport to add listener to
|
|
|
|
* \param trid Address to listen at
|
|
|
|
*
|
|
|
|
* \return int. 0 if it completed successfully, or negative errno if it failed.
|
|
|
|
*/
|
2020-02-15 05:30:46 +00:00
|
|
|
int
|
|
|
|
spdk_nvmf_transport_listen(struct spdk_nvmf_transport *transport,
|
2020-02-13 19:44:00 +00:00
|
|
|
const struct spdk_nvme_transport_id *trid);
|
2018-08-27 22:27:47 +00:00
|
|
|
|
2020-02-15 05:30:46 +00:00
|
|
|
/**
|
|
|
|
* Remove listener from transport and stop accepting new connections.
|
|
|
|
*
|
|
|
|
* \param transport The transport to remove listener from
|
|
|
|
* \param trid Address to stop listen at
|
|
|
|
*
|
|
|
|
* \return int. 0 if it completed successfully, or negative errno if it failed.
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
spdk_nvmf_transport_stop_listen(struct spdk_nvmf_transport *transport,
|
|
|
|
const struct spdk_nvme_transport_id *trid);
|
2018-08-27 22:27:47 +00:00
|
|
|
|
2020-07-09 21:57:37 +00:00
|
|
|
/**
|
|
|
|
* Stop accepting new connections at the provided address.
|
|
|
|
*
|
|
|
|
* This is a counterpart to spdk_nvmf_tgt_listen(). It differs
|
|
|
|
* from spdk_nvmf_transport_stop_listen() in that it also destroys all
|
|
|
|
* qpairs that are connected to the specified listener. Because
|
|
|
|
* this function disconnects the qpairs, it has to be asynchronous.
|
|
|
|
*
|
|
|
|
* \param transport The transport associated with the listen address.
|
|
|
|
* \param trid The address to stop listening at.
|
|
|
|
* \param cb_fn The function to call on completion.
|
|
|
|
* \param cb_arg The argument to pass to the cb_fn.
|
|
|
|
*
|
|
|
|
* \return int. 0 when the asynchronous process starts successfully or a negated errno on failure.
|
|
|
|
*/
|
|
|
|
int spdk_nvmf_transport_stop_listen_async(struct spdk_nvmf_transport *transport,
|
|
|
|
const struct spdk_nvme_transport_id *trid,
|
|
|
|
spdk_nvmf_tgt_subsystem_listen_done_fn cb_fn,
|
|
|
|
void *cb_arg);
|
|
|
|
|
2019-05-23 09:04:49 +00:00
|
|
|
/**
|
|
|
|
* \brief Get current transport poll group statistics.
|
|
|
|
*
|
|
|
|
* This function allocates memory for statistics and returns it
|
|
|
|
* in \p stat parameter. Caller must free this memory with
|
|
|
|
* spdk_nvmf_transport_poll_group_free_stat() when it is not needed
|
|
|
|
* anymore.
|
|
|
|
*
|
|
|
|
* \param tgt The NVMf target.
|
|
|
|
* \param transport The NVMf transport.
|
|
|
|
* \param stat Output parameter that will contain pointer to allocated statistics structure.
|
|
|
|
*
|
|
|
|
* \return 0 upon success.
|
|
|
|
* \return -ENOTSUP if transport does not support statistics.
|
|
|
|
* \return -EINVAL if any of parameters is NULL.
|
|
|
|
* \return -ENOENT if transport poll group is not found.
|
|
|
|
* \return -ENOMEM if memory allocation failed.
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
spdk_nvmf_transport_poll_group_get_stat(struct spdk_nvmf_tgt *tgt,
|
|
|
|
struct spdk_nvmf_transport *transport,
|
|
|
|
struct spdk_nvmf_transport_poll_group_stat **stat);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Free statistics memory previously allocated with spdk_nvmf_transport_poll_group_get_stat().
|
|
|
|
*
|
|
|
|
* \param transport The NVMf transport.
|
|
|
|
* \param stat Pointer to transport poll group statistics structure.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
spdk_nvmf_transport_poll_group_free_stat(struct spdk_nvmf_transport *transport,
|
|
|
|
struct spdk_nvmf_transport_poll_group_stat *stat);
|
|
|
|
|
2018-11-20 05:25:48 +00:00
|
|
|
/**
|
|
|
|
* \brief Set the global hooks for the RDMA transport, if necessary.
|
|
|
|
*
|
|
|
|
* This call is optional and must be performed prior to probing for
|
|
|
|
* any devices. By default, the RDMA transport will use the ibverbs
|
|
|
|
* library to create protection domains and register memory. This
|
|
|
|
* is a mechanism to subvert that and use an existing registration.
|
|
|
|
*
|
|
|
|
* This function may only be called one time per process.
|
|
|
|
*
|
|
|
|
* \param hooks for initializing global hooks
|
|
|
|
*/
|
2019-07-25 22:20:47 +00:00
|
|
|
void spdk_nvmf_rdma_init_hooks(struct spdk_nvme_rdma_hooks *hooks);
|
2018-11-20 05:25:48 +00:00
|
|
|
|
2017-12-07 20:25:19 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2016-09-19 17:01:52 +00:00
|
|
|
#endif
|