siw.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728
  1. /* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */
  2. /* Authors: Bernard Metzler <[email protected]> */
  3. /* Copyright (c) 2008-2019, IBM Corporation */
  4. #ifndef _SIW_H
  5. #define _SIW_H
  6. #include <rdma/ib_verbs.h>
  7. #include <rdma/restrack.h>
  8. #include <linux/socket.h>
  9. #include <linux/skbuff.h>
  10. #include <crypto/hash.h>
  11. #include <linux/crc32.h>
  12. #include <linux/crc32c.h>
  13. #include <rdma/siw-abi.h>
  14. #include "iwarp.h"
  15. #define SIW_VENDOR_ID 0x626d74 /* ascii 'bmt' for now */
  16. #define SIW_VENDORT_PART_ID 0
  17. #define SIW_MAX_QP (1024 * 100)
  18. #define SIW_MAX_QP_WR (1024 * 32)
  19. #define SIW_MAX_ORD_QP 128
  20. #define SIW_MAX_IRD_QP 128
  21. #define SIW_MAX_SGE_PBL 256 /* max num sge's for PBL */
  22. #define SIW_MAX_SGE_RD 1 /* iwarp limitation. we could relax */
  23. #define SIW_MAX_CQ (1024 * 100)
  24. #define SIW_MAX_CQE (SIW_MAX_QP_WR * 100)
  25. #define SIW_MAX_MR (SIW_MAX_QP * 10)
  26. #define SIW_MAX_PD SIW_MAX_QP
  27. #define SIW_MAX_MW 0 /* to be set if MW's are supported */
  28. #define SIW_MAX_SRQ SIW_MAX_QP
  29. #define SIW_MAX_SRQ_WR (SIW_MAX_QP_WR * 10)
  30. #define SIW_MAX_CONTEXT SIW_MAX_PD
  31. /* Min number of bytes for using zero copy transmit */
  32. #define SENDPAGE_THRESH PAGE_SIZE
  33. /* Maximum number of frames which can be send in one SQ processing */
  34. #define SQ_USER_MAXBURST 100
  35. /* Maximum number of consecutive IRQ elements which get served
  36. * if SQ has pending work. Prevents starving local SQ processing
  37. * by serving peer Read Requests.
  38. */
  39. #define SIW_IRQ_MAXBURST_SQ_ACTIVE 4
  40. struct siw_dev_cap {
  41. int max_qp;
  42. int max_qp_wr;
  43. int max_ord; /* max. outbound read queue depth */
  44. int max_ird; /* max. inbound read queue depth */
  45. int max_sge;
  46. int max_sge_rd;
  47. int max_cq;
  48. int max_cqe;
  49. int max_mr;
  50. int max_pd;
  51. int max_mw;
  52. int max_srq;
  53. int max_srq_wr;
  54. int max_srq_sge;
  55. };
  56. struct siw_pd {
  57. struct ib_pd base_pd;
  58. };
  59. struct siw_device {
  60. struct ib_device base_dev;
  61. struct net_device *netdev;
  62. struct siw_dev_cap attrs;
  63. u32 vendor_part_id;
  64. int numa_node;
  65. char raw_gid[ETH_ALEN];
  66. /* physical port state (only one port per device) */
  67. enum ib_port_state state;
  68. spinlock_t lock;
  69. struct xarray qp_xa;
  70. struct xarray mem_xa;
  71. struct list_head cep_list;
  72. struct list_head qp_list;
  73. /* active objects statistics to enforce limits */
  74. atomic_t num_qp;
  75. atomic_t num_cq;
  76. atomic_t num_pd;
  77. atomic_t num_mr;
  78. atomic_t num_srq;
  79. atomic_t num_ctx;
  80. struct work_struct netdev_down;
  81. };
  82. struct siw_ucontext {
  83. struct ib_ucontext base_ucontext;
  84. struct siw_device *sdev;
  85. };
  86. /*
  87. * The RDMA core does not define LOCAL_READ access, which is always
  88. * enabled implictely.
  89. */
  90. #define IWARP_ACCESS_MASK \
  91. (IB_ACCESS_LOCAL_WRITE | IB_ACCESS_REMOTE_WRITE | \
  92. IB_ACCESS_REMOTE_READ)
  93. /*
  94. * siw presentation of user memory registered as source
  95. * or target of RDMA operations.
  96. */
  97. struct siw_page_chunk {
  98. struct page **plist;
  99. };
  100. struct siw_umem {
  101. struct siw_page_chunk *page_chunk;
  102. int num_pages;
  103. bool writable;
  104. u64 fp_addr; /* First page base address */
  105. struct mm_struct *owning_mm;
  106. };
  107. struct siw_pble {
  108. dma_addr_t addr; /* Address of assigned buffer */
  109. unsigned int size; /* Size of this entry */
  110. unsigned long pbl_off; /* Total offset from start of PBL */
  111. };
  112. struct siw_pbl {
  113. unsigned int num_buf;
  114. unsigned int max_buf;
  115. struct siw_pble pbe[];
  116. };
  117. /*
  118. * Generic memory representation for registered siw memory.
  119. * Memory lookup always via higher 24 bit of STag (STag index).
  120. */
  121. struct siw_mem {
  122. struct siw_device *sdev;
  123. struct kref ref;
  124. u64 va; /* VA of memory */
  125. u64 len; /* length of the memory buffer in bytes */
  126. u32 stag; /* iWarp memory access steering tag */
  127. u8 stag_valid; /* VALID or INVALID */
  128. u8 is_pbl; /* PBL or user space mem */
  129. u8 is_mw; /* Memory Region or Memory Window */
  130. enum ib_access_flags perms; /* local/remote READ & WRITE */
  131. union {
  132. struct siw_umem *umem;
  133. struct siw_pbl *pbl;
  134. void *mem_obj;
  135. };
  136. struct ib_pd *pd;
  137. };
  138. struct siw_mr {
  139. struct ib_mr base_mr;
  140. struct siw_mem *mem;
  141. struct rcu_head rcu;
  142. };
  143. /*
  144. * Error codes for local or remote
  145. * access to registered memory
  146. */
  147. enum siw_access_state {
  148. E_ACCESS_OK,
  149. E_STAG_INVALID,
  150. E_BASE_BOUNDS,
  151. E_ACCESS_PERM,
  152. E_PD_MISMATCH
  153. };
  154. enum siw_wr_state {
  155. SIW_WR_IDLE,
  156. SIW_WR_QUEUED, /* processing has not started yet */
  157. SIW_WR_INPROGRESS /* initiated processing of the WR */
  158. };
  159. /* The WQE currently being processed (RX or TX) */
  160. struct siw_wqe {
  161. /* Copy of applications SQE or RQE */
  162. union {
  163. struct siw_sqe sqe;
  164. struct siw_rqe rqe;
  165. };
  166. struct siw_mem *mem[SIW_MAX_SGE]; /* per sge's resolved mem */
  167. enum siw_wr_state wr_status;
  168. enum siw_wc_status wc_status;
  169. u32 bytes; /* total bytes to process */
  170. u32 processed; /* bytes processed */
  171. };
  172. struct siw_cq {
  173. struct ib_cq base_cq;
  174. spinlock_t lock;
  175. struct siw_cq_ctrl *notify;
  176. struct siw_cqe *queue;
  177. u32 cq_put;
  178. u32 cq_get;
  179. u32 num_cqe;
  180. struct rdma_user_mmap_entry *cq_entry; /* mmap info for CQE array */
  181. u32 id; /* For debugging only */
  182. };
  183. enum siw_qp_state {
  184. SIW_QP_STATE_IDLE,
  185. SIW_QP_STATE_RTR,
  186. SIW_QP_STATE_RTS,
  187. SIW_QP_STATE_CLOSING,
  188. SIW_QP_STATE_TERMINATE,
  189. SIW_QP_STATE_ERROR,
  190. SIW_QP_STATE_COUNT
  191. };
  192. enum siw_qp_flags {
  193. SIW_RDMA_BIND_ENABLED = (1 << 0),
  194. SIW_RDMA_WRITE_ENABLED = (1 << 1),
  195. SIW_RDMA_READ_ENABLED = (1 << 2),
  196. SIW_SIGNAL_ALL_WR = (1 << 3),
  197. SIW_MPA_CRC = (1 << 4),
  198. SIW_QP_IN_DESTROY = (1 << 5)
  199. };
  200. enum siw_qp_attr_mask {
  201. SIW_QP_ATTR_STATE = (1 << 0),
  202. SIW_QP_ATTR_ACCESS_FLAGS = (1 << 1),
  203. SIW_QP_ATTR_LLP_HANDLE = (1 << 2),
  204. SIW_QP_ATTR_ORD = (1 << 3),
  205. SIW_QP_ATTR_IRD = (1 << 4),
  206. SIW_QP_ATTR_SQ_SIZE = (1 << 5),
  207. SIW_QP_ATTR_RQ_SIZE = (1 << 6),
  208. SIW_QP_ATTR_MPA = (1 << 7)
  209. };
  210. struct siw_srq {
  211. struct ib_srq base_srq;
  212. spinlock_t lock;
  213. u32 max_sge;
  214. u32 limit; /* low watermark for async event */
  215. struct siw_rqe *recvq;
  216. u32 rq_put;
  217. u32 rq_get;
  218. u32 num_rqe; /* max # of wqe's allowed */
  219. struct rdma_user_mmap_entry *srq_entry; /* mmap info for SRQ array */
  220. bool armed:1; /* inform user if limit hit */
  221. bool is_kernel_res:1; /* true if kernel client */
  222. };
  223. struct siw_qp_attrs {
  224. enum siw_qp_state state;
  225. u32 sq_size;
  226. u32 rq_size;
  227. u32 orq_size;
  228. u32 irq_size;
  229. u32 sq_max_sges;
  230. u32 rq_max_sges;
  231. enum siw_qp_flags flags;
  232. struct socket *sk;
  233. };
  234. enum siw_tx_ctx {
  235. SIW_SEND_HDR, /* start or continue sending HDR */
  236. SIW_SEND_DATA, /* start or continue sending DDP payload */
  237. SIW_SEND_TRAILER, /* start or continue sending TRAILER */
  238. SIW_SEND_SHORT_FPDU/* send whole FPDU hdr|data|trailer at once */
  239. };
  240. enum siw_rx_state {
  241. SIW_GET_HDR, /* await new hdr or within hdr */
  242. SIW_GET_DATA_START, /* start of inbound DDP payload */
  243. SIW_GET_DATA_MORE, /* continuation of (misaligned) DDP payload */
  244. SIW_GET_TRAILER/* await new trailer or within trailer */
  245. };
  246. struct siw_rx_stream {
  247. struct sk_buff *skb;
  248. int skb_new; /* pending unread bytes in skb */
  249. int skb_offset; /* offset in skb */
  250. int skb_copied; /* processed bytes in skb */
  251. union iwarp_hdr hdr;
  252. struct mpa_trailer trailer;
  253. enum siw_rx_state state;
  254. /*
  255. * For each FPDU, main RX loop runs through 3 stages:
  256. * Receiving protocol headers, placing DDP payload and receiving
  257. * trailer information (CRC + possibly padding).
  258. * Next two variables keep state on receive status of the
  259. * current FPDU part (hdr, data, trailer).
  260. */
  261. int fpdu_part_rcvd; /* bytes in pkt part copied */
  262. int fpdu_part_rem; /* bytes in pkt part not seen */
  263. /*
  264. * Next expected DDP MSN for each QN +
  265. * expected steering tag +
  266. * expected DDP tagget offset (all HBO)
  267. */
  268. u32 ddp_msn[RDMAP_UNTAGGED_QN_COUNT];
  269. u32 ddp_stag;
  270. u64 ddp_to;
  271. u32 inval_stag; /* Stag to be invalidated */
  272. struct shash_desc *mpa_crc_hd;
  273. u8 rx_suspend : 1;
  274. u8 pad : 2; /* # of pad bytes expected */
  275. u8 rdmap_op : 4; /* opcode of current frame */
  276. };
  277. struct siw_rx_fpdu {
  278. /*
  279. * Local destination memory of inbound RDMA operation.
  280. * Valid, according to wqe->wr_status
  281. */
  282. struct siw_wqe wqe_active;
  283. unsigned int pbl_idx; /* Index into current PBL */
  284. unsigned int sge_idx; /* current sge in rx */
  285. unsigned int sge_off; /* already rcvd in curr. sge */
  286. char first_ddp_seg; /* this is the first DDP seg */
  287. char more_ddp_segs; /* more DDP segs expected */
  288. u8 prev_rdmap_op : 4; /* opcode of prev frame */
  289. };
  290. /*
  291. * Shorthands for short packets w/o payload
  292. * to be transmitted more efficient.
  293. */
  294. struct siw_send_pkt {
  295. struct iwarp_send send;
  296. __be32 crc;
  297. };
  298. struct siw_write_pkt {
  299. struct iwarp_rdma_write write;
  300. __be32 crc;
  301. };
  302. struct siw_rreq_pkt {
  303. struct iwarp_rdma_rreq rreq;
  304. __be32 crc;
  305. };
  306. struct siw_rresp_pkt {
  307. struct iwarp_rdma_rresp rresp;
  308. __be32 crc;
  309. };
  310. struct siw_iwarp_tx {
  311. union {
  312. union iwarp_hdr hdr;
  313. /* Generic part of FPDU header */
  314. struct iwarp_ctrl ctrl;
  315. struct iwarp_ctrl_untagged c_untagged;
  316. struct iwarp_ctrl_tagged c_tagged;
  317. /* FPDU headers */
  318. struct iwarp_rdma_write rwrite;
  319. struct iwarp_rdma_rreq rreq;
  320. struct iwarp_rdma_rresp rresp;
  321. struct iwarp_terminate terminate;
  322. struct iwarp_send send;
  323. struct iwarp_send_inv send_inv;
  324. /* complete short FPDUs */
  325. struct siw_send_pkt send_pkt;
  326. struct siw_write_pkt write_pkt;
  327. struct siw_rreq_pkt rreq_pkt;
  328. struct siw_rresp_pkt rresp_pkt;
  329. } pkt;
  330. struct mpa_trailer trailer;
  331. /* DDP MSN for untagged messages */
  332. u32 ddp_msn[RDMAP_UNTAGGED_QN_COUNT];
  333. enum siw_tx_ctx state;
  334. u16 ctrl_len; /* ddp+rdmap hdr */
  335. u16 ctrl_sent;
  336. int burst;
  337. int bytes_unsent; /* ddp payload bytes */
  338. struct shash_desc *mpa_crc_hd;
  339. u8 do_crc : 1; /* do crc for segment */
  340. u8 use_sendpage : 1; /* send w/o copy */
  341. u8 tx_suspend : 1; /* stop sending DDP segs. */
  342. u8 pad : 2; /* # pad in current fpdu */
  343. u8 orq_fence : 1; /* ORQ full or Send fenced */
  344. u8 in_syscall : 1; /* TX out of user context */
  345. u8 zcopy_tx : 1; /* Use TCP_SENDPAGE if possible */
  346. u8 gso_seg_limit; /* Maximum segments for GSO, 0 = unbound */
  347. u16 fpdu_len; /* len of FPDU to tx */
  348. unsigned int tcp_seglen; /* remaining tcp seg space */
  349. struct siw_wqe wqe_active;
  350. int pbl_idx; /* Index into current PBL */
  351. int sge_idx; /* current sge in tx */
  352. u32 sge_off; /* already sent in curr. sge */
  353. };
  354. struct siw_qp {
  355. struct ib_qp base_qp;
  356. struct siw_device *sdev;
  357. struct kref ref;
  358. struct completion qp_free;
  359. struct list_head devq;
  360. int tx_cpu;
  361. struct siw_qp_attrs attrs;
  362. struct siw_cep *cep;
  363. struct rw_semaphore state_lock;
  364. struct ib_pd *pd;
  365. struct siw_cq *scq;
  366. struct siw_cq *rcq;
  367. struct siw_srq *srq;
  368. struct siw_iwarp_tx tx_ctx; /* Transmit context */
  369. spinlock_t sq_lock;
  370. struct siw_sqe *sendq; /* send queue element array */
  371. uint32_t sq_get; /* consumer index into sq array */
  372. uint32_t sq_put; /* kernel prod. index into sq array */
  373. struct llist_node tx_list;
  374. struct siw_sqe *orq; /* outbound read queue element array */
  375. spinlock_t orq_lock;
  376. uint32_t orq_get; /* consumer index into orq array */
  377. uint32_t orq_put; /* shared producer index for ORQ */
  378. struct siw_rx_stream rx_stream;
  379. struct siw_rx_fpdu *rx_fpdu;
  380. struct siw_rx_fpdu rx_tagged;
  381. struct siw_rx_fpdu rx_untagged;
  382. spinlock_t rq_lock;
  383. struct siw_rqe *recvq; /* recv queue element array */
  384. uint32_t rq_get; /* consumer index into rq array */
  385. uint32_t rq_put; /* kernel prod. index into rq array */
  386. struct siw_sqe *irq; /* inbound read queue element array */
  387. uint32_t irq_get; /* consumer index into irq array */
  388. uint32_t irq_put; /* producer index into irq array */
  389. int irq_burst;
  390. struct { /* information to be carried in TERMINATE pkt, if valid */
  391. u8 valid;
  392. u8 in_tx;
  393. u8 layer : 4, etype : 4;
  394. u8 ecode;
  395. } term_info;
  396. struct rdma_user_mmap_entry *sq_entry; /* mmap info for SQE array */
  397. struct rdma_user_mmap_entry *rq_entry; /* mmap info for RQE array */
  398. struct rcu_head rcu;
  399. };
  400. /* helper macros */
  401. #define rx_qp(rx) container_of(rx, struct siw_qp, rx_stream)
  402. #define tx_qp(tx) container_of(tx, struct siw_qp, tx_ctx)
  403. #define tx_wqe(qp) (&(qp)->tx_ctx.wqe_active)
  404. #define rx_wqe(rctx) (&(rctx)->wqe_active)
  405. #define rx_mem(rctx) ((rctx)->wqe_active.mem[0])
  406. #define tx_type(wqe) ((wqe)->sqe.opcode)
  407. #define rx_type(wqe) ((wqe)->rqe.opcode)
  408. #define tx_flags(wqe) ((wqe)->sqe.flags)
  409. struct iwarp_msg_info {
  410. int hdr_len;
  411. struct iwarp_ctrl ctrl;
  412. int (*rx_data)(struct siw_qp *qp);
  413. };
  414. struct siw_user_mmap_entry {
  415. struct rdma_user_mmap_entry rdma_entry;
  416. void *address;
  417. };
  418. /* Global siw parameters. Currently set in siw_main.c */
  419. extern const bool zcopy_tx;
  420. extern const bool try_gso;
  421. extern const bool loopback_enabled;
  422. extern const bool mpa_crc_required;
  423. extern const bool mpa_crc_strict;
  424. extern const bool siw_tcp_nagle;
  425. extern u_char mpa_version;
  426. extern const bool peer_to_peer;
  427. extern struct task_struct *siw_tx_thread[];
  428. extern struct crypto_shash *siw_crypto_shash;
  429. extern struct iwarp_msg_info iwarp_pktinfo[RDMAP_TERMINATE + 1];
  430. /* QP general functions */
  431. int siw_qp_modify(struct siw_qp *qp, struct siw_qp_attrs *attr,
  432. enum siw_qp_attr_mask mask);
  433. int siw_qp_mpa_rts(struct siw_qp *qp, enum mpa_v2_ctrl ctrl);
  434. void siw_qp_llp_close(struct siw_qp *qp);
  435. void siw_qp_cm_drop(struct siw_qp *qp, int schedule);
  436. void siw_send_terminate(struct siw_qp *qp);
  437. void siw_qp_get_ref(struct ib_qp *qp);
  438. void siw_qp_put_ref(struct ib_qp *qp);
  439. int siw_qp_add(struct siw_device *sdev, struct siw_qp *qp);
  440. void siw_free_qp(struct kref *ref);
  441. void siw_init_terminate(struct siw_qp *qp, enum term_elayer layer,
  442. u8 etype, u8 ecode, int in_tx);
  443. enum ddp_ecode siw_tagged_error(enum siw_access_state state);
  444. enum rdmap_ecode siw_rdmap_error(enum siw_access_state state);
  445. void siw_read_to_orq(struct siw_sqe *rreq, struct siw_sqe *sqe);
  446. int siw_sqe_complete(struct siw_qp *qp, struct siw_sqe *sqe, u32 bytes,
  447. enum siw_wc_status status);
  448. int siw_rqe_complete(struct siw_qp *qp, struct siw_rqe *rqe, u32 bytes,
  449. u32 inval_stag, enum siw_wc_status status);
  450. void siw_qp_llp_data_ready(struct sock *sk);
  451. void siw_qp_llp_write_space(struct sock *sk);
  452. /* QP TX path functions */
  453. int siw_run_sq(void *arg);
  454. int siw_qp_sq_process(struct siw_qp *qp);
  455. int siw_sq_start(struct siw_qp *qp);
  456. int siw_activate_tx(struct siw_qp *qp);
  457. void siw_stop_tx_thread(int nr_cpu);
  458. int siw_get_tx_cpu(struct siw_device *sdev);
  459. void siw_put_tx_cpu(int cpu);
  460. /* QP RX path functions */
  461. int siw_proc_send(struct siw_qp *qp);
  462. int siw_proc_rreq(struct siw_qp *qp);
  463. int siw_proc_rresp(struct siw_qp *qp);
  464. int siw_proc_write(struct siw_qp *qp);
  465. int siw_proc_terminate(struct siw_qp *qp);
  466. int siw_tcp_rx_data(read_descriptor_t *rd_desc, struct sk_buff *skb,
  467. unsigned int off, size_t len);
  468. static inline void set_rx_fpdu_context(struct siw_qp *qp, u8 opcode)
  469. {
  470. if (opcode == RDMAP_RDMA_WRITE || opcode == RDMAP_RDMA_READ_RESP)
  471. qp->rx_fpdu = &qp->rx_tagged;
  472. else
  473. qp->rx_fpdu = &qp->rx_untagged;
  474. qp->rx_stream.rdmap_op = opcode;
  475. }
  476. static inline struct siw_ucontext *to_siw_ctx(struct ib_ucontext *base_ctx)
  477. {
  478. return container_of(base_ctx, struct siw_ucontext, base_ucontext);
  479. }
  480. static inline struct siw_qp *to_siw_qp(struct ib_qp *base_qp)
  481. {
  482. return container_of(base_qp, struct siw_qp, base_qp);
  483. }
  484. static inline struct siw_cq *to_siw_cq(struct ib_cq *base_cq)
  485. {
  486. return container_of(base_cq, struct siw_cq, base_cq);
  487. }
  488. static inline struct siw_srq *to_siw_srq(struct ib_srq *base_srq)
  489. {
  490. return container_of(base_srq, struct siw_srq, base_srq);
  491. }
  492. static inline struct siw_device *to_siw_dev(struct ib_device *base_dev)
  493. {
  494. return container_of(base_dev, struct siw_device, base_dev);
  495. }
  496. static inline struct siw_mr *to_siw_mr(struct ib_mr *base_mr)
  497. {
  498. return container_of(base_mr, struct siw_mr, base_mr);
  499. }
  500. static inline struct siw_user_mmap_entry *
  501. to_siw_mmap_entry(struct rdma_user_mmap_entry *rdma_mmap)
  502. {
  503. return container_of(rdma_mmap, struct siw_user_mmap_entry, rdma_entry);
  504. }
  505. static inline struct siw_qp *siw_qp_id2obj(struct siw_device *sdev, int id)
  506. {
  507. struct siw_qp *qp;
  508. rcu_read_lock();
  509. qp = xa_load(&sdev->qp_xa, id);
  510. if (likely(qp && kref_get_unless_zero(&qp->ref))) {
  511. rcu_read_unlock();
  512. return qp;
  513. }
  514. rcu_read_unlock();
  515. return NULL;
  516. }
  517. static inline u32 qp_id(struct siw_qp *qp)
  518. {
  519. return qp->base_qp.qp_num;
  520. }
  521. static inline void siw_qp_get(struct siw_qp *qp)
  522. {
  523. kref_get(&qp->ref);
  524. }
  525. static inline void siw_qp_put(struct siw_qp *qp)
  526. {
  527. kref_put(&qp->ref, siw_free_qp);
  528. }
  529. static inline int siw_sq_empty(struct siw_qp *qp)
  530. {
  531. struct siw_sqe *sqe = &qp->sendq[qp->sq_get % qp->attrs.sq_size];
  532. return READ_ONCE(sqe->flags) == 0;
  533. }
  534. static inline struct siw_sqe *sq_get_next(struct siw_qp *qp)
  535. {
  536. struct siw_sqe *sqe = &qp->sendq[qp->sq_get % qp->attrs.sq_size];
  537. if (READ_ONCE(sqe->flags) & SIW_WQE_VALID)
  538. return sqe;
  539. return NULL;
  540. }
  541. static inline struct siw_sqe *orq_get_current(struct siw_qp *qp)
  542. {
  543. return &qp->orq[qp->orq_get % qp->attrs.orq_size];
  544. }
  545. static inline struct siw_sqe *orq_get_free(struct siw_qp *qp)
  546. {
  547. struct siw_sqe *orq_e = &qp->orq[qp->orq_put % qp->attrs.orq_size];
  548. if (READ_ONCE(orq_e->flags) == 0)
  549. return orq_e;
  550. return NULL;
  551. }
  552. static inline int siw_orq_empty(struct siw_qp *qp)
  553. {
  554. return qp->orq[qp->orq_get % qp->attrs.orq_size].flags == 0 ? 1 : 0;
  555. }
  556. static inline struct siw_sqe *irq_alloc_free(struct siw_qp *qp)
  557. {
  558. struct siw_sqe *irq_e = &qp->irq[qp->irq_put % qp->attrs.irq_size];
  559. if (READ_ONCE(irq_e->flags) == 0) {
  560. qp->irq_put++;
  561. return irq_e;
  562. }
  563. return NULL;
  564. }
  565. static inline __wsum siw_csum_update(const void *buff, int len, __wsum sum)
  566. {
  567. return (__force __wsum)crc32c((__force __u32)sum, buff, len);
  568. }
  569. static inline __wsum siw_csum_combine(__wsum csum, __wsum csum2, int offset,
  570. int len)
  571. {
  572. return (__force __wsum)__crc32c_le_combine((__force __u32)csum,
  573. (__force __u32)csum2, len);
  574. }
  575. static inline void siw_crc_skb(struct siw_rx_stream *srx, unsigned int len)
  576. {
  577. const struct skb_checksum_ops siw_cs_ops = {
  578. .update = siw_csum_update,
  579. .combine = siw_csum_combine,
  580. };
  581. __wsum crc = *(u32 *)shash_desc_ctx(srx->mpa_crc_hd);
  582. crc = __skb_checksum(srx->skb, srx->skb_offset, len, crc,
  583. &siw_cs_ops);
  584. *(u32 *)shash_desc_ctx(srx->mpa_crc_hd) = crc;
  585. }
  586. #define siw_dbg(ibdev, fmt, ...) \
  587. ibdev_dbg(ibdev, "%s: " fmt, __func__, ##__VA_ARGS__)
  588. #define siw_dbg_qp(qp, fmt, ...) \
  589. ibdev_dbg(&qp->sdev->base_dev, "QP[%u] %s: " fmt, qp_id(qp), __func__, \
  590. ##__VA_ARGS__)
  591. #define siw_dbg_cq(cq, fmt, ...) \
  592. ibdev_dbg(cq->base_cq.device, "CQ[%u] %s: " fmt, cq->id, __func__, \
  593. ##__VA_ARGS__)
  594. #define siw_dbg_pd(pd, fmt, ...) \
  595. ibdev_dbg(pd->device, "PD[%u] %s: " fmt, pd->res.id, __func__, \
  596. ##__VA_ARGS__)
  597. #define siw_dbg_mem(mem, fmt, ...) \
  598. ibdev_dbg(&mem->sdev->base_dev, \
  599. "MEM[0x%08x] %s: " fmt, mem->stag, __func__, ##__VA_ARGS__)
  600. #define siw_dbg_cep(cep, fmt, ...) \
  601. ibdev_dbg(&cep->sdev->base_dev, "CEP[0x%pK] %s: " fmt, \
  602. cep, __func__, ##__VA_ARGS__)
  603. void siw_cq_flush(struct siw_cq *cq);
  604. void siw_sq_flush(struct siw_qp *qp);
  605. void siw_rq_flush(struct siw_qp *qp);
  606. int siw_reap_cqe(struct siw_cq *cq, struct ib_wc *wc);
  607. #endif