iser_verbs.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335
  1. /*
  2. * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved.
  3. * Copyright (c) 2005, 2006 Cisco Systems. All rights reserved.
  4. * Copyright (c) 2013-2014 Mellanox Technologies. All rights reserved.
  5. *
  6. * This software is available to you under a choice of one of two
  7. * licenses. You may choose to be licensed under the terms of the GNU
  8. * General Public License (GPL) Version 2, available from the file
  9. * COPYING in the main directory of this source tree, or the
  10. * OpenIB.org BSD license below:
  11. *
  12. * Redistribution and use in source and binary forms, with or
  13. * without modification, are permitted provided that the following
  14. * conditions are met:
  15. *
  16. * - Redistributions of source code must retain the above
  17. * copyright notice, this list of conditions and the following
  18. * disclaimer.
  19. *
  20. * - Redistributions in binary form must reproduce the above
  21. * copyright notice, this list of conditions and the following
  22. * disclaimer in the documentation and/or other materials
  23. * provided with the distribution.
  24. *
  25. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  26. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  27. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  28. * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  29. * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  30. * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  31. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  32. * SOFTWARE.
  33. */
  34. #include <linux/kernel.h>
  35. #include <linux/module.h>
  36. #include <linux/slab.h>
  37. #include <linux/delay.h>
  38. #include "iscsi_iser.h"
  39. #define ISCSI_ISER_MAX_CONN 8
  40. #define ISER_MAX_RX_LEN (ISER_QP_MAX_RECV_DTOS * ISCSI_ISER_MAX_CONN)
  41. #define ISER_MAX_TX_LEN (ISER_QP_MAX_REQ_DTOS * ISCSI_ISER_MAX_CONN)
  42. #define ISER_MAX_CQ_LEN (ISER_MAX_RX_LEN + ISER_MAX_TX_LEN + \
  43. ISCSI_ISER_MAX_CONN)
  44. static int iser_cq_poll_limit = 512;
  45. static void iser_cq_tasklet_fn(unsigned long data);
  46. static void iser_cq_callback(struct ib_cq *cq, void *cq_context);
  47. static void iser_cq_event_callback(struct ib_event *cause, void *context)
  48. {
  49. iser_err("cq event %s (%d)\n",
  50. ib_event_msg(cause->event), cause->event);
  51. }
  52. static void iser_qp_event_callback(struct ib_event *cause, void *context)
  53. {
  54. iser_err("qp event %s (%d)\n",
  55. ib_event_msg(cause->event), cause->event);
  56. }
  57. static void iser_event_handler(struct ib_event_handler *handler,
  58. struct ib_event *event)
  59. {
  60. iser_err("async event %s (%d) on device %s port %d\n",
  61. ib_event_msg(event->event), event->event,
  62. event->device->name, event->element.port_num);
  63. }
  64. /**
  65. * iser_create_device_ib_res - creates Protection Domain (PD), Completion
  66. * Queue (CQ), DMA Memory Region (DMA MR) with the device associated with
  67. * the adapator.
  68. *
  69. * returns 0 on success, -1 on failure
  70. */
  71. static int iser_create_device_ib_res(struct iser_device *device)
  72. {
  73. struct ib_device_attr *dev_attr = &device->dev_attr;
  74. int ret, i, max_cqe;
  75. ret = ib_query_device(device->ib_device, dev_attr);
  76. if (ret) {
  77. pr_warn("Query device failed for %s\n", device->ib_device->name);
  78. return ret;
  79. }
  80. ret = iser_assign_reg_ops(device);
  81. if (ret)
  82. return ret;
  83. device->comps_used = min_t(int, num_online_cpus(),
  84. device->ib_device->num_comp_vectors);
  85. device->comps = kcalloc(device->comps_used, sizeof(*device->comps),
  86. GFP_KERNEL);
  87. if (!device->comps)
  88. goto comps_err;
  89. max_cqe = min(ISER_MAX_CQ_LEN, dev_attr->max_cqe);
  90. iser_info("using %d CQs, device %s supports %d vectors max_cqe %d\n",
  91. device->comps_used, device->ib_device->name,
  92. device->ib_device->num_comp_vectors, max_cqe);
  93. device->pd = ib_alloc_pd(device->ib_device);
  94. if (IS_ERR(device->pd))
  95. goto pd_err;
  96. for (i = 0; i < device->comps_used; i++) {
  97. struct ib_cq_init_attr cq_attr = {};
  98. struct iser_comp *comp = &device->comps[i];
  99. comp->device = device;
  100. cq_attr.cqe = max_cqe;
  101. cq_attr.comp_vector = i;
  102. comp->cq = ib_create_cq(device->ib_device,
  103. iser_cq_callback,
  104. iser_cq_event_callback,
  105. (void *)comp,
  106. &cq_attr);
  107. if (IS_ERR(comp->cq)) {
  108. comp->cq = NULL;
  109. goto cq_err;
  110. }
  111. if (ib_req_notify_cq(comp->cq, IB_CQ_NEXT_COMP))
  112. goto cq_err;
  113. tasklet_init(&comp->tasklet, iser_cq_tasklet_fn,
  114. (unsigned long)comp);
  115. }
  116. if (!iser_always_reg) {
  117. int access = IB_ACCESS_LOCAL_WRITE |
  118. IB_ACCESS_REMOTE_WRITE |
  119. IB_ACCESS_REMOTE_READ;
  120. device->mr = ib_get_dma_mr(device->pd, access);
  121. if (IS_ERR(device->mr))
  122. goto dma_mr_err;
  123. }
  124. INIT_IB_EVENT_HANDLER(&device->event_handler, device->ib_device,
  125. iser_event_handler);
  126. if (ib_register_event_handler(&device->event_handler))
  127. goto handler_err;
  128. return 0;
  129. handler_err:
  130. if (device->mr)
  131. ib_dereg_mr(device->mr);
  132. dma_mr_err:
  133. for (i = 0; i < device->comps_used; i++)
  134. tasklet_kill(&device->comps[i].tasklet);
  135. cq_err:
  136. for (i = 0; i < device->comps_used; i++) {
  137. struct iser_comp *comp = &device->comps[i];
  138. if (comp->cq)
  139. ib_destroy_cq(comp->cq);
  140. }
  141. ib_dealloc_pd(device->pd);
  142. pd_err:
  143. kfree(device->comps);
  144. comps_err:
  145. iser_err("failed to allocate an IB resource\n");
  146. return -1;
  147. }
  148. /**
  149. * iser_free_device_ib_res - destroy/dealloc/dereg the DMA MR,
  150. * CQ and PD created with the device associated with the adapator.
  151. */
  152. static void iser_free_device_ib_res(struct iser_device *device)
  153. {
  154. int i;
  155. for (i = 0; i < device->comps_used; i++) {
  156. struct iser_comp *comp = &device->comps[i];
  157. tasklet_kill(&comp->tasklet);
  158. ib_destroy_cq(comp->cq);
  159. comp->cq = NULL;
  160. }
  161. (void)ib_unregister_event_handler(&device->event_handler);
  162. if (device->mr)
  163. (void)ib_dereg_mr(device->mr);
  164. ib_dealloc_pd(device->pd);
  165. kfree(device->comps);
  166. device->comps = NULL;
  167. device->mr = NULL;
  168. device->pd = NULL;
  169. }
  170. /**
  171. * iser_alloc_fmr_pool - Creates FMR pool and page_vector
  172. *
  173. * returns 0 on success, or errno code on failure
  174. */
  175. int iser_alloc_fmr_pool(struct ib_conn *ib_conn,
  176. unsigned cmds_max,
  177. unsigned int size)
  178. {
  179. struct iser_device *device = ib_conn->device;
  180. struct iser_fr_pool *fr_pool = &ib_conn->fr_pool;
  181. struct iser_page_vec *page_vec;
  182. struct iser_fr_desc *desc;
  183. struct ib_fmr_pool *fmr_pool;
  184. struct ib_fmr_pool_param params;
  185. int ret;
  186. INIT_LIST_HEAD(&fr_pool->list);
  187. spin_lock_init(&fr_pool->lock);
  188. desc = kzalloc(sizeof(*desc), GFP_KERNEL);
  189. if (!desc)
  190. return -ENOMEM;
  191. page_vec = kmalloc(sizeof(*page_vec) + (sizeof(u64) * size),
  192. GFP_KERNEL);
  193. if (!page_vec) {
  194. ret = -ENOMEM;
  195. goto err_frpl;
  196. }
  197. page_vec->pages = (u64 *)(page_vec + 1);
  198. params.page_shift = SHIFT_4K;
  199. params.max_pages_per_fmr = size;
  200. /* make the pool size twice the max number of SCSI commands *
  201. * the ML is expected to queue, watermark for unmap at 50% */
  202. params.pool_size = cmds_max * 2;
  203. params.dirty_watermark = cmds_max;
  204. params.cache = 0;
  205. params.flush_function = NULL;
  206. params.access = (IB_ACCESS_LOCAL_WRITE |
  207. IB_ACCESS_REMOTE_WRITE |
  208. IB_ACCESS_REMOTE_READ);
  209. fmr_pool = ib_create_fmr_pool(device->pd, &params);
  210. if (IS_ERR(fmr_pool)) {
  211. ret = PTR_ERR(fmr_pool);
  212. iser_err("FMR allocation failed, err %d\n", ret);
  213. goto err_fmr;
  214. }
  215. desc->rsc.page_vec = page_vec;
  216. desc->rsc.fmr_pool = fmr_pool;
  217. list_add(&desc->list, &fr_pool->list);
  218. return 0;
  219. err_fmr:
  220. kfree(page_vec);
  221. err_frpl:
  222. kfree(desc);
  223. return ret;
  224. }
  225. /**
  226. * iser_free_fmr_pool - releases the FMR pool and page vec
  227. */
  228. void iser_free_fmr_pool(struct ib_conn *ib_conn)
  229. {
  230. struct iser_fr_pool *fr_pool = &ib_conn->fr_pool;
  231. struct iser_fr_desc *desc;
  232. desc = list_first_entry(&fr_pool->list,
  233. struct iser_fr_desc, list);
  234. list_del(&desc->list);
  235. iser_info("freeing conn %p fmr pool %p\n",
  236. ib_conn, desc->rsc.fmr_pool);
  237. ib_destroy_fmr_pool(desc->rsc.fmr_pool);
  238. kfree(desc->rsc.page_vec);
  239. kfree(desc);
  240. }
  241. static int
  242. iser_alloc_reg_res(struct ib_device *ib_device,
  243. struct ib_pd *pd,
  244. struct iser_reg_resources *res,
  245. unsigned int size)
  246. {
  247. int ret;
  248. res->frpl = ib_alloc_fast_reg_page_list(ib_device, size);
  249. if (IS_ERR(res->frpl)) {
  250. ret = PTR_ERR(res->frpl);
  251. iser_err("Failed to allocate ib_fast_reg_page_list err=%d\n",
  252. ret);
  253. return PTR_ERR(res->frpl);
  254. }
  255. res->mr = ib_alloc_mr(pd, IB_MR_TYPE_MEM_REG, size);
  256. if (IS_ERR(res->mr)) {
  257. ret = PTR_ERR(res->mr);
  258. iser_err("Failed to allocate ib_fast_reg_mr err=%d\n", ret);
  259. goto fast_reg_mr_failure;
  260. }
  261. res->mr_valid = 1;
  262. return 0;
  263. fast_reg_mr_failure:
  264. ib_free_fast_reg_page_list(res->frpl);
  265. return ret;
  266. }
  267. static void
  268. iser_free_reg_res(struct iser_reg_resources *rsc)
  269. {
  270. ib_dereg_mr(rsc->mr);
  271. ib_free_fast_reg_page_list(rsc->frpl);
  272. }
  273. static int
  274. iser_alloc_pi_ctx(struct ib_device *ib_device,
  275. struct ib_pd *pd,
  276. struct iser_fr_desc *desc,
  277. unsigned int size)
  278. {
  279. struct iser_pi_context *pi_ctx = NULL;
  280. int ret;
  281. desc->pi_ctx = kzalloc(sizeof(*desc->pi_ctx), GFP_KERNEL);
  282. if (!desc->pi_ctx)
  283. return -ENOMEM;
  284. pi_ctx = desc->pi_ctx;
  285. ret = iser_alloc_reg_res(ib_device, pd, &pi_ctx->rsc, size);
  286. if (ret) {
  287. iser_err("failed to allocate reg_resources\n");
  288. goto alloc_reg_res_err;
  289. }
  290. pi_ctx->sig_mr = ib_alloc_mr(pd, IB_MR_TYPE_SIGNATURE, 2);
  291. if (IS_ERR(pi_ctx->sig_mr)) {
  292. ret = PTR_ERR(pi_ctx->sig_mr);
  293. goto sig_mr_failure;
  294. }
  295. pi_ctx->sig_mr_valid = 1;
  296. desc->pi_ctx->sig_protected = 0;
  297. return 0;
  298. sig_mr_failure:
  299. iser_free_reg_res(&pi_ctx->rsc);
  300. alloc_reg_res_err:
  301. kfree(desc->pi_ctx);
  302. return ret;
  303. }
  304. static void
  305. iser_free_pi_ctx(struct iser_pi_context *pi_ctx)
  306. {
  307. iser_free_reg_res(&pi_ctx->rsc);
  308. ib_dereg_mr(pi_ctx->sig_mr);
  309. kfree(pi_ctx);
  310. }
  311. static struct iser_fr_desc *
  312. iser_create_fastreg_desc(struct ib_device *ib_device,
  313. struct ib_pd *pd,
  314. bool pi_enable,
  315. unsigned int size)
  316. {
  317. struct iser_fr_desc *desc;
  318. int ret;
  319. desc = kzalloc(sizeof(*desc), GFP_KERNEL);
  320. if (!desc)
  321. return ERR_PTR(-ENOMEM);
  322. ret = iser_alloc_reg_res(ib_device, pd, &desc->rsc, size);
  323. if (ret)
  324. goto reg_res_alloc_failure;
  325. if (pi_enable) {
  326. ret = iser_alloc_pi_ctx(ib_device, pd, desc, size);
  327. if (ret)
  328. goto pi_ctx_alloc_failure;
  329. }
  330. return desc;
  331. pi_ctx_alloc_failure:
  332. iser_free_reg_res(&desc->rsc);
  333. reg_res_alloc_failure:
  334. kfree(desc);
  335. return ERR_PTR(ret);
  336. }
  337. /**
  338. * iser_alloc_fastreg_pool - Creates pool of fast_reg descriptors
  339. * for fast registration work requests.
  340. * returns 0 on success, or errno code on failure
  341. */
  342. int iser_alloc_fastreg_pool(struct ib_conn *ib_conn,
  343. unsigned cmds_max,
  344. unsigned int size)
  345. {
  346. struct iser_device *device = ib_conn->device;
  347. struct iser_fr_pool *fr_pool = &ib_conn->fr_pool;
  348. struct iser_fr_desc *desc;
  349. int i, ret;
  350. INIT_LIST_HEAD(&fr_pool->list);
  351. spin_lock_init(&fr_pool->lock);
  352. fr_pool->size = 0;
  353. for (i = 0; i < cmds_max; i++) {
  354. desc = iser_create_fastreg_desc(device->ib_device, device->pd,
  355. ib_conn->pi_support, size);
  356. if (IS_ERR(desc)) {
  357. ret = PTR_ERR(desc);
  358. goto err;
  359. }
  360. list_add_tail(&desc->list, &fr_pool->list);
  361. fr_pool->size++;
  362. }
  363. return 0;
  364. err:
  365. iser_free_fastreg_pool(ib_conn);
  366. return ret;
  367. }
  368. /**
  369. * iser_free_fastreg_pool - releases the pool of fast_reg descriptors
  370. */
  371. void iser_free_fastreg_pool(struct ib_conn *ib_conn)
  372. {
  373. struct iser_fr_pool *fr_pool = &ib_conn->fr_pool;
  374. struct iser_fr_desc *desc, *tmp;
  375. int i = 0;
  376. if (list_empty(&fr_pool->list))
  377. return;
  378. iser_info("freeing conn %p fr pool\n", ib_conn);
  379. list_for_each_entry_safe(desc, tmp, &fr_pool->list, list) {
  380. list_del(&desc->list);
  381. iser_free_reg_res(&desc->rsc);
  382. if (desc->pi_ctx)
  383. iser_free_pi_ctx(desc->pi_ctx);
  384. kfree(desc);
  385. ++i;
  386. }
  387. if (i < fr_pool->size)
  388. iser_warn("pool still has %d regions registered\n",
  389. fr_pool->size - i);
  390. }
  391. /**
  392. * iser_create_ib_conn_res - Queue-Pair (QP)
  393. *
  394. * returns 0 on success, -1 on failure
  395. */
  396. static int iser_create_ib_conn_res(struct ib_conn *ib_conn)
  397. {
  398. struct iser_conn *iser_conn = container_of(ib_conn, struct iser_conn,
  399. ib_conn);
  400. struct iser_device *device;
  401. struct ib_device_attr *dev_attr;
  402. struct ib_qp_init_attr init_attr;
  403. int ret = -ENOMEM;
  404. int index, min_index = 0;
  405. BUG_ON(ib_conn->device == NULL);
  406. device = ib_conn->device;
  407. dev_attr = &device->dev_attr;
  408. memset(&init_attr, 0, sizeof init_attr);
  409. mutex_lock(&ig.connlist_mutex);
  410. /* select the CQ with the minimal number of usages */
  411. for (index = 0; index < device->comps_used; index++) {
  412. if (device->comps[index].active_qps <
  413. device->comps[min_index].active_qps)
  414. min_index = index;
  415. }
  416. ib_conn->comp = &device->comps[min_index];
  417. ib_conn->comp->active_qps++;
  418. mutex_unlock(&ig.connlist_mutex);
  419. iser_info("cq index %d used for ib_conn %p\n", min_index, ib_conn);
  420. init_attr.event_handler = iser_qp_event_callback;
  421. init_attr.qp_context = (void *)ib_conn;
  422. init_attr.send_cq = ib_conn->comp->cq;
  423. init_attr.recv_cq = ib_conn->comp->cq;
  424. init_attr.cap.max_recv_wr = ISER_QP_MAX_RECV_DTOS;
  425. init_attr.cap.max_send_sge = 2;
  426. init_attr.cap.max_recv_sge = 1;
  427. init_attr.sq_sig_type = IB_SIGNAL_REQ_WR;
  428. init_attr.qp_type = IB_QPT_RC;
  429. if (ib_conn->pi_support) {
  430. init_attr.cap.max_send_wr = ISER_QP_SIG_MAX_REQ_DTOS + 1;
  431. init_attr.create_flags |= IB_QP_CREATE_SIGNATURE_EN;
  432. iser_conn->max_cmds =
  433. ISER_GET_MAX_XMIT_CMDS(ISER_QP_SIG_MAX_REQ_DTOS);
  434. } else {
  435. if (dev_attr->max_qp_wr > ISER_QP_MAX_REQ_DTOS) {
  436. init_attr.cap.max_send_wr = ISER_QP_MAX_REQ_DTOS + 1;
  437. iser_conn->max_cmds =
  438. ISER_GET_MAX_XMIT_CMDS(ISER_QP_MAX_REQ_DTOS);
  439. } else {
  440. init_attr.cap.max_send_wr = dev_attr->max_qp_wr;
  441. iser_conn->max_cmds =
  442. ISER_GET_MAX_XMIT_CMDS(dev_attr->max_qp_wr);
  443. iser_dbg("device %s supports max_send_wr %d\n",
  444. device->ib_device->name, dev_attr->max_qp_wr);
  445. }
  446. }
  447. ret = rdma_create_qp(ib_conn->cma_id, device->pd, &init_attr);
  448. if (ret)
  449. goto out_err;
  450. ib_conn->qp = ib_conn->cma_id->qp;
  451. iser_info("setting conn %p cma_id %p qp %p\n",
  452. ib_conn, ib_conn->cma_id,
  453. ib_conn->cma_id->qp);
  454. return ret;
  455. out_err:
  456. mutex_lock(&ig.connlist_mutex);
  457. ib_conn->comp->active_qps--;
  458. mutex_unlock(&ig.connlist_mutex);
  459. iser_err("unable to alloc mem or create resource, err %d\n", ret);
  460. return ret;
  461. }
  462. /**
  463. * based on the resolved device node GUID see if there already allocated
  464. * device for this device. If there's no such, create one.
  465. */
  466. static
  467. struct iser_device *iser_device_find_by_ib_device(struct rdma_cm_id *cma_id)
  468. {
  469. struct iser_device *device;
  470. mutex_lock(&ig.device_list_mutex);
  471. list_for_each_entry(device, &ig.device_list, ig_list)
  472. /* find if there's a match using the node GUID */
  473. if (device->ib_device->node_guid == cma_id->device->node_guid)
  474. goto inc_refcnt;
  475. device = kzalloc(sizeof *device, GFP_KERNEL);
  476. if (device == NULL)
  477. goto out;
  478. /* assign this device to the device */
  479. device->ib_device = cma_id->device;
  480. /* init the device and link it into ig device list */
  481. if (iser_create_device_ib_res(device)) {
  482. kfree(device);
  483. device = NULL;
  484. goto out;
  485. }
  486. list_add(&device->ig_list, &ig.device_list);
  487. inc_refcnt:
  488. device->refcount++;
  489. out:
  490. mutex_unlock(&ig.device_list_mutex);
  491. return device;
  492. }
  493. /* if there's no demand for this device, release it */
  494. static void iser_device_try_release(struct iser_device *device)
  495. {
  496. mutex_lock(&ig.device_list_mutex);
  497. device->refcount--;
  498. iser_info("device %p refcount %d\n", device, device->refcount);
  499. if (!device->refcount) {
  500. iser_free_device_ib_res(device);
  501. list_del(&device->ig_list);
  502. kfree(device);
  503. }
  504. mutex_unlock(&ig.device_list_mutex);
  505. }
  506. /**
  507. * Called with state mutex held
  508. **/
  509. static int iser_conn_state_comp_exch(struct iser_conn *iser_conn,
  510. enum iser_conn_state comp,
  511. enum iser_conn_state exch)
  512. {
  513. int ret;
  514. ret = (iser_conn->state == comp);
  515. if (ret)
  516. iser_conn->state = exch;
  517. return ret;
  518. }
  519. void iser_release_work(struct work_struct *work)
  520. {
  521. struct iser_conn *iser_conn;
  522. iser_conn = container_of(work, struct iser_conn, release_work);
  523. /* Wait for conn_stop to complete */
  524. wait_for_completion(&iser_conn->stop_completion);
  525. /* Wait for IB resouces cleanup to complete */
  526. wait_for_completion(&iser_conn->ib_completion);
  527. mutex_lock(&iser_conn->state_mutex);
  528. iser_conn->state = ISER_CONN_DOWN;
  529. mutex_unlock(&iser_conn->state_mutex);
  530. iser_conn_release(iser_conn);
  531. }
  532. /**
  533. * iser_free_ib_conn_res - release IB related resources
  534. * @iser_conn: iser connection struct
  535. * @destroy: indicator if we need to try to release the
  536. * iser device and memory regoins pool (only iscsi
  537. * shutdown and DEVICE_REMOVAL will use this).
  538. *
  539. * This routine is called with the iser state mutex held
  540. * so the cm_id removal is out of here. It is Safe to
  541. * be invoked multiple times.
  542. */
  543. static void iser_free_ib_conn_res(struct iser_conn *iser_conn,
  544. bool destroy)
  545. {
  546. struct ib_conn *ib_conn = &iser_conn->ib_conn;
  547. struct iser_device *device = ib_conn->device;
  548. iser_info("freeing conn %p cma_id %p qp %p\n",
  549. iser_conn, ib_conn->cma_id, ib_conn->qp);
  550. if (ib_conn->qp != NULL) {
  551. ib_conn->comp->active_qps--;
  552. rdma_destroy_qp(ib_conn->cma_id);
  553. ib_conn->qp = NULL;
  554. }
  555. if (destroy) {
  556. if (iser_conn->rx_descs)
  557. iser_free_rx_descriptors(iser_conn);
  558. if (device != NULL) {
  559. iser_device_try_release(device);
  560. ib_conn->device = NULL;
  561. }
  562. }
  563. }
  564. /**
  565. * Frees all conn objects and deallocs conn descriptor
  566. */
  567. void iser_conn_release(struct iser_conn *iser_conn)
  568. {
  569. struct ib_conn *ib_conn = &iser_conn->ib_conn;
  570. mutex_lock(&ig.connlist_mutex);
  571. list_del(&iser_conn->conn_list);
  572. mutex_unlock(&ig.connlist_mutex);
  573. mutex_lock(&iser_conn->state_mutex);
  574. /* In case we endup here without ep_disconnect being invoked. */
  575. if (iser_conn->state != ISER_CONN_DOWN) {
  576. iser_warn("iser conn %p state %d, expected state down.\n",
  577. iser_conn, iser_conn->state);
  578. iscsi_destroy_endpoint(iser_conn->ep);
  579. iser_conn->state = ISER_CONN_DOWN;
  580. }
  581. /*
  582. * In case we never got to bind stage, we still need to
  583. * release IB resources (which is safe to call more than once).
  584. */
  585. iser_free_ib_conn_res(iser_conn, true);
  586. mutex_unlock(&iser_conn->state_mutex);
  587. if (ib_conn->cma_id != NULL) {
  588. rdma_destroy_id(ib_conn->cma_id);
  589. ib_conn->cma_id = NULL;
  590. }
  591. kfree(iser_conn);
  592. }
  593. /**
  594. * triggers start of the disconnect procedures and wait for them to be done
  595. * Called with state mutex held
  596. */
  597. int iser_conn_terminate(struct iser_conn *iser_conn)
  598. {
  599. struct ib_conn *ib_conn = &iser_conn->ib_conn;
  600. struct ib_send_wr *bad_wr;
  601. int err = 0;
  602. /* terminate the iser conn only if the conn state is UP */
  603. if (!iser_conn_state_comp_exch(iser_conn, ISER_CONN_UP,
  604. ISER_CONN_TERMINATING))
  605. return 0;
  606. iser_info("iser_conn %p state %d\n", iser_conn, iser_conn->state);
  607. /* suspend queuing of new iscsi commands */
  608. if (iser_conn->iscsi_conn)
  609. iscsi_suspend_queue(iser_conn->iscsi_conn);
  610. /*
  611. * In case we didn't already clean up the cma_id (peer initiated
  612. * a disconnection), we need to Cause the CMA to change the QP
  613. * state to ERROR.
  614. */
  615. if (ib_conn->cma_id) {
  616. err = rdma_disconnect(ib_conn->cma_id);
  617. if (err)
  618. iser_err("Failed to disconnect, conn: 0x%p err %d\n",
  619. iser_conn, err);
  620. /* post an indication that all flush errors were consumed */
  621. err = ib_post_send(ib_conn->qp, &ib_conn->beacon, &bad_wr);
  622. if (err) {
  623. iser_err("conn %p failed to post beacon", ib_conn);
  624. return 1;
  625. }
  626. wait_for_completion(&ib_conn->flush_comp);
  627. }
  628. return 1;
  629. }
  630. /**
  631. * Called with state mutex held
  632. **/
  633. static void iser_connect_error(struct rdma_cm_id *cma_id)
  634. {
  635. struct iser_conn *iser_conn;
  636. iser_conn = (struct iser_conn *)cma_id->context;
  637. iser_conn->state = ISER_CONN_TERMINATING;
  638. }
  639. static void
  640. iser_calc_scsi_params(struct iser_conn *iser_conn,
  641. unsigned int max_sectors)
  642. {
  643. struct iser_device *device = iser_conn->ib_conn.device;
  644. unsigned short sg_tablesize, sup_sg_tablesize;
  645. sg_tablesize = DIV_ROUND_UP(max_sectors * 512, SIZE_4K);
  646. sup_sg_tablesize = min_t(unsigned, ISCSI_ISER_MAX_SG_TABLESIZE,
  647. device->dev_attr.max_fast_reg_page_list_len);
  648. if (sg_tablesize > sup_sg_tablesize) {
  649. sg_tablesize = sup_sg_tablesize;
  650. iser_conn->scsi_max_sectors = sg_tablesize * SIZE_4K / 512;
  651. } else {
  652. iser_conn->scsi_max_sectors = max_sectors;
  653. }
  654. iser_conn->scsi_sg_tablesize = sg_tablesize;
  655. iser_dbg("iser_conn %p, sg_tablesize %u, max_sectors %u\n",
  656. iser_conn, iser_conn->scsi_sg_tablesize,
  657. iser_conn->scsi_max_sectors);
  658. }
  659. /**
  660. * Called with state mutex held
  661. **/
  662. static void iser_addr_handler(struct rdma_cm_id *cma_id)
  663. {
  664. struct iser_device *device;
  665. struct iser_conn *iser_conn;
  666. struct ib_conn *ib_conn;
  667. int ret;
  668. iser_conn = (struct iser_conn *)cma_id->context;
  669. if (iser_conn->state != ISER_CONN_PENDING)
  670. /* bailout */
  671. return;
  672. ib_conn = &iser_conn->ib_conn;
  673. device = iser_device_find_by_ib_device(cma_id);
  674. if (!device) {
  675. iser_err("device lookup/creation failed\n");
  676. iser_connect_error(cma_id);
  677. return;
  678. }
  679. ib_conn->device = device;
  680. /* connection T10-PI support */
  681. if (iser_pi_enable) {
  682. if (!(device->dev_attr.device_cap_flags &
  683. IB_DEVICE_SIGNATURE_HANDOVER)) {
  684. iser_warn("T10-PI requested but not supported on %s, "
  685. "continue without T10-PI\n",
  686. ib_conn->device->ib_device->name);
  687. ib_conn->pi_support = false;
  688. } else {
  689. ib_conn->pi_support = true;
  690. }
  691. }
  692. iser_calc_scsi_params(iser_conn, iser_max_sectors);
  693. ret = rdma_resolve_route(cma_id, 1000);
  694. if (ret) {
  695. iser_err("resolve route failed: %d\n", ret);
  696. iser_connect_error(cma_id);
  697. return;
  698. }
  699. }
  700. /**
  701. * Called with state mutex held
  702. **/
  703. static void iser_route_handler(struct rdma_cm_id *cma_id)
  704. {
  705. struct rdma_conn_param conn_param;
  706. int ret;
  707. struct iser_cm_hdr req_hdr;
  708. struct iser_conn *iser_conn = (struct iser_conn *)cma_id->context;
  709. struct ib_conn *ib_conn = &iser_conn->ib_conn;
  710. struct iser_device *device = ib_conn->device;
  711. if (iser_conn->state != ISER_CONN_PENDING)
  712. /* bailout */
  713. return;
  714. ret = iser_create_ib_conn_res(ib_conn);
  715. if (ret)
  716. goto failure;
  717. memset(&conn_param, 0, sizeof conn_param);
  718. conn_param.responder_resources = device->dev_attr.max_qp_rd_atom;
  719. conn_param.initiator_depth = 1;
  720. conn_param.retry_count = 7;
  721. conn_param.rnr_retry_count = 6;
  722. memset(&req_hdr, 0, sizeof(req_hdr));
  723. req_hdr.flags = (ISER_ZBVA_NOT_SUPPORTED |
  724. ISER_SEND_W_INV_NOT_SUPPORTED);
  725. conn_param.private_data = (void *)&req_hdr;
  726. conn_param.private_data_len = sizeof(struct iser_cm_hdr);
  727. ret = rdma_connect(cma_id, &conn_param);
  728. if (ret) {
  729. iser_err("failure connecting: %d\n", ret);
  730. goto failure;
  731. }
  732. return;
  733. failure:
  734. iser_connect_error(cma_id);
  735. }
  736. static void iser_connected_handler(struct rdma_cm_id *cma_id)
  737. {
  738. struct iser_conn *iser_conn;
  739. struct ib_qp_attr attr;
  740. struct ib_qp_init_attr init_attr;
  741. iser_conn = (struct iser_conn *)cma_id->context;
  742. if (iser_conn->state != ISER_CONN_PENDING)
  743. /* bailout */
  744. return;
  745. (void)ib_query_qp(cma_id->qp, &attr, ~0, &init_attr);
  746. iser_info("remote qpn:%x my qpn:%x\n", attr.dest_qp_num, cma_id->qp->qp_num);
  747. iser_conn->state = ISER_CONN_UP;
  748. complete(&iser_conn->up_completion);
  749. }
  750. static void iser_disconnected_handler(struct rdma_cm_id *cma_id)
  751. {
  752. struct iser_conn *iser_conn = (struct iser_conn *)cma_id->context;
  753. if (iser_conn_terminate(iser_conn)) {
  754. if (iser_conn->iscsi_conn)
  755. iscsi_conn_failure(iser_conn->iscsi_conn,
  756. ISCSI_ERR_CONN_FAILED);
  757. else
  758. iser_err("iscsi_iser connection isn't bound\n");
  759. }
  760. }
  761. static void iser_cleanup_handler(struct rdma_cm_id *cma_id,
  762. bool destroy)
  763. {
  764. struct iser_conn *iser_conn = (struct iser_conn *)cma_id->context;
  765. /*
  766. * We are not guaranteed that we visited disconnected_handler
  767. * by now, call it here to be safe that we handle CM drep
  768. * and flush errors.
  769. */
  770. iser_disconnected_handler(cma_id);
  771. iser_free_ib_conn_res(iser_conn, destroy);
  772. complete(&iser_conn->ib_completion);
  773. };
  774. static int iser_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
  775. {
  776. struct iser_conn *iser_conn;
  777. int ret = 0;
  778. iser_conn = (struct iser_conn *)cma_id->context;
  779. iser_info("%s (%d): status %d conn %p id %p\n",
  780. rdma_event_msg(event->event), event->event,
  781. event->status, cma_id->context, cma_id);
  782. mutex_lock(&iser_conn->state_mutex);
  783. switch (event->event) {
  784. case RDMA_CM_EVENT_ADDR_RESOLVED:
  785. iser_addr_handler(cma_id);
  786. break;
  787. case RDMA_CM_EVENT_ROUTE_RESOLVED:
  788. iser_route_handler(cma_id);
  789. break;
  790. case RDMA_CM_EVENT_ESTABLISHED:
  791. iser_connected_handler(cma_id);
  792. break;
  793. case RDMA_CM_EVENT_ADDR_ERROR:
  794. case RDMA_CM_EVENT_ROUTE_ERROR:
  795. case RDMA_CM_EVENT_CONNECT_ERROR:
  796. case RDMA_CM_EVENT_UNREACHABLE:
  797. case RDMA_CM_EVENT_REJECTED:
  798. iser_connect_error(cma_id);
  799. break;
  800. case RDMA_CM_EVENT_DISCONNECTED:
  801. case RDMA_CM_EVENT_ADDR_CHANGE:
  802. case RDMA_CM_EVENT_TIMEWAIT_EXIT:
  803. iser_cleanup_handler(cma_id, false);
  804. break;
  805. case RDMA_CM_EVENT_DEVICE_REMOVAL:
  806. /*
  807. * we *must* destroy the device as we cannot rely
  808. * on iscsid to be around to initiate error handling.
  809. * also if we are not in state DOWN implicitly destroy
  810. * the cma_id.
  811. */
  812. iser_cleanup_handler(cma_id, true);
  813. if (iser_conn->state != ISER_CONN_DOWN) {
  814. iser_conn->ib_conn.cma_id = NULL;
  815. ret = 1;
  816. }
  817. break;
  818. default:
  819. iser_err("Unexpected RDMA CM event: %s (%d)\n",
  820. rdma_event_msg(event->event), event->event);
  821. break;
  822. }
  823. mutex_unlock(&iser_conn->state_mutex);
  824. return ret;
  825. }
  826. void iser_conn_init(struct iser_conn *iser_conn)
  827. {
  828. iser_conn->state = ISER_CONN_INIT;
  829. iser_conn->ib_conn.post_recv_buf_count = 0;
  830. init_completion(&iser_conn->ib_conn.flush_comp);
  831. init_completion(&iser_conn->stop_completion);
  832. init_completion(&iser_conn->ib_completion);
  833. init_completion(&iser_conn->up_completion);
  834. INIT_LIST_HEAD(&iser_conn->conn_list);
  835. mutex_init(&iser_conn->state_mutex);
  836. }
  837. /**
  838. * starts the process of connecting to the target
  839. * sleeps until the connection is established or rejected
  840. */
  841. int iser_connect(struct iser_conn *iser_conn,
  842. struct sockaddr *src_addr,
  843. struct sockaddr *dst_addr,
  844. int non_blocking)
  845. {
  846. struct ib_conn *ib_conn = &iser_conn->ib_conn;
  847. int err = 0;
  848. mutex_lock(&iser_conn->state_mutex);
  849. sprintf(iser_conn->name, "%pISp", dst_addr);
  850. iser_info("connecting to: %s\n", iser_conn->name);
  851. /* the device is known only --after-- address resolution */
  852. ib_conn->device = NULL;
  853. iser_conn->state = ISER_CONN_PENDING;
  854. ib_conn->beacon.wr_id = ISER_BEACON_WRID;
  855. ib_conn->beacon.opcode = IB_WR_SEND;
  856. ib_conn->cma_id = rdma_create_id(iser_cma_handler,
  857. (void *)iser_conn,
  858. RDMA_PS_TCP, IB_QPT_RC);
  859. if (IS_ERR(ib_conn->cma_id)) {
  860. err = PTR_ERR(ib_conn->cma_id);
  861. iser_err("rdma_create_id failed: %d\n", err);
  862. goto id_failure;
  863. }
  864. err = rdma_resolve_addr(ib_conn->cma_id, src_addr, dst_addr, 1000);
  865. if (err) {
  866. iser_err("rdma_resolve_addr failed: %d\n", err);
  867. goto addr_failure;
  868. }
  869. if (!non_blocking) {
  870. wait_for_completion_interruptible(&iser_conn->up_completion);
  871. if (iser_conn->state != ISER_CONN_UP) {
  872. err = -EIO;
  873. goto connect_failure;
  874. }
  875. }
  876. mutex_unlock(&iser_conn->state_mutex);
  877. mutex_lock(&ig.connlist_mutex);
  878. list_add(&iser_conn->conn_list, &ig.connlist);
  879. mutex_unlock(&ig.connlist_mutex);
  880. return 0;
  881. id_failure:
  882. ib_conn->cma_id = NULL;
  883. addr_failure:
  884. iser_conn->state = ISER_CONN_DOWN;
  885. connect_failure:
  886. mutex_unlock(&iser_conn->state_mutex);
  887. iser_conn_release(iser_conn);
  888. return err;
  889. }
  890. int iser_post_recvl(struct iser_conn *iser_conn)
  891. {
  892. struct ib_recv_wr rx_wr, *rx_wr_failed;
  893. struct ib_conn *ib_conn = &iser_conn->ib_conn;
  894. struct ib_sge sge;
  895. int ib_ret;
  896. sge.addr = iser_conn->login_resp_dma;
  897. sge.length = ISER_RX_LOGIN_SIZE;
  898. sge.lkey = ib_conn->device->pd->local_dma_lkey;
  899. rx_wr.wr_id = (uintptr_t)iser_conn->login_resp_buf;
  900. rx_wr.sg_list = &sge;
  901. rx_wr.num_sge = 1;
  902. rx_wr.next = NULL;
  903. ib_conn->post_recv_buf_count++;
  904. ib_ret = ib_post_recv(ib_conn->qp, &rx_wr, &rx_wr_failed);
  905. if (ib_ret) {
  906. iser_err("ib_post_recv failed ret=%d\n", ib_ret);
  907. ib_conn->post_recv_buf_count--;
  908. }
  909. return ib_ret;
  910. }
  911. int iser_post_recvm(struct iser_conn *iser_conn, int count)
  912. {
  913. struct ib_recv_wr *rx_wr, *rx_wr_failed;
  914. int i, ib_ret;
  915. struct ib_conn *ib_conn = &iser_conn->ib_conn;
  916. unsigned int my_rx_head = iser_conn->rx_desc_head;
  917. struct iser_rx_desc *rx_desc;
  918. for (rx_wr = ib_conn->rx_wr, i = 0; i < count; i++, rx_wr++) {
  919. rx_desc = &iser_conn->rx_descs[my_rx_head];
  920. rx_wr->wr_id = (uintptr_t)rx_desc;
  921. rx_wr->sg_list = &rx_desc->rx_sg;
  922. rx_wr->num_sge = 1;
  923. rx_wr->next = rx_wr + 1;
  924. my_rx_head = (my_rx_head + 1) & iser_conn->qp_max_recv_dtos_mask;
  925. }
  926. rx_wr--;
  927. rx_wr->next = NULL; /* mark end of work requests list */
  928. ib_conn->post_recv_buf_count += count;
  929. ib_ret = ib_post_recv(ib_conn->qp, ib_conn->rx_wr, &rx_wr_failed);
  930. if (ib_ret) {
  931. iser_err("ib_post_recv failed ret=%d\n", ib_ret);
  932. ib_conn->post_recv_buf_count -= count;
  933. } else
  934. iser_conn->rx_desc_head = my_rx_head;
  935. return ib_ret;
  936. }
  937. /**
  938. * iser_start_send - Initiate a Send DTO operation
  939. *
  940. * returns 0 on success, -1 on failure
  941. */
  942. int iser_post_send(struct ib_conn *ib_conn, struct iser_tx_desc *tx_desc,
  943. bool signal)
  944. {
  945. struct ib_send_wr *bad_wr, *wr = iser_tx_next_wr(tx_desc);
  946. int ib_ret;
  947. ib_dma_sync_single_for_device(ib_conn->device->ib_device,
  948. tx_desc->dma_addr, ISER_HEADERS_LEN,
  949. DMA_TO_DEVICE);
  950. wr->next = NULL;
  951. wr->wr_id = (uintptr_t)tx_desc;
  952. wr->sg_list = tx_desc->tx_sg;
  953. wr->num_sge = tx_desc->num_sge;
  954. wr->opcode = IB_WR_SEND;
  955. wr->send_flags = signal ? IB_SEND_SIGNALED : 0;
  956. ib_ret = ib_post_send(ib_conn->qp, &tx_desc->wrs[0], &bad_wr);
  957. if (ib_ret)
  958. iser_err("ib_post_send failed, ret:%d opcode:%d\n",
  959. ib_ret, bad_wr->opcode);
  960. return ib_ret;
  961. }
  962. /**
  963. * is_iser_tx_desc - Indicate if the completion wr_id
  964. * is a TX descriptor or not.
  965. * @iser_conn: iser connection
  966. * @wr_id: completion WR identifier
  967. *
  968. * Since we cannot rely on wc opcode in FLUSH errors
  969. * we must work around it by checking if the wr_id address
  970. * falls in the iser connection rx_descs buffer. If so
  971. * it is an RX descriptor, otherwize it is a TX.
  972. */
  973. static inline bool
  974. is_iser_tx_desc(struct iser_conn *iser_conn, void *wr_id)
  975. {
  976. void *start = iser_conn->rx_descs;
  977. int len = iser_conn->num_rx_descs * sizeof(*iser_conn->rx_descs);
  978. if (wr_id >= start && wr_id < start + len)
  979. return false;
  980. return true;
  981. }
  982. /**
  983. * iser_handle_comp_error() - Handle error completion
  984. * @ib_conn: connection RDMA resources
  985. * @wc: work completion
  986. *
  987. * Notes: We may handle a FLUSH error completion and in this case
  988. * we only cleanup in case TX type was DATAOUT. For non-FLUSH
  989. * error completion we should also notify iscsi layer that
  990. * connection is failed (in case we passed bind stage).
  991. */
  992. static void
  993. iser_handle_comp_error(struct ib_conn *ib_conn,
  994. struct ib_wc *wc)
  995. {
  996. void *wr_id = (void *)(uintptr_t)wc->wr_id;
  997. struct iser_conn *iser_conn = container_of(ib_conn, struct iser_conn,
  998. ib_conn);
  999. if (wc->status != IB_WC_WR_FLUSH_ERR)
  1000. if (iser_conn->iscsi_conn)
  1001. iscsi_conn_failure(iser_conn->iscsi_conn,
  1002. ISCSI_ERR_CONN_FAILED);
  1003. if (wc->wr_id == ISER_FASTREG_LI_WRID)
  1004. return;
  1005. if (is_iser_tx_desc(iser_conn, wr_id)) {
  1006. struct iser_tx_desc *desc = wr_id;
  1007. if (desc->type == ISCSI_TX_DATAOUT)
  1008. kmem_cache_free(ig.desc_cache, desc);
  1009. } else {
  1010. ib_conn->post_recv_buf_count--;
  1011. }
  1012. }
  1013. /**
  1014. * iser_handle_wc - handle a single work completion
  1015. * @wc: work completion
  1016. *
  1017. * Soft-IRQ context, work completion can be either
  1018. * SEND or RECV, and can turn out successful or
  1019. * with error (or flush error).
  1020. */
  1021. static void iser_handle_wc(struct ib_wc *wc)
  1022. {
  1023. struct ib_conn *ib_conn;
  1024. struct iser_tx_desc *tx_desc;
  1025. struct iser_rx_desc *rx_desc;
  1026. ib_conn = wc->qp->qp_context;
  1027. if (likely(wc->status == IB_WC_SUCCESS)) {
  1028. if (wc->opcode == IB_WC_RECV) {
  1029. rx_desc = (struct iser_rx_desc *)(uintptr_t)wc->wr_id;
  1030. iser_rcv_completion(rx_desc, wc->byte_len,
  1031. ib_conn);
  1032. } else
  1033. if (wc->opcode == IB_WC_SEND) {
  1034. tx_desc = (struct iser_tx_desc *)(uintptr_t)wc->wr_id;
  1035. iser_snd_completion(tx_desc, ib_conn);
  1036. } else {
  1037. iser_err("Unknown wc opcode %d\n", wc->opcode);
  1038. }
  1039. } else {
  1040. if (wc->status != IB_WC_WR_FLUSH_ERR)
  1041. iser_err("%s (%d): wr id %llx vend_err %x\n",
  1042. ib_wc_status_msg(wc->status), wc->status,
  1043. wc->wr_id, wc->vendor_err);
  1044. else
  1045. iser_dbg("%s (%d): wr id %llx\n",
  1046. ib_wc_status_msg(wc->status), wc->status,
  1047. wc->wr_id);
  1048. if (wc->wr_id == ISER_BEACON_WRID)
  1049. /* all flush errors were consumed */
  1050. complete(&ib_conn->flush_comp);
  1051. else
  1052. iser_handle_comp_error(ib_conn, wc);
  1053. }
  1054. }
  1055. /**
  1056. * iser_cq_tasklet_fn - iSER completion polling loop
  1057. * @data: iSER completion context
  1058. *
  1059. * Soft-IRQ context, polling connection CQ until
  1060. * either CQ was empty or we exausted polling budget
  1061. */
  1062. static void iser_cq_tasklet_fn(unsigned long data)
  1063. {
  1064. struct iser_comp *comp = (struct iser_comp *)data;
  1065. struct ib_cq *cq = comp->cq;
  1066. struct ib_wc *const wcs = comp->wcs;
  1067. int i, n, completed = 0;
  1068. while ((n = ib_poll_cq(cq, ARRAY_SIZE(comp->wcs), wcs)) > 0) {
  1069. for (i = 0; i < n; i++)
  1070. iser_handle_wc(&wcs[i]);
  1071. completed += n;
  1072. if (completed >= iser_cq_poll_limit)
  1073. break;
  1074. }
  1075. /*
  1076. * It is assumed here that arming CQ only once its empty
  1077. * would not cause interrupts to be missed.
  1078. */
  1079. ib_req_notify_cq(cq, IB_CQ_NEXT_COMP);
  1080. iser_dbg("got %d completions\n", completed);
  1081. }
  1082. static void iser_cq_callback(struct ib_cq *cq, void *cq_context)
  1083. {
  1084. struct iser_comp *comp = cq_context;
  1085. tasklet_schedule(&comp->tasklet);
  1086. }
  1087. u8 iser_check_task_pi_status(struct iscsi_iser_task *iser_task,
  1088. enum iser_data_dir cmd_dir, sector_t *sector)
  1089. {
  1090. struct iser_mem_reg *reg = &iser_task->rdma_reg[cmd_dir];
  1091. struct iser_fr_desc *desc = reg->mem_h;
  1092. unsigned long sector_size = iser_task->sc->device->sector_size;
  1093. struct ib_mr_status mr_status;
  1094. int ret;
  1095. if (desc && desc->pi_ctx->sig_protected) {
  1096. desc->pi_ctx->sig_protected = 0;
  1097. ret = ib_check_mr_status(desc->pi_ctx->sig_mr,
  1098. IB_MR_CHECK_SIG_STATUS, &mr_status);
  1099. if (ret) {
  1100. pr_err("ib_check_mr_status failed, ret %d\n", ret);
  1101. goto err;
  1102. }
  1103. if (mr_status.fail_status & IB_MR_CHECK_SIG_STATUS) {
  1104. sector_t sector_off = mr_status.sig_err.sig_err_offset;
  1105. do_div(sector_off, sector_size + 8);
  1106. *sector = scsi_get_lba(iser_task->sc) + sector_off;
  1107. pr_err("PI error found type %d at sector %llx "
  1108. "expected %x vs actual %x\n",
  1109. mr_status.sig_err.err_type,
  1110. (unsigned long long)*sector,
  1111. mr_status.sig_err.expected,
  1112. mr_status.sig_err.actual);
  1113. switch (mr_status.sig_err.err_type) {
  1114. case IB_SIG_BAD_GUARD:
  1115. return 0x1;
  1116. case IB_SIG_BAD_REFTAG:
  1117. return 0x3;
  1118. case IB_SIG_BAD_APPTAG:
  1119. return 0x2;
  1120. }
  1121. }
  1122. }
  1123. return 0;
  1124. err:
  1125. /* Not alot we can do here, return ambiguous guard error */
  1126. return 0x1;
  1127. }