Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
iscsi_iser.h
Go to the documentation of this file.
1 /*
2  * iSER transport for the Open iSCSI Initiator & iSER transport internals
3  *
4  * Copyright (C) 2004 Dmitry Yusupov
5  * Copyright (C) 2004 Alex Aizman
6  * Copyright (C) 2005 Mike Christie
7  * based on code maintained by [email protected]
8  *
9  * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved.
10  * Copyright (c) 2005, 2006 Cisco Systems. All rights reserved.
11  *
12  * This software is available to you under a choice of one of two
13  * licenses. You may choose to be licensed under the terms of the GNU
14  * General Public License (GPL) Version 2, available from the file
15  * COPYING in the main directory of this source tree, or the
16  * OpenIB.org BSD license below:
17  *
18  * Redistribution and use in source and binary forms, with or
19  * without modification, are permitted provided that the following
20  * conditions are met:
21  *
22  * - Redistributions of source code must retain the above
23  * copyright notice, this list of conditions and the following
24  * disclaimer.
25  *
26  * - Redistributions in binary form must reproduce the above
27  * copyright notice, this list of conditions and the following
28  * disclaimer in the documentation and/or other materials
29  * provided with the distribution.
30  *
31  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
32  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
33  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
34  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
35  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
36  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
37  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
38  * SOFTWARE.
39  */
40 #ifndef __ISCSI_ISER_H__
41 #define __ISCSI_ISER_H__
42 
43 #include <linux/types.h>
44 #include <linux/net.h>
45 #include <scsi/libiscsi.h>
47 
48 #include <linux/interrupt.h>
49 #include <linux/wait.h>
50 #include <linux/sched.h>
51 #include <linux/list.h>
52 #include <linux/slab.h>
53 #include <linux/dma-mapping.h>
54 #include <linux/mutex.h>
55 #include <linux/mempool.h>
56 #include <linux/uio.h>
57 
58 #include <linux/socket.h>
59 #include <linux/in.h>
60 #include <linux/in6.h>
61 
62 #include <rdma/ib_verbs.h>
63 #include <rdma/ib_fmr_pool.h>
64 #include <rdma/rdma_cm.h>
65 
66 #define DRV_NAME "iser"
67 #define PFX DRV_NAME ": "
68 #define DRV_VER "0.1"
69 #define DRV_DATE "May 7th, 2006"
70 
71 #define iser_dbg(fmt, arg...) \
72  do { \
73  if (iser_debug_level > 1) \
74  printk(KERN_DEBUG PFX "%s:" fmt,\
75  __func__ , ## arg); \
76  } while (0)
77 
78 #define iser_warn(fmt, arg...) \
79  do { \
80  if (iser_debug_level > 0) \
81  printk(KERN_DEBUG PFX "%s:" fmt,\
82  __func__ , ## arg); \
83  } while (0)
84 
85 #define iser_err(fmt, arg...) \
86  do { \
87  printk(KERN_ERR PFX "%s:" fmt, \
88  __func__ , ## arg); \
89  } while (0)
90 
91 #define SHIFT_4K 12
92 #define SIZE_4K (1ULL << SHIFT_4K)
93 #define MASK_4K (~(SIZE_4K-1))
94 
95  /* support up to 512KB in one RDMA */
96 #define ISCSI_ISER_SG_TABLESIZE (0x80000 >> SHIFT_4K)
97 #define ISER_DEF_CMD_PER_LUN 128
98 
99 /* QP settings */
100 /* Maximal bounds on received asynchronous PDUs */
101 #define ISER_MAX_RX_MISC_PDUS 4 /* NOOP_IN(2) , ASYNC_EVENT(2) */
102 
103 #define ISER_MAX_TX_MISC_PDUS 6 /* NOOP_OUT(2), TEXT(1), *
104  * SCSI_TMFUNC(2), LOGOUT(1) */
106 #define ISER_QP_MAX_RECV_DTOS (ISCSI_DEF_XMIT_CMDS_MAX)
108 #define ISER_MIN_POSTED_RX (ISCSI_DEF_XMIT_CMDS_MAX >> 2)
109 
110 /* the max TX (send) WR supported by the iSER QP is defined by *
111  * max_send_wr = T * (1 + D) + C ; D is how many inflight dataouts we expect *
112  * to have at max for SCSI command. The tx posting & completion handling code *
113  * supports -EAGAIN scheme where tx is suspended till the QP has room for more *
114  * send WR. D=8 comes from 64K/8K */
116 #define ISER_INFLIGHT_DATAOUTS 8
118 #define ISER_QP_MAX_REQ_DTOS (ISCSI_DEF_XMIT_CMDS_MAX * \
119  (1 + ISER_INFLIGHT_DATAOUTS) + \
120  ISER_MAX_TX_MISC_PDUS + \
121  ISER_MAX_RX_MISC_PDUS)
123 #define ISER_VER 0x10
124 #define ISER_WSV 0x08
125 #define ISER_RSV 0x04
127 struct iser_hdr {
129  u8 rsvd[3];
130  __be32 write_stag; /* write rkey */
132  __be32 read_stag; /* read rkey */
133  __be64 read_va;
134 } __attribute__((packed));
136 /* Constant PDU lengths calculations */
137 #define ISER_HEADERS_LEN (sizeof(struct iser_hdr) + sizeof(struct iscsi_hdr))
139 #define ISER_RECV_DATA_SEG_LEN 128
140 #define ISER_RX_PAYLOAD_SIZE (ISER_HEADERS_LEN + ISER_RECV_DATA_SEG_LEN)
141 #define ISER_RX_LOGIN_SIZE (ISER_HEADERS_LEN + ISCSI_DEF_MAX_RECV_SEG_LEN)
142 
143 /* Length of an object name string */
144 #define ISER_OBJECT_NAME_SIZE 64
147  ISER_CONN_INIT, /* descriptor allocd, no conn */
148  ISER_CONN_PENDING, /* in the process of being established */
149  ISER_CONN_UP, /* up and running */
150  ISER_CONN_TERMINATING, /* in the process of being terminated */
151  ISER_CONN_DOWN, /* shut down */
153 };
159 };
162  ISER_DIR_IN = 0, /* to initiator */
163  ISER_DIR_OUT, /* from initiator */
165 };
168  void *buf; /* pointer to the sg list */
169  unsigned int size; /* num entries of this sg */
170  unsigned long data_len; /* total data len */
171  unsigned int dma_nents; /* returned by dma_map_sg */
172  char *copy_buf; /* allocated copy buf for SGs unaligned *
173  * for rdma which are copied */
174  struct scatterlist sg_single; /* SG-ified clone of a non SG SC or *
175  * unaligned SG */
176  };
177 
178 /* fwd declarations */
179 struct iser_device;
180 struct iser_cq_desc;
181 struct iscsi_iser_conn;
182 struct iscsi_iser_task;
183 struct iscsi_endpoint;
185 struct iser_mem_reg {
190  void *mem_h;
191  int is_fmr;
192 };
195  struct iser_mem_reg reg; /* memory registration info */
196  void *virt_addr;
197  struct iser_device *device; /* device->device for dma_unmap */
198  enum dma_data_direction direction; /* direction for dma_unmap */
199  unsigned int data_size;
200 };
206 };
208 struct iser_tx_desc {
212  u64 dma_addr;
213  /* sg[0] points to iser/iscsi headers, sg[1] optionally points to either
214  of immediate data, unsolicited data-out or control (login,text) */
215  struct ib_sge tx_sg[2];
216  int num_sge;
217 };
219 #define ISER_RX_PAD_SIZE (256 - (ISER_RX_PAYLOAD_SIZE + \
220  sizeof(u64) + sizeof(struct ib_sge)))
221 struct iser_rx_desc {
226  struct ib_sge rx_sg;
227  char pad[ISER_RX_PAD_SIZE];
228 } __attribute__((packed));
230 #define ISER_MAX_CQ 4
232 struct iser_device {
234  struct ib_pd *pd;
237  struct ib_mr *mr;
240  struct list_head ig_list; /* entry in ig devices list */
241  int refcount;
243  int cqs_used;
244  struct iser_cq_desc *cq_desc;
245 };
247 struct iser_conn {
248  struct iscsi_iser_conn *iser_conn; /* iser conn for upcalls */
250  enum iser_ib_conn_state state; /* rdma connection state */
252  spinlock_t lock; /* used for state changes */
253  struct iser_device *device; /* device context */
254  struct rdma_cm_id *cma_id; /* CMA ID */
255  struct ib_qp *qp; /* QP */
256  struct ib_fmr_pool *fmr_pool; /* pool of IB FMRs */
257  wait_queue_head_t wait; /* waitq for conn/disconn */
258  int post_recv_buf_count; /* posted rx count */
259  atomic_t post_send_buf_count; /* posted tx count */
261  struct iser_page_vec *page_vec; /* represents SG to fmr maps*
262  * maps serialized as tx is*/
263  struct list_head conn_list; /* entry in ig conn list */
265  char *login_buf;
268  unsigned int rx_desc_head;
271 };
274  struct iscsi_conn *iscsi_conn;/* ptr to iscsi conn */
275  struct iser_conn *ib_conn; /* iSER IB conn */
276 };
282  int command_sent; /* set if command sent */
283  int dir[ISER_DIRS_NUM]; /* set if dir use*/
284  struct iser_regd_buf rdma_regd[ISER_DIRS_NUM];/* regd rdma buf */
285  struct iser_data_buf data[ISER_DIRS_NUM]; /* orig. data des*/
286  struct iser_data_buf data_copy[ISER_DIRS_NUM];/* contig. copy */
287 };
291  int length;
292  int offset;
293  int data_size;
294 };
296 struct iser_cq_desc {
298  int cq_index;
299 };
301 struct iser_global {
303  struct list_head device_list; /* all iSER devices */
305  struct list_head connlist; /* all iSER IB connections */
307  struct kmem_cache *desc_cache;
308 };
309 
310 extern struct iser_global ig;
311 extern int iser_debug_level;
312 
313 /* allocate connection resources needed for rdma functionality */
315 
316 int iser_send_control(struct iscsi_conn *conn,
317  struct iscsi_task *task);
318 
319 int iser_send_command(struct iscsi_conn *conn,
320  struct iscsi_task *task);
321 
322 int iser_send_data_out(struct iscsi_conn *conn,
323  struct iscsi_task *task,
324  struct iscsi_data *hdr);
325 
326 void iscsi_iser_recv(struct iscsi_conn *conn,
327  struct iscsi_hdr *hdr,
328  char *rx_data,
329  int rx_data_len);
330 
331 void iser_conn_init(struct iser_conn *ib_conn);
332 
333 void iser_conn_get(struct iser_conn *ib_conn);
334 
335 int iser_conn_put(struct iser_conn *ib_conn, int destroy_cma_id_allowed);
336 
337 void iser_conn_terminate(struct iser_conn *ib_conn);
338 
340  unsigned long dto_xfer_len,
341  struct iser_conn *ib_conn);
342 
343 void iser_snd_completion(struct iser_tx_desc *desc, struct iser_conn *ib_conn);
344 
346 
348 
349 void iser_free_rx_descriptors(struct iser_conn *ib_conn);
350 
352  enum iser_data_dir cmd_dir);
353 
355  enum iser_data_dir cmd_dir);
356 
357 int iser_connect(struct iser_conn *ib_conn,
358  struct sockaddr_in *src_addr,
359  struct sockaddr_in *dst_addr,
360  int non_blocking);
361 
362 int iser_reg_page_vec(struct iser_conn *ib_conn,
363  struct iser_page_vec *page_vec,
364  struct iser_mem_reg *mem_reg);
365 
366 void iser_unreg_mem(struct iser_mem_reg *mem_reg);
367 
368 int iser_post_recvl(struct iser_conn *ib_conn);
369 int iser_post_recvm(struct iser_conn *ib_conn, int count);
370 int iser_post_send(struct iser_conn *ib_conn, struct iser_tx_desc *tx_desc);
371 
372 int iser_dma_map_task_data(struct iscsi_iser_task *iser_task,
373  struct iser_data_buf *data,
374  enum iser_data_dir iser_dir,
375  enum dma_data_direction dma_dir);
376 
377 void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task);
379  struct iser_tx_desc *tx_desc);
380 int iser_alloc_rx_descriptors(struct iser_conn *ib_conn);
381 #endif