Spdk/lib/nvmf/nvmf_internal.h
Daniel Verkamp a9282085c9 nvmf: remove nvmf_request pending field
The pending type can be determined based on the command opcode.

This also moves the "issue pending RDMA reads" case out of the I/O queue
handling into the generic continuation code; this should not make any
difference for the current case, since the Fabrics Connect command is
the only other continuation case currently, and there cannot be any
pending RDMA reads in that case.

Change-Id: Idddfa496b6e5b7e6da772aa3ab1b9d1a5344771f
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
2016-06-23 11:12:19 -07:00

185 lines
6.0 KiB
C

/*-
* BSD LICENSE
*
* Copyright (c) Intel Corporation.
* All rights reserved.
*
* 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.
*/
#ifndef __NVMF_INTERNAL_H__
#define __NVMF_INTERNAL_H__
#include "nvmf.h"
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <pthread.h>
#include "spdk/nvmf_spec.h"
#include "spdk/assert.h"
#include "spdk/queue.h"
#define nvmf_min(a,b) (((a)<(b))?(a):(b))
#define SMALL_BB_MAX_SIZE 4096
#define LARGE_BB_MAX_SIZE (128 * 1024)
/*
* NVMf target supports a maximum transfer size that is equal to
* a single allocated bounce buffer per request.
*/
#define SPDK_NVMF_MAX_RECV_DATA_TRANSFER_SIZE LARGE_BB_MAX_SIZE
#define SPDK_NVMF_DEFAULT_NUM_SESSIONS_PER_LCORE 1
#define SPDK_NVMF_DEFAULT_NODEBASE "iqn.2013-10.com.intel.spdk"
#define SPDK_NVMF_DEFAULT_IN_CAPSULE_DATA_SIZE 1024
#define SPDK_NVMF_DEFAULT_MAX_SESSIONS_PER_SUBSYSTEM 1
#define SPDK_NVMF_DEFAULT_MAX_QUEUE_DEPTH 128
#define SPDK_NVMF_DEFAULT_MAX_CONNECTIONS_PER_SESSION 4
#define SPDK_NVMF_DEFAULT_SIN_PORT ((uint16_t)7174)
#define OBJECT_NVMF_IO 0x30
#define TRACE_GROUP_NVMF 0x3
#define TRACE_NVMF_IO_START SPDK_TPOINT_ID(TRACE_GROUP_NVMF, 0x0)
#define TRACE_RDMA_READ_START SPDK_TPOINT_ID(TRACE_GROUP_NVMF, 0x1)
#define TRACE_RDMA_WRITE_START SPDK_TPOINT_ID(TRACE_GROUP_NVMF, 0x2)
#define TRACE_RDMA_READ_COMPLETE SPDK_TPOINT_ID(TRACE_GROUP_NVMF, 0x3)
#define TRACE_RDMA_WRITE_COMPLETE SPDK_TPOINT_ID(TRACE_GROUP_NVMF, 0x4)
#define TRACE_NVMF_LIB_READ_START SPDK_TPOINT_ID(TRACE_GROUP_NVMF, 0x5)
#define TRACE_NVMF_LIB_WRITE_START SPDK_TPOINT_ID(TRACE_GROUP_NVMF, 0x6)
#define TRACE_NVMF_LIB_COMPLETE SPDK_TPOINT_ID(TRACE_GROUP_NVMF, 0x7)
#define TRACE_NVMF_IO_COMPLETE SPDK_TPOINT_ID(TRACE_GROUP_NVMF, 0x8)
struct nvmf_request;
typedef void (*nvmf_cb_fn_t)(struct nvmf_request *);
union sgl_shift {
struct spdk_nvmf_keyed_sgl_descriptor nvmf_sgl;
struct spdk_nvme_sgl_descriptor nvme_sgl;
};
SPDK_STATIC_ASSERT(sizeof(union sgl_shift) == 16, "Incorrect size");
union nvmf_h2c_msg {
struct spdk_nvmf_capsule_cmd nvmf_cmd;
struct spdk_nvme_cmd nvme_cmd;
struct spdk_nvmf_fabric_prop_set_cmd prop_set_cmd;
struct spdk_nvmf_fabric_prop_get_cmd prop_get_cmd;
struct spdk_nvmf_fabric_connect_cmd connect_cmd;
};
SPDK_STATIC_ASSERT(sizeof(union nvmf_h2c_msg) == 64, "Incorrect size");
union nvmf_c2h_msg {
struct spdk_nvmf_capsule_rsp nvmf_rsp;
struct spdk_nvme_cpl nvme_cpl;
struct spdk_nvmf_fabric_prop_set_rsp prop_set_rsp;
struct spdk_nvmf_fabric_prop_get_rsp prop_get_rsp;
struct spdk_nvmf_fabric_connect_rsp connect_rsp;
};
SPDK_STATIC_ASSERT(sizeof(union nvmf_c2h_msg) == 16, "Incorrect size");
#define NVMF_H2C_MAX_MSG (sizeof(union nvmf_h2c_msg))
#define NVMF_C2H_MAX_MSG (sizeof(union nvmf_c2h_msg))
#define NVMF_CNTLID_SUBS_SHIFT 8
struct nvmf_request {
struct nvmf_session *session;
void *fabric_tx_ctx;
void *fabric_rx_ctx;
uint16_t cid; /* command identifier */
uint64_t remote_addr;
uint32_t rkey;
uint32_t length;
enum spdk_nvme_data_transfer xfer;
void *data;
union nvmf_h2c_msg *cmd;
union nvmf_c2h_msg *rsp;
nvmf_cb_fn_t cb_fn;
TAILQ_ENTRY(nvmf_request) entries;
};
/*
* Some NVMe command definitions not provided in the nvme_spec.h file
*/
/* read command dword 12 */
struct __attribute__((packed)) nvme_read_cdw12 {
uint16_t nlb; /* number of logical blocks */
uint16_t rsvd : 10;
uint8_t prinfo : 4; /* protection information field */
uint8_t fua : 1; /* force unit access */
uint8_t lr : 1; /* limited retry */
};
/* read command dword 13 */
struct __attribute__((packed)) nvme_read_cdw13 {
uint8_t dsm_af : 4; /* access frequency */
uint8_t dsm_lat : 2; /* access latency */
uint8_t dsm_seq : 1; /* sequential request */
uint8_t dsm_inc : 1; /* incompressible */
uint8_t rsvd[3];
};
struct spdk_nvmf_globals {
char *nodebase;
pthread_mutex_t mutex;
int MaxInCapsuleData;
int MaxSessionsPerSubsystem;
int MaxQueueDepth;
int MaxConnectionsPerSession;
int MaxRecvDataSegmentLength;
struct rte_mempool *rx_desc_pool;
struct rte_mempool *tx_desc_pool;
struct rte_mempool *nvme_request_pool;
struct rte_mempool *bb_small_pool;
struct rte_mempool *bb_large_pool;
uint16_t sin_port;
};
void
nvmf_complete_cmd(void *rsp, const struct spdk_nvme_cpl *cmp);
int nvmf_tgt_init(char *nodebase, int max_in_capsule_data, int max_sessions, int max_queue_depth,
int max_conn_per_sess, int max_recv_seg_len, int listen_port);
int nvmf_initialize(void);
void nvmf_shutdown(void);
extern struct spdk_nvmf_globals g_nvmf_tgt;
#endif /* __NVMF_INTERNAL_H__ */