cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ib_srp.h (8844B)


      1/*
      2 * Copyright (c) 2005 Cisco Systems.  All rights reserved.
      3 *
      4 * This software is available to you under a choice of one of two
      5 * licenses.  You may choose to be licensed under the terms of the GNU
      6 * General Public License (GPL) Version 2, available from the file
      7 * COPYING in the main directory of this source tree, or the
      8 * OpenIB.org BSD license below:
      9 *
     10 *     Redistribution and use in source and binary forms, with or
     11 *     without modification, are permitted provided that the following
     12 *     conditions are met:
     13 *
     14 *      - Redistributions of source code must retain the above
     15 *        copyright notice, this list of conditions and the following
     16 *        disclaimer.
     17 *
     18 *      - Redistributions in binary form must reproduce the above
     19 *        copyright notice, this list of conditions and the following
     20 *        disclaimer in the documentation and/or other materials
     21 *        provided with the distribution.
     22 *
     23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
     27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
     28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     30 * SOFTWARE.
     31 */
     32
     33#ifndef IB_SRP_H
     34#define IB_SRP_H
     35
     36#include <linux/types.h>
     37#include <linux/list.h>
     38#include <linux/mutex.h>
     39#include <linux/scatterlist.h>
     40
     41#include <scsi/scsi_host.h>
     42#include <scsi/scsi_cmnd.h>
     43
     44#include <rdma/ib_verbs.h>
     45#include <rdma/ib_sa.h>
     46#include <rdma/ib_cm.h>
     47#include <rdma/rdma_cm.h>
     48
     49enum {
     50	SRP_PATH_REC_TIMEOUT_MS	= 1000,
     51	SRP_ABORT_TIMEOUT_MS	= 5000,
     52
     53	SRP_PORT_REDIRECT	= 1,
     54	SRP_DLID_REDIRECT	= 2,
     55	SRP_STALE_CONN		= 3,
     56
     57	SRP_DEF_SG_TABLESIZE	= 12,
     58
     59	SRP_DEFAULT_QUEUE_SIZE	= 1 << 6,
     60	SRP_RSP_SQ_SIZE		= 1,
     61	SRP_TSK_MGMT_SQ_SIZE	= 1,
     62	SRP_DEFAULT_CMD_SQ_SIZE = SRP_DEFAULT_QUEUE_SIZE - SRP_RSP_SQ_SIZE -
     63				  SRP_TSK_MGMT_SQ_SIZE,
     64
     65	SRP_TAG_NO_REQ		= ~0U,
     66	SRP_TAG_TSK_MGMT	= 1U << 31,
     67
     68	SRP_MAX_PAGES_PER_MR	= 512,
     69
     70	SRP_MAX_ADD_CDB_LEN	= 16,
     71
     72	SRP_MAX_IMM_SGE		= 2,
     73	SRP_MAX_SGE		= SRP_MAX_IMM_SGE + 1,
     74	/*
     75	 * Choose the immediate data offset such that a 32 byte CDB still fits.
     76	 */
     77	SRP_IMM_DATA_OFFSET	= sizeof(struct srp_cmd) +
     78				  SRP_MAX_ADD_CDB_LEN +
     79				  sizeof(struct srp_imm_buf),
     80};
     81
     82enum srp_target_state {
     83	SRP_TARGET_SCANNING,
     84	SRP_TARGET_LIVE,
     85	SRP_TARGET_REMOVED,
     86};
     87
     88enum srp_iu_type {
     89	SRP_IU_CMD,
     90	SRP_IU_TSK_MGMT,
     91	SRP_IU_RSP,
     92};
     93
     94/*
     95 * RDMA adapter in the initiator system.
     96 *
     97 * @dev_list: List of RDMA ports associated with this RDMA adapter (srp_host).
     98 * @mr_page_mask: HCA memory registration page mask.
     99 * @mr_page_size: HCA memory registration page size.
    100 * @mr_max_size: Maximum size in bytes of a single FR registration request.
    101 */
    102struct srp_device {
    103	struct list_head	dev_list;
    104	struct ib_device       *dev;
    105	struct ib_pd	       *pd;
    106	u32			global_rkey;
    107	u64			mr_page_mask;
    108	int			mr_page_size;
    109	int			mr_max_size;
    110	int			max_pages_per_mr;
    111	bool			has_fr;
    112	bool			use_fast_reg;
    113};
    114
    115/*
    116 * One port of an RDMA adapter in the initiator system.
    117 *
    118 * @target_list: List of connected target ports (struct srp_target_port).
    119 * @target_lock: Protects @target_list.
    120 */
    121struct srp_host {
    122	struct srp_device      *srp_dev;
    123	u8			port;
    124	struct device		dev;
    125	struct list_head	target_list;
    126	spinlock_t		target_lock;
    127	struct completion	released;
    128	struct list_head	list;
    129	struct mutex		add_target_mutex;
    130};
    131
    132struct srp_request {
    133	struct scsi_cmnd       *scmnd;
    134	struct srp_iu	       *cmd;
    135	struct srp_fr_desc     **fr_list;
    136	struct srp_direct_buf  *indirect_desc;
    137	dma_addr_t		indirect_dma_addr;
    138	short			nmdesc;
    139	struct ib_cqe		reg_cqe;
    140};
    141
    142/**
    143 * struct srp_rdma_ch
    144 * @comp_vector: Completion vector used by this RDMA channel.
    145 * @max_it_iu_len: Maximum initiator-to-target information unit length.
    146 * @max_ti_iu_len: Maximum target-to-initiator information unit length.
    147 */
    148struct srp_rdma_ch {
    149	/* These are RW in the hot path, and commonly used together */
    150	struct list_head	free_tx;
    151	spinlock_t		lock;
    152	s32			req_lim;
    153
    154	/* These are read-only in the hot path */
    155	struct srp_target_port *target ____cacheline_aligned_in_smp;
    156	struct ib_cq	       *send_cq;
    157	struct ib_cq	       *recv_cq;
    158	struct ib_qp	       *qp;
    159	struct srp_fr_pool     *fr_pool;
    160	uint32_t		max_it_iu_len;
    161	uint32_t		max_ti_iu_len;
    162	u8			max_imm_sge;
    163	bool			use_imm_data;
    164
    165	/* Everything above this point is used in the hot path of
    166	 * command processing. Try to keep them packed into cachelines.
    167	 */
    168
    169	struct completion	done;
    170	int			status;
    171
    172	union {
    173		struct ib_cm {
    174			struct sa_path_rec	path;
    175			struct ib_sa_query	*path_query;
    176			int			path_query_id;
    177			struct ib_cm_id		*cm_id;
    178		} ib_cm;
    179		struct rdma_cm {
    180			struct rdma_cm_id	*cm_id;
    181		} rdma_cm;
    182	};
    183
    184	struct srp_iu	      **tx_ring;
    185	struct srp_iu	      **rx_ring;
    186	int			comp_vector;
    187
    188	u64			tsk_mgmt_tag;
    189	struct completion	tsk_mgmt_done;
    190	u8			tsk_mgmt_status;
    191	bool			connected;
    192};
    193
    194/**
    195 * struct srp_target_port - RDMA port in the SRP target system
    196 * @comp_vector: Completion vector used by the first RDMA channel created for
    197 *   this target port.
    198 */
    199struct srp_target_port {
    200	/* read and written in the hot path */
    201	spinlock_t		lock;
    202
    203	/* read only in the hot path */
    204	u32			global_rkey;
    205	struct srp_rdma_ch	*ch;
    206	struct net		*net;
    207	u32			ch_count;
    208	u32			lkey;
    209	enum srp_target_state	state;
    210	uint32_t		max_it_iu_size;
    211	unsigned int		cmd_sg_cnt;
    212	unsigned int		indirect_size;
    213	bool			allow_ext_sg;
    214
    215	/* other member variables */
    216	union ib_gid		sgid;
    217	__be64			id_ext;
    218	__be64			ioc_guid;
    219	__be64			initiator_ext;
    220	u16			io_class;
    221	struct srp_host	       *srp_host;
    222	struct Scsi_Host       *scsi_host;
    223	struct srp_rport       *rport;
    224	char			target_name[32];
    225	unsigned int		scsi_id;
    226	unsigned int		sg_tablesize;
    227	unsigned int		target_can_queue;
    228	int			mr_pool_size;
    229	int			mr_per_cmd;
    230	int			queue_size;
    231	int			comp_vector;
    232	int			tl_retry_count;
    233
    234	bool			using_rdma_cm;
    235
    236	union {
    237		struct {
    238			__be64			service_id;
    239			union ib_gid		orig_dgid;
    240			__be16			pkey;
    241		} ib_cm;
    242		struct {
    243			union {
    244				struct sockaddr_in	ip4;
    245				struct sockaddr_in6	ip6;
    246				struct sockaddr		sa;
    247				struct sockaddr_storage ss;
    248			} src;
    249			union {
    250				struct sockaddr_in	ip4;
    251				struct sockaddr_in6	ip6;
    252				struct sockaddr		sa;
    253				struct sockaddr_storage ss;
    254			} dst;
    255			bool src_specified;
    256		} rdma_cm;
    257	};
    258
    259	u32			rq_tmo_jiffies;
    260
    261	int			zero_req_lim;
    262
    263	struct work_struct	tl_err_work;
    264	struct work_struct	remove_work;
    265
    266	struct list_head	list;
    267	bool			qp_in_error;
    268};
    269
    270struct srp_iu {
    271	struct list_head	list;
    272	u64			dma;
    273	void		       *buf;
    274	size_t			size;
    275	enum dma_data_direction	direction;
    276	u32			num_sge;
    277	struct ib_sge		sge[SRP_MAX_SGE];
    278	struct ib_cqe		cqe;
    279};
    280
    281/**
    282 * struct srp_fr_desc - fast registration work request arguments
    283 * @entry: Entry in srp_fr_pool.free_list.
    284 * @mr:    Memory region.
    285 * @frpl:  Fast registration page list.
    286 */
    287struct srp_fr_desc {
    288	struct list_head		entry;
    289	struct ib_mr			*mr;
    290};
    291
    292/**
    293 * struct srp_fr_pool - pool of fast registration descriptors
    294 *
    295 * An entry is available for allocation if and only if it occurs in @free_list.
    296 *
    297 * @size:      Number of descriptors in this pool.
    298 * @max_page_list_len: Maximum fast registration work request page list length.
    299 * @lock:      Protects free_list.
    300 * @free_list: List of free descriptors.
    301 * @desc:      Fast registration descriptor pool.
    302 */
    303struct srp_fr_pool {
    304	int			size;
    305	int			max_page_list_len;
    306	spinlock_t		lock;
    307	struct list_head	free_list;
    308	struct srp_fr_desc	desc[];
    309};
    310
    311/**
    312 * struct srp_map_state - per-request DMA memory mapping state
    313 * @desc:	    Pointer to the element of the SRP buffer descriptor array
    314 *		    that is being filled in.
    315 * @pages:	    Array with DMA addresses of pages being considered for
    316 *		    memory registration.
    317 * @base_dma_addr:  DMA address of the first page that has not yet been mapped.
    318 * @dma_len:	    Number of bytes that will be registered with the next FR
    319 *                  memory registration call.
    320 * @total_len:	    Total number of bytes in the sg-list being mapped.
    321 * @npages:	    Number of page addresses in the pages[] array.
    322 * @nmdesc:	    Number of FR memory descriptors used for mapping.
    323 * @ndesc:	    Number of SRP buffer descriptors that have been filled in.
    324 */
    325struct srp_map_state {
    326	union {
    327		struct {
    328			struct srp_fr_desc **next;
    329			struct srp_fr_desc **end;
    330		} fr;
    331		struct {
    332			void		   **next;
    333			void		   **end;
    334		} gen;
    335	};
    336	struct srp_direct_buf  *desc;
    337	union {
    338		u64			*pages;
    339		struct scatterlist	*sg;
    340	};
    341	dma_addr_t		base_dma_addr;
    342	u32			dma_len;
    343	u32			total_len;
    344	unsigned int		npages;
    345	unsigned int		nmdesc;
    346	unsigned int		ndesc;
    347};
    348
    349#endif /* IB_SRP_H */