blob: 9372d4d4d14a819321f1d9469092ab2ba61df401 [file] [log] [blame]
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -08001#include <linux/socket.h>
2#include <linux/in.h>
3#include <linux/in6.h>
4#include <rdma/ib_verbs.h>
5#include <rdma/rdma_cm.h>
6
7#define ISERT_RDMA_LISTEN_BACKLOG 10
Vu Pham59464ef2013-08-28 23:23:35 +03008#define ISCSI_ISER_SG_TABLESIZE 256
Nicholas Bellinger9bb4ca62014-02-27 07:02:48 -08009#define ISER_FASTREG_LI_WRID 0xffffffffffffffffULL
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -080010
11enum isert_desc_type {
12 ISCSI_TX_CONTROL,
13 ISCSI_TX_DATAIN
14};
15
16enum iser_ib_op_code {
17 ISER_IB_RECV,
18 ISER_IB_SEND,
19 ISER_IB_RDMA_WRITE,
20 ISER_IB_RDMA_READ,
21};
22
23enum iser_conn_state {
24 ISER_CONN_INIT,
25 ISER_CONN_UP,
Sagi Grimberg128e9cc2014-12-02 16:57:20 +020026 ISER_CONN_FULL_FEATURE,
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -080027 ISER_CONN_TERMINATING,
28 ISER_CONN_DOWN,
29};
30
31struct iser_rx_desc {
32 struct iser_hdr iser_header;
33 struct iscsi_hdr iscsi_header;
34 char data[ISER_RECV_DATA_SEG_LEN];
35 u64 dma_addr;
36 struct ib_sge rx_sg;
37 char pad[ISER_RX_PAD_SIZE];
38} __packed;
39
40struct iser_tx_desc {
41 struct iser_hdr iser_header;
42 struct iscsi_hdr iscsi_header;
43 enum isert_desc_type type;
44 u64 dma_addr;
45 struct ib_sge tx_sg[2];
46 int num_sge;
47 struct isert_cmd *isert_cmd;
Nicholas Bellinger95b60f02013-11-05 13:16:12 -080048 struct llist_node *comp_llnode_batch;
49 struct llist_node comp_llnode;
Nicholas Bellingerebbe4422014-03-02 14:51:12 -080050 bool llnode_active;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -080051 struct ib_send_wr send_wr;
52} __packed;
53
Sagi Grimbergd3e125d2014-02-19 17:50:23 +020054enum isert_indicator {
55 ISERT_PROTECTED = 1 << 0,
56 ISERT_DATA_KEY_VALID = 1 << 1,
57 ISERT_PROT_KEY_VALID = 1 << 2,
58 ISERT_SIG_KEY_VALID = 1 << 3,
59};
60
61struct pi_context {
62 struct ib_mr *prot_mr;
63 struct ib_fast_reg_page_list *prot_frpl;
64 struct ib_mr *sig_mr;
65};
66
Vu Pham59464ef2013-08-28 23:23:35 +030067struct fast_reg_descriptor {
Sagi Grimbergd3e125d2014-02-19 17:50:23 +020068 struct list_head list;
69 struct ib_mr *data_mr;
70 struct ib_fast_reg_page_list *data_frpl;
71 u8 ind;
72 struct pi_context *pi_ctx;
Vu Pham59464ef2013-08-28 23:23:35 +030073};
74
Sagi Grimberge3d7e4c2014-02-19 17:50:22 +020075struct isert_data_buf {
76 struct scatterlist *sg;
77 int nents;
78 u32 sg_off;
79 u32 len; /* cur_rdma_length */
80 u32 offset;
81 unsigned int dma_nents;
82 enum dma_data_direction dma_dir;
83};
84
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -080085struct isert_rdma_wr {
86 struct list_head wr_list;
87 struct isert_cmd *isert_cmd;
88 enum iser_ib_op_code iser_ib_op;
89 struct ib_sge *ib_sge;
Vu Pham59464ef2013-08-28 23:23:35 +030090 struct ib_sge s_ib_sge;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -080091 int send_wr_num;
92 struct ib_send_wr *send_wr;
Vu Pham59464ef2013-08-28 23:23:35 +030093 struct ib_send_wr s_send_wr;
Sagi Grimberge3d7e4c2014-02-19 17:50:22 +020094 struct isert_data_buf data;
Sagi Grimberg9e961ae2014-02-19 17:50:25 +020095 struct isert_data_buf prot;
Vu Pham59464ef2013-08-28 23:23:35 +030096 struct fast_reg_descriptor *fr_desc;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -080097};
98
99struct isert_cmd {
100 uint32_t read_stag;
101 uint32_t write_stag;
102 uint64_t read_va;
103 uint64_t write_va;
Nicholas Bellingerdbbc5d12013-07-03 19:39:37 -0700104 u64 pdu_buf_dma;
105 u32 pdu_buf_len;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800106 u32 read_va_off;
107 u32 write_va_off;
108 u32 rdma_wr_num;
109 struct isert_conn *conn;
Nicholas Bellingerd703ce22013-08-17 14:27:56 -0700110 struct iscsi_cmd *iscsi_cmd;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800111 struct iser_tx_desc tx_desc;
112 struct isert_rdma_wr rdma_wr;
113 struct work_struct comp_work;
114};
115
116struct isert_device;
117
118struct isert_conn {
119 enum iser_conn_state state;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800120 int post_recv_buf_count;
121 atomic_t post_send_buf_count;
122 u32 responder_resources;
123 u32 initiator_depth;
124 u32 max_sge;
125 char *login_buf;
126 char *login_req_buf;
127 char *login_rsp_buf;
128 u64 login_req_dma;
Sagi Grimberg2371e5d2014-12-02 16:57:21 +0200129 int login_req_len;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800130 u64 login_rsp_dma;
131 unsigned int conn_rx_desc_head;
132 struct iser_rx_desc *conn_rx_descs;
133 struct ib_recv_wr conn_rx_wr[ISERT_MIN_POSTED_RX];
134 struct iscsi_conn *conn;
135 struct list_head conn_accept_node;
136 struct completion conn_login_comp;
Sagi Grimberg2371e5d2014-12-02 16:57:21 +0200137 struct completion login_req_comp;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800138 struct iser_tx_desc conn_login_tx_desc;
139 struct rdma_cm_id *conn_cm_id;
140 struct ib_pd *conn_pd;
141 struct ib_mr *conn_mr;
142 struct ib_qp *conn_qp;
143 struct isert_device *conn_device;
Nicholas Bellingerb2cb9642013-07-03 03:05:37 -0700144 struct mutex conn_mutex;
Nicholas Bellingerdefd8842014-02-03 12:54:39 -0800145 struct completion conn_wait;
146 struct completion conn_wait_comp_err;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800147 struct kref conn_kref;
Sagi Grimberga3a5a822014-01-09 18:40:50 +0200148 struct list_head conn_fr_pool;
149 int conn_fr_pool_size;
150 /* lock to protect fastreg pool */
Vu Pham59464ef2013-08-28 23:23:35 +0300151 spinlock_t conn_lock;
Sagi Grimbergb02efbf2014-12-02 16:57:29 +0200152 struct work_struct release_work;
Nicholas Bellinger95b60f02013-11-05 13:16:12 -0800153#define ISERT_COMP_BATCH_COUNT 8
154 int conn_comp_batch;
155 struct llist_head conn_comp_llist;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800156};
157
158#define ISERT_MAX_CQ 64
159
160struct isert_cq_desc {
161 struct isert_device *device;
162 int cq_index;
163 struct work_struct cq_rx_work;
164 struct work_struct cq_tx_work;
165};
166
167struct isert_device {
Sagi Grimberga3a5a822014-01-09 18:40:50 +0200168 int use_fastreg;
Sagi Grimbergd3e125d2014-02-19 17:50:23 +0200169 bool pi_capable;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800170 int cqs_used;
171 int refcount;
172 int cq_active_qps[ISERT_MAX_CQ];
173 struct ib_device *ib_device;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800174 struct ib_cq *dev_rx_cq[ISERT_MAX_CQ];
175 struct ib_cq *dev_tx_cq[ISERT_MAX_CQ];
176 struct isert_cq_desc *cq_desc;
177 struct list_head dev_node;
Vu Pham59464ef2013-08-28 23:23:35 +0300178 struct ib_device_attr dev_attr;
Vu Phamd40945d2013-08-28 23:23:34 +0300179 int (*reg_rdma_mem)(struct iscsi_conn *conn,
180 struct iscsi_cmd *cmd,
181 struct isert_rdma_wr *wr);
182 void (*unreg_rdma_mem)(struct isert_cmd *isert_cmd,
183 struct isert_conn *isert_conn);
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800184};
185
186struct isert_np {
Sagi Grimbergca6c1d82014-12-02 16:57:27 +0200187 struct iscsi_np *np;
Sagi Grimberg531b7bf2014-04-29 13:13:45 +0300188 struct semaphore np_sem;
Nicholas Bellingerb8d26b32013-03-07 00:56:19 -0800189 struct rdma_cm_id *np_cm_id;
190 struct mutex np_accept_mutex;
191 struct list_head np_accept_list;
192 struct completion np_login_comp;
193};