···365365366366 if (CQE_OPCODE(hw_cqe) == FW_RI_READ_RESP) {367367368368- /*369369- * drop peer2peer RTR reads.368368+ /* If we have reached here because of async369369+ * event or other error, and have egress error370370+ * then drop371371+ */372372+ if (CQE_TYPE(hw_cqe) == 1)373373+ goto next_cqe;374374+375375+ /* drop peer2peer RTR reads.370376 */371377 if (CQE_WRID_STAG(hw_cqe) == 1)372378 goto next_cqe;···517511 */518512 if (RQ_TYPE(hw_cqe) && (CQE_OPCODE(hw_cqe) == FW_RI_READ_RESP)) {519513520520- /*521521- * If this is an unsolicited read response, then the read514514+ /* If we have reached here because of async515515+ * event or other error, and have egress error516516+ * then drop517517+ */518518+ if (CQE_TYPE(hw_cqe) == 1) {519519+ if (CQE_STATUS(hw_cqe))520520+ t4_set_wq_in_error(wq);521521+ ret = -EAGAIN;522522+ goto skip_cqe;523523+ }524524+525525+ /* If this is an unsolicited read response, then the read522526 * was generated by the kernel driver as part of peer-2-peer523527 * connection setup. So ignore the completion.524528 */···619603 */620604 if (SQ_TYPE(hw_cqe)) {621605 int idx = CQE_WRID_SQ_IDX(hw_cqe);622622- BUG_ON(idx > wq->sq.size);606606+ BUG_ON(idx >= wq->sq.size);623607624608 /*625609 * Account for any unsignaled completions completed by···633617 wq->sq.in_use -= wq->sq.size + idx - wq->sq.cidx;634618 else635619 wq->sq.in_use -= idx - wq->sq.cidx;636636- BUG_ON(wq->sq.in_use < 0 && wq->sq.in_use < wq->sq.size);620620+ BUG_ON(wq->sq.in_use <= 0 && wq->sq.in_use >= wq->sq.size);637621638622 wq->sq.cidx = (uint16_t)idx;639623 PDBG("%s completing sq idx %u\n", __func__, wq->sq.cidx);···897881 /*898882 * Make actual HW queue 2x to avoid cdix_inc overflows.899883 */900900- hwentries = entries * 2;884884+ hwentries = min(entries * 2, T4_MAX_IQ_SIZE);901885902886 /*903887 * Make HW queue at least 64 entries so GTS updates aren't too···946930 if (!mm2)947931 goto err4;948932933933+ memset(&uresp, 0, sizeof(uresp));949934 uresp.qid_mask = rhp->rdev.cqmask;950935 uresp.cqid = chp->cq.cqid;951936 uresp.size = chp->cq.size;
+4-2
drivers/infiniband/hw/cxgb4/device.c
···897897 }898898899899 opcode = *(u8 *)rsp;900900- if (c4iw_handlers[opcode])900900+ if (c4iw_handlers[opcode]) {901901 c4iw_handlers[opcode](dev, skb);902902- else902902+ } else {903903 pr_info("%s no handler opcode 0x%x...\n", __func__,904904 opcode);905905+ kfree_skb(skb);906906+ }905907906908 return 0;907909nomem:
···25342534 /* This is only a stub; nothing to be done here */25352535}2536253625372537-static u64 ehca_dma_address(struct ib_device *dev, struct scatterlist *sg)25382538-{25392539- return sg->dma_address;25402540-}25412541-25422542-static unsigned int ehca_dma_len(struct ib_device *dev, struct scatterlist *sg)25432543-{25442544- return sg->length;25452545-}25462546-25472537static void ehca_dma_sync_single_for_cpu(struct ib_device *dev, u64 addr,25482538 size_t size,25492539 enum dma_data_direction dir)···25862596 .unmap_page = ehca_dma_unmap_page,25872597 .map_sg = ehca_dma_map_sg,25882598 .unmap_sg = ehca_dma_unmap_sg,25892589- .dma_address = ehca_dma_address,25902590- .dma_len = ehca_dma_len,25912599 .sync_single_for_cpu = ehca_dma_sync_single_for_cpu,25922600 .sync_single_for_device = ehca_dma_sync_single_for_device,25932601 .alloc_coherent = ehca_dma_alloc_coherent,
+26-42
drivers/infiniband/hw/ipath/ipath_diag.c
···326326 size_t count, loff_t *off)327327{328328 u32 __iomem *piobuf;329329- u32 plen, clen, pbufn;329329+ u32 plen, pbufn, maxlen_reserve;330330 struct ipath_diag_pkt odp;331331 struct ipath_diag_xpkt dp;332332 u32 *tmpbuf = NULL;···335335 u64 val;336336 u32 l_state, lt_state; /* LinkState, LinkTrainingState */337337338338- if (count < sizeof(odp)) {339339- ret = -EINVAL;340340- goto bail;341341- }342338343339 if (count == sizeof(dp)) {344340 if (copy_from_user(&dp, data, sizeof(dp))) {345341 ret = -EFAULT;346342 goto bail;347343 }348348- } else if (copy_from_user(&odp, data, sizeof(odp))) {349349- ret = -EFAULT;344344+ } else if (count == sizeof(odp)) {345345+ if (copy_from_user(&odp, data, sizeof(odp))) {346346+ ret = -EFAULT;347347+ goto bail;348348+ }349349+ } else {350350+ ret = -EINVAL;350351 goto bail;351351- }352352-353353- /*354354- * Due to padding/alignment issues (lessened with new struct)355355- * the old and new structs are the same length. We need to356356- * disambiguate them, which we can do because odp.len has never357357- * been less than the total of LRH+BTH+DETH so far, while358358- * dp.unit (same offset) unit is unlikely to get that high.359359- * Similarly, dp.data, the pointer to user at the same offset360360- * as odp.unit, is almost certainly at least one (512byte)page361361- * "above" NULL. The if-block below can be omitted if compatibility362362- * between a new driver and older diagnostic code is unimportant.363363- * compatibility the other direction (new diags, old driver) is364364- * handled in the diagnostic code, with a warning.365365- */366366- if (dp.unit >= 20 && dp.data < 512) {367367- /* very probable version mismatch. Fix it up */368368- memcpy(&odp, &dp, sizeof(odp));369369- /* We got a legacy dp, copy elements to dp */370370- dp.unit = odp.unit;371371- dp.data = odp.data;372372- dp.len = odp.len;373373- dp.pbc_wd = 0; /* Indicate we need to compute PBC wd */374352 }375353376354 /* send count must be an exact number of dwords */···357379 goto bail;358380 }359381360360- clen = dp.len >> 2;382382+ plen = dp.len >> 2;361383362384 dd = ipath_lookup(dp.unit);363385 if (!dd || !(dd->ipath_flags & IPATH_PRESENT) ||···400422 goto bail;401423 }402424403403- /* need total length before first word written */404404- /* +1 word is for the qword padding */425425+ /*426426+ * need total length before first word written, plus 2 Dwords. One Dword427427+ * is for padding so we get the full user data when not aligned on428428+ * a word boundary. The other Dword is to make sure we have room for the429429+ * ICRC which gets tacked on later.430430+ */431431+ maxlen_reserve = 2 * sizeof(u32);432432+ if (dp.len > dd->ipath_ibmaxlen - maxlen_reserve) {433433+ ipath_dbg("Pkt len 0x%x > ibmaxlen %x\n",434434+ dp.len, dd->ipath_ibmaxlen);435435+ ret = -EINVAL;436436+ goto bail;437437+ }438438+405439 plen = sizeof(u32) + dp.len;406440407407- if ((plen + 4) > dd->ipath_ibmaxlen) {408408- ipath_dbg("Pkt len 0x%x > ibmaxlen %x\n",409409- plen - 4, dd->ipath_ibmaxlen);410410- ret = -EINVAL;411411- goto bail; /* before writing pbc */412412- }413441 tmpbuf = vmalloc(plen);414442 if (!tmpbuf) {415443 dev_info(&dd->pcidev->dev, "Unable to allocate tmp buffer, "···457473 */458474 if (dd->ipath_flags & IPATH_PIO_FLUSH_WC) {459475 ipath_flush_wc();460460- __iowrite32_copy(piobuf + 2, tmpbuf, clen - 1);476476+ __iowrite32_copy(piobuf + 2, tmpbuf, plen - 1);461477 ipath_flush_wc();462462- __raw_writel(tmpbuf[clen - 1], piobuf + clen + 1);478478+ __raw_writel(tmpbuf[plen - 1], piobuf + plen + 1);463479 } else464464- __iowrite32_copy(piobuf + 2, tmpbuf, clen);480480+ __iowrite32_copy(piobuf + 2, tmpbuf, plen);465481466482 ipath_flush_wc();467483
···39394040#include <linux/types.h>41414242-#define NES_ABI_USERSPACE_VER 14343-#define NES_ABI_KERNEL_VER 14242+#define NES_ABI_USERSPACE_VER 24343+#define NES_ABI_KERNEL_VER 244444545/*4646 * Make sure that all structs defined in this file remain laid out so···78787979struct nes_create_qp_req {8080 __u64 user_wqe_buffers;8181+ __u64 user_qp_buffer;8182};82838384enum iwnes_memreg_type {
···11+/*******************************************************************22+ * This file is part of the Emulex RoCE Device Driver for *33+ * RoCE (RDMA over Converged Ethernet) adapters. *44+ * Copyright (C) 2008-2014 Emulex. All rights reserved. *55+ * EMULEX and SLI are trademarks of Emulex. *66+ * www.emulex.com *77+ * *88+ * This program is free software; you can redistribute it and/or *99+ * modify it under the terms of version 2 of the GNU General *1010+ * Public License as published by the Free Software Foundation. *1111+ * This program is distributed in the hope that it will be useful. *1212+ * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND *1313+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, *1414+ * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE *1515+ * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *1616+ * TO BE LEGALLY INVALID. See the GNU General Public License for *1717+ * more details, a copy of which can be found in the file COPYING *1818+ * included with this package. *1919+ *2020+ * Contact Information:2121+ * linux-drivers@emulex.com2222+ *2323+ * Emulex2424+ * 3333 Susan Street2525+ * Costa Mesa, CA 926262626+ *******************************************************************/2727+2828+#ifndef __OCRDMA_STATS_H__2929+#define __OCRDMA_STATS_H__3030+3131+#include <linux/debugfs.h>3232+#include "ocrdma.h"3333+#include "ocrdma_hw.h"3434+3535+#define OCRDMA_MAX_DBGFS_MEM 40963636+3737+enum OCRDMA_STATS_TYPE {3838+ OCRDMA_RSRC_STATS,3939+ OCRDMA_RXSTATS,4040+ OCRDMA_WQESTATS,4141+ OCRDMA_TXSTATS,4242+ OCRDMA_DB_ERRSTATS,4343+ OCRDMA_RXQP_ERRSTATS,4444+ OCRDMA_TXQP_ERRSTATS,4545+ OCRDMA_TX_DBG_STATS,4646+ OCRDMA_RX_DBG_STATS4747+};4848+4949+void ocrdma_rem_debugfs(void);5050+void ocrdma_init_debugfs(void);5151+void ocrdma_rem_port_stats(struct ocrdma_dev *dev);5252+void ocrdma_add_port_stats(struct ocrdma_dev *dev);5353+5454+#endif /* __OCRDMA_STATS_H__ */
+96-71
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
···53535454 dev = get_ocrdma_dev(ibdev);5555 memset(sgid, 0, sizeof(*sgid));5656- if (index >= OCRDMA_MAX_SGID)5656+ if (index > OCRDMA_MAX_SGID)5757 return -EINVAL;58585959 memcpy(sgid, &dev->sgid_tbl[index], sizeof(*sgid));···8989 attr->max_cq = dev->attr.max_cq;9090 attr->max_cqe = dev->attr.max_cqe;9191 attr->max_mr = dev->attr.max_mr;9292- attr->max_mw = 0;9292+ attr->max_mw = dev->attr.max_mw;9393 attr->max_pd = dev->attr.max_pd;9494 attr->atomic_cap = 0;9595 attr->max_fmr = 0;···143143 *ib_width = IB_WIDTH_1X;144144 }145145}146146-147146148147int ocrdma_query_port(struct ib_device *ibdev,149148 u8 port, struct ib_port_attr *props)···266267267268 if (udata && uctx) {268269 pd->dpp_enabled =269269- dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY;270270+ ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R;270271 pd->num_dpp_qp =271272 pd->dpp_enabled ? OCRDMA_PD_MAX_DPP_ENABLED_QP : 0;272273 }···837838838839 status = ocrdma_mbx_dealloc_lkey(dev, mr->hwmr.fr_mr, mr->hwmr.lkey);839840840840- if (mr->hwmr.fr_mr == 0)841841- ocrdma_free_mr_pbl_tbl(dev, &mr->hwmr);841841+ ocrdma_free_mr_pbl_tbl(dev, &mr->hwmr);842842843843 /* it could be user registered memory. */844844 if (mr->umem)···906908 spin_lock_init(&cq->comp_handler_lock);907909 INIT_LIST_HEAD(&cq->sq_head);908910 INIT_LIST_HEAD(&cq->rq_head);911911+ cq->first_arm = true;909912910913 if (ib_ctx) {911914 uctx = get_ocrdma_ucontext(ib_ctx);···924925 goto ctx_err;925926 }926927 cq->phase = OCRDMA_CQE_VALID;927927- cq->arm_needed = true;928928 dev->cq_tbl[cq->id] = cq;929929-930929 return &cq->ibcq;931930932931ctx_err:···947950 return status;948951}949952953953+static void ocrdma_flush_cq(struct ocrdma_cq *cq)954954+{955955+ int cqe_cnt;956956+ int valid_count = 0;957957+ unsigned long flags;958958+959959+ struct ocrdma_dev *dev = get_ocrdma_dev(cq->ibcq.device);960960+ struct ocrdma_cqe *cqe = NULL;961961+962962+ cqe = cq->va;963963+ cqe_cnt = cq->cqe_cnt;964964+965965+ /* Last irq might have scheduled a polling thread966966+ * sync-up with it before hard flushing.967967+ */968968+ spin_lock_irqsave(&cq->cq_lock, flags);969969+ while (cqe_cnt) {970970+ if (is_cqe_valid(cq, cqe))971971+ valid_count++;972972+ cqe++;973973+ cqe_cnt--;974974+ }975975+ ocrdma_ring_cq_db(dev, cq->id, false, false, valid_count);976976+ spin_unlock_irqrestore(&cq->cq_lock, flags);977977+}978978+950979int ocrdma_destroy_cq(struct ib_cq *ibcq)951980{952981 int status;953982 struct ocrdma_cq *cq = get_ocrdma_cq(ibcq);983983+ struct ocrdma_eq *eq = NULL;954984 struct ocrdma_dev *dev = get_ocrdma_dev(ibcq->device);955985 int pdid = 0;986986+ u32 irq, indx;987987+988988+ dev->cq_tbl[cq->id] = NULL;989989+ indx = ocrdma_get_eq_table_index(dev, cq->eqn);990990+ if (indx == -EINVAL)991991+ BUG();992992+993993+ eq = &dev->eq_tbl[indx];994994+ irq = ocrdma_get_irq(dev, eq);995995+ synchronize_irq(irq);996996+ ocrdma_flush_cq(cq);956997957998 status = ocrdma_mbx_destroy_cq(dev, cq);958958-959999 if (cq->ucontext) {9601000 pdid = cq->ucontext->cntxt_pd->id;9611001 ocrdma_del_mmap(cq->ucontext, (u64) cq->pa,···1001967 ocrdma_get_db_addr(dev, pdid),1002968 dev->nic_info.db_page_size);1003969 }10041004- dev->cq_tbl[cq->id] = NULL;10059701006971 kfree(cq);1007972 return status;···11231090 }11241091 uresp.db_page_addr = usr_db;11251092 uresp.db_page_size = dev->nic_info.db_page_size;11261126- if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) {11271127- uresp.db_sq_offset = OCRDMA_DB_GEN2_SQ_OFFSET;11281128- uresp.db_rq_offset = OCRDMA_DB_GEN2_RQ_OFFSET;11291129- uresp.db_shift = 24;11301130- } else {11311131- uresp.db_sq_offset = OCRDMA_DB_SQ_OFFSET;11321132- uresp.db_rq_offset = OCRDMA_DB_RQ_OFFSET;11331133- uresp.db_shift = 16;11341134- }10931093+ uresp.db_sq_offset = OCRDMA_DB_GEN2_SQ_OFFSET;10941094+ uresp.db_rq_offset = OCRDMA_DB_GEN2_RQ_OFFSET;10951095+ uresp.db_shift = OCRDMA_DB_RQ_SHIFT;1135109611361097 if (qp->dpp_enabled) {11371098 uresp.dpp_credit = dpp_credit_lmt;···11571130static void ocrdma_set_qp_db(struct ocrdma_dev *dev, struct ocrdma_qp *qp,11581131 struct ocrdma_pd *pd)11591132{11601160- if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) {11331133+ if (ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R) {11611134 qp->sq_db = dev->nic_info.db +11621135 (pd->id * dev->nic_info.db_page_size) +11631136 OCRDMA_DB_GEN2_SQ_OFFSET;···12061179 qp->state = OCRDMA_QPS_RST;12071180 qp->signaled = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR) ? true : false;12081181}12091209-1210118212111183static void ocrdma_store_gsi_qp_cq(struct ocrdma_dev *dev,12121184 struct ib_qp_init_attr *attrs)···12921266 return ERR_PTR(status);12931267}1294126812951295-12961296-static void ocrdma_flush_rq_db(struct ocrdma_qp *qp)12971297-{12981298- if (qp->db_cache) {12991299- u32 val = qp->rq.dbid | (qp->db_cache <<13001300- ocrdma_get_num_posted_shift(qp));13011301- iowrite32(val, qp->rq_db);13021302- qp->db_cache = 0;13031303- }13041304-}13051305-13061269int _ocrdma_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,13071270 int attr_mask)13081271{···13091294 */13101295 if (status < 0)13111296 return status;13121312- status = ocrdma_mbx_modify_qp(dev, qp, attr, attr_mask, old_qps);13131313- if (!status && attr_mask & IB_QP_STATE && attr->qp_state == IB_QPS_RTR)13141314- ocrdma_flush_rq_db(qp);12971297+ status = ocrdma_mbx_modify_qp(dev, qp, attr, attr_mask);1315129813161299 return status;13171300}···15211508 int discard_cnt = 0;15221509 u32 cur_getp, stop_getp;15231510 struct ocrdma_cqe *cqe;15241524- u32 qpn = 0;15111511+ u32 qpn = 0, wqe_idx = 0;1525151215261513 spin_lock_irqsave(&cq->cq_lock, cq_flags);15271514···15501537 if (qpn == 0 || qpn != qp->id)15511538 goto skip_cqe;1552153915531553- /* mark cqe discarded so that it is not picked up later15541554- * in the poll_cq().15551555- */15561556- discard_cnt += 1;15571557- cqe->cmn.qpn = 0;15581540 if (is_cqe_for_sq(cqe)) {15591541 ocrdma_hwq_inc_tail(&qp->sq);15601542 } else {15611543 if (qp->srq) {15441544+ wqe_idx = (le32_to_cpu(cqe->rq.buftag_qpn) >>15451545+ OCRDMA_CQE_BUFTAG_SHIFT) &15461546+ qp->srq->rq.max_wqe_idx;15471547+ if (wqe_idx < 1)15481548+ BUG();15621549 spin_lock_irqsave(&qp->srq->q_lock, flags);15631550 ocrdma_hwq_inc_tail(&qp->srq->rq);15641564- ocrdma_srq_toggle_bit(qp->srq, cur_getp);15511551+ ocrdma_srq_toggle_bit(qp->srq, wqe_idx - 1);15651552 spin_unlock_irqrestore(&qp->srq->q_lock, flags);1566155315671554 } else {15681555 ocrdma_hwq_inc_tail(&qp->rq);15691556 }15701557 }15581558+ /* mark cqe discarded so that it is not picked up later15591559+ * in the poll_cq().15601560+ */15611561+ discard_cnt += 1;15621562+ cqe->cmn.qpn = 0;15711563skip_cqe:15721564 cur_getp = (cur_getp + 1) % cq->max_hw_cqe;15731565 } while (cur_getp != stop_getp);···16751657 (srq->pd->id * dev->nic_info.db_page_size);16761658 uresp.db_page_size = dev->nic_info.db_page_size;16771659 uresp.num_rqe_allocated = srq->rq.max_cnt;16781678- if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) {16601660+ if (ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R) {16791661 uresp.db_rq_offset = OCRDMA_DB_GEN2_RQ_OFFSET;16801662 uresp.db_shift = 24;16811663 } else {···20252007 fast_reg->num_sges = wr->wr.fast_reg.page_list_len;20262008 fast_reg->size_sge =20272009 get_encoded_page_size(1 << wr->wr.fast_reg.page_shift);20282028- mr = (struct ocrdma_mr *) (unsigned long) qp->dev->stag_arr[(hdr->lkey >> 8) &20292029- (OCRDMA_MAX_STAG - 1)];20102010+ mr = (struct ocrdma_mr *) (unsigned long)20112011+ qp->dev->stag_arr[(hdr->lkey >> 8) & (OCRDMA_MAX_STAG - 1)];20302012 build_frmr_pbes(wr, mr->hwmr.pbl_table, &mr->hwmr);20312013 return 0;20322014}2033201520342016static void ocrdma_ring_sq_db(struct ocrdma_qp *qp)20352017{20362036- u32 val = qp->sq.dbid | (1 << 16);20182018+ u32 val = qp->sq.dbid | (1 << OCRDMA_DB_SQ_SHIFT);2037201920382020 iowrite32(val, qp->sq_db);20392021}···2138212021392121static void ocrdma_ring_rq_db(struct ocrdma_qp *qp)21402122{21412141- u32 val = qp->rq.dbid | (1 << ocrdma_get_num_posted_shift(qp));21232123+ u32 val = qp->rq.dbid | (1 << OCRDMA_DB_RQ_SHIFT);2142212421432143- if (qp->state != OCRDMA_QPS_INIT)21442144- iowrite32(val, qp->rq_db);21452145- else21462146- qp->db_cache++;21252125+ iowrite32(val, qp->rq_db);21472126}2148212721492128static void ocrdma_build_rqe(struct ocrdma_hdr_wqe *rqe, struct ib_recv_wr *wr,···2226221122272212 if (row == srq->bit_fields_len)22282213 BUG();22292229- return indx;22142214+ return indx + 1; /* Use from index 1 */22302215}2231221622322217static void ocrdma_ring_srq_db(struct ocrdma_srq *srq)···2563254825642549 srq = get_ocrdma_srq(qp->ibqp.srq);25652550 wqe_idx = (le32_to_cpu(cqe->rq.buftag_qpn) >>25662566- OCRDMA_CQE_BUFTAG_SHIFT) & srq->rq.max_wqe_idx;25512551+ OCRDMA_CQE_BUFTAG_SHIFT) & srq->rq.max_wqe_idx;25522552+ if (wqe_idx < 1)25532553+ BUG();25542554+25672555 ibwc->wr_id = srq->rqe_wr_id_tbl[wqe_idx];25682556 spin_lock_irqsave(&srq->q_lock, flags);25692569- ocrdma_srq_toggle_bit(srq, wqe_idx);25572557+ ocrdma_srq_toggle_bit(srq, wqe_idx - 1);25702558 spin_unlock_irqrestore(&srq->q_lock, flags);25712559 ocrdma_hwq_inc_tail(&srq->rq);25722560}···27212703 }27222704stop_cqe:27232705 cq->getp = cur_getp;27242724- if (polled_hw_cqes || expand || stop) {27252725- ocrdma_ring_cq_db(dev, cq->id, cq->armed, cq->solicited,27062706+ if (cq->deferred_arm) {27072707+ ocrdma_ring_cq_db(dev, cq->id, true, cq->deferred_sol,27262708 polled_hw_cqes);27092709+ cq->deferred_arm = false;27102710+ cq->deferred_sol = false;27112711+ } else {27122712+ /* We need to pop the CQE. No need to arm */27132713+ ocrdma_ring_cq_db(dev, cq->id, false, cq->deferred_sol,27142714+ polled_hw_cqes);27152715+ cq->deferred_sol = false;27272716 }27172717+27282718 return i;27292719}27302720···28042778 struct ocrdma_cq *cq = get_ocrdma_cq(ibcq);28052779 struct ocrdma_dev *dev = get_ocrdma_dev(ibcq->device);28062780 u16 cq_id;28072807- u16 cur_getp;28082808- struct ocrdma_cqe *cqe;28092781 unsigned long flags;27822782+ bool arm_needed = false, sol_needed = false;2810278328112784 cq_id = cq->id;2812278528132786 spin_lock_irqsave(&cq->cq_lock, flags);28142787 if (cq_flags & IB_CQ_NEXT_COMP || cq_flags & IB_CQ_SOLICITED)28152815- cq->armed = true;27882788+ arm_needed = true;28162789 if (cq_flags & IB_CQ_SOLICITED)28172817- cq->solicited = true;27902790+ sol_needed = true;2818279128192819- cur_getp = cq->getp;28202820- cqe = cq->va + cur_getp;28212821-28222822- /* check whether any valid cqe exist or not, if not then safe to28232823- * arm. If cqe is not yet consumed, then let it get consumed and then28242824- * we arm it to avoid false interrupts.28252825- */28262826- if (!is_cqe_valid(cq, cqe) || cq->arm_needed) {28272827- cq->arm_needed = false;28282828- ocrdma_ring_cq_db(dev, cq_id, cq->armed, cq->solicited, 0);27922792+ if (cq->first_arm) {27932793+ ocrdma_ring_cq_db(dev, cq_id, arm_needed, sol_needed, 0);27942794+ cq->first_arm = false;27952795+ goto skip_defer;28292796 }27972797+ cq->deferred_arm = true;27982798+27992799+skip_defer:28002800+ cq->deferred_sol = sol_needed;28302801 spin_unlock_irqrestore(&cq->cq_lock, flags);28022802+28312803 return 0;28322804}28332805···28602836 goto mbx_err;28612837 mr->ibmr.rkey = mr->hwmr.lkey;28622838 mr->ibmr.lkey = mr->hwmr.lkey;28632863- dev->stag_arr[(mr->hwmr.lkey >> 8) & (OCRDMA_MAX_STAG - 1)] = mr;28392839+ dev->stag_arr[(mr->hwmr.lkey >> 8) & (OCRDMA_MAX_STAG - 1)] =28402840+ (unsigned long) mr;28642841 return &mr->ibmr;28652842mbx_err:28662843 ocrdma_free_mr_pbl_tbl(dev, &mr->hwmr);
+9-3
drivers/infiniband/hw/qib/qib.h
···868868 /* last buffer for user use */869869 u32 lastctxt_piobuf;870870871871- /* saturating counter of (non-port-specific) device interrupts */872872- u32 int_counter;871871+ /* reset value */872872+ u64 z_int_counter;873873+ /* percpu intcounter */874874+ u64 __percpu *int_counter;873875874876 /* pio bufs allocated per ctxt */875877 u32 pbufsctxt;···11861184void qib_set_ctxtcnt(struct qib_devdata *);11871185int qib_create_ctxts(struct qib_devdata *dd);11881186struct qib_ctxtdata *qib_create_ctxtdata(struct qib_pportdata *, u32, int);11891189-void qib_init_pportdata(struct qib_pportdata *, struct qib_devdata *, u8, u8);11871187+int qib_init_pportdata(struct qib_pportdata *, struct qib_devdata *, u8, u8);11901188void qib_free_ctxtdata(struct qib_devdata *, struct qib_ctxtdata *);1191118911921190u32 qib_kreceive(struct qib_ctxtdata *, u32 *, u32 *);···14511449void qib_nomsix(struct qib_devdata *);14521450void qib_pcie_getcmd(struct qib_devdata *, u16 *, u8 *, u8 *);14531451void qib_pcie_reenable(struct qib_devdata *, u16, u8, u8);14521452+/* interrupts for device */14531453+u64 qib_int_counter(struct qib_devdata *);14541454+/* interrupt for all devices */14551455+u64 qib_sps_ints(void);1454145614551457/*14561458 * dma_addr wrappers - all 0's invalid for hw
+26-26
drivers/infiniband/hw/qib/qib_diag.c
···546546 size_t count, loff_t *off)547547{548548 u32 __iomem *piobuf;549549- u32 plen, clen, pbufn;549549+ u32 plen, pbufn, maxlen_reserve;550550 struct qib_diag_xpkt dp;551551 u32 *tmpbuf = NULL;552552 struct qib_devdata *dd;···590590 }591591 ppd = &dd->pport[dp.port - 1];592592593593- /* need total length before first word written */594594- /* +1 word is for the qword padding */595595- plen = sizeof(u32) + dp.len;596596- clen = dp.len >> 2;597597-598598- if ((plen + 4) > ppd->ibmaxlen) {593593+ /*594594+ * need total length before first word written, plus 2 Dwords. One Dword595595+ * is for padding so we get the full user data when not aligned on596596+ * a word boundary. The other Dword is to make sure we have room for the597597+ * ICRC which gets tacked on later.598598+ */599599+ maxlen_reserve = 2 * sizeof(u32);600600+ if (dp.len > ppd->ibmaxlen - maxlen_reserve) {599601 ret = -EINVAL;600600- goto bail; /* before writing pbc */602602+ goto bail;601603 }604604+605605+ plen = sizeof(u32) + dp.len;606606+602607 tmpbuf = vmalloc(plen);603608 if (!tmpbuf) {604609 qib_devinfo(dd->pcidev,···643638 */644639 if (dd->flags & QIB_PIO_FLUSH_WC) {645640 qib_flush_wc();646646- qib_pio_copy(piobuf + 2, tmpbuf, clen - 1);641641+ qib_pio_copy(piobuf + 2, tmpbuf, plen - 1);647642 qib_flush_wc();648648- __raw_writel(tmpbuf[clen - 1], piobuf + clen + 1);643643+ __raw_writel(tmpbuf[plen - 1], piobuf + plen + 1);649644 } else650650- qib_pio_copy(piobuf + 2, tmpbuf, clen);645645+ qib_pio_copy(piobuf + 2, tmpbuf, plen);651646652647 if (dd->flags & QIB_USE_SPCL_TRIG) {653648 u32 spcl_off = (pbufn >= dd->piobcnt2k) ? 2047 : 1023;···694689 const struct diag_observer *op)695690{696691 struct diag_observer_list_elt *olp;697697- int ret = -EINVAL;692692+ unsigned long flags;698693699694 if (!dd || !op)700700- goto bail;701701- ret = -ENOMEM;695695+ return -EINVAL;702696 olp = vmalloc(sizeof *olp);703697 if (!olp) {704698 pr_err("vmalloc for observer failed\n");705705- goto bail;699699+ return -ENOMEM;706700 }707707- if (olp) {708708- unsigned long flags;709701710710- spin_lock_irqsave(&dd->qib_diag_trans_lock, flags);711711- olp->op = op;712712- olp->next = dd->diag_observer_list;713713- dd->diag_observer_list = olp;714714- spin_unlock_irqrestore(&dd->qib_diag_trans_lock, flags);715715- ret = 0;716716- }717717-bail:718718- return ret;702702+ spin_lock_irqsave(&dd->qib_diag_trans_lock, flags);703703+ olp->op = op;704704+ olp->next = dd->diag_observer_list;705705+ dd->diag_observer_list = olp;706706+ spin_unlock_irqrestore(&dd->qib_diag_trans_lock, flags);707707+708708+ return 0;719709}720710721711/* Remove all registered observers when device is closed */
···16341634 goto bail;16351635 }1636163616371637- qib_stats.sps_ints++;16381638- if (dd->int_counter != (u32) -1)16391639- dd->int_counter++;16371637+ this_cpu_inc(*dd->int_counter);1640163816411639 if (unlikely(istat & (~QLOGIC_IB_I_BITSEXTANT |16421640 QLOGIC_IB_I_GPIO | QLOGIC_IB_I_ERROR)))···18061808 * isn't set.18071809 */18081810 dd->flags &= ~(QIB_INITTED | QIB_PRESENT);18091809- dd->int_counter = 0; /* so we check interrupts work again */18111811+ /* so we check interrupts work again */18121812+ dd->z_int_counter = qib_int_counter(dd);18101813 val = dd->control | QLOGIC_IB_C_RESET;18111814 writeq(val, &dd->kregbase[kr_control]);18121815 mb(); /* prevent compiler re-ordering around actual reset */···3265326632663267 dd->eep_st_masks[2].errs_to_log = ERR_MASK(ResetNegated);3267326832683268- qib_init_pportdata(ppd, dd, 0, 1);32693269+ ret = qib_init_pportdata(ppd, dd, 0, 1);32703270+ if (ret)32713271+ goto bail;32693272 ppd->link_width_supported = IB_WIDTH_1X | IB_WIDTH_4X;32703273 ppd->link_speed_supported = QIB_IB_SDR;32713274 ppd->link_width_enabled = IB_WIDTH_4X;
+6-6
drivers/infiniband/hw/qib/qib_iba7220.c
···19621962 goto bail;19631963 }1964196419651965- qib_stats.sps_ints++;19661966- if (dd->int_counter != (u32) -1)19671967- dd->int_counter++;19681968-19651965+ this_cpu_inc(*dd->int_counter);19691966 if (unlikely(istat & (~QLOGIC_IB_I_BITSEXTANT |19701967 QLOGIC_IB_I_GPIO | QLOGIC_IB_I_ERROR)))19711968 unlikely_7220_intr(dd, istat);···21172120 * isn't set.21182121 */21192122 dd->flags &= ~(QIB_INITTED | QIB_PRESENT);21202120- dd->int_counter = 0; /* so we check interrupts work again */21232123+ /* so we check interrupts work again */21242124+ dd->z_int_counter = qib_int_counter(dd);21212125 val = dd->control | QLOGIC_IB_C_RESET;21222126 writeq(val, &dd->kregbase[kr_control]);21232127 mb(); /* prevent compiler reordering around actual reset */···40594061 init_waitqueue_head(&cpspec->autoneg_wait);40604062 INIT_DELAYED_WORK(&cpspec->autoneg_work, autoneg_7220_work);4061406340624062- qib_init_pportdata(ppd, dd, 0, 1);40644064+ ret = qib_init_pportdata(ppd, dd, 0, 1);40654065+ if (ret)40664066+ goto bail;40634067 ppd->link_width_supported = IB_WIDTH_1X | IB_WIDTH_4X;40644068 ppd->link_speed_supported = QIB_IB_SDR | QIB_IB_DDR;40654069
+14-23
drivers/infiniband/hw/qib/qib_iba7322.c
···31153115 goto bail;31163116 }3117311731183118- qib_stats.sps_ints++;31193119- if (dd->int_counter != (u32) -1)31203120- dd->int_counter++;31183118+ this_cpu_inc(*dd->int_counter);3121311931223120 /* handle "errors" of various kinds first, device ahead of port */31233121 if (unlikely(istat & (~QIB_I_BITSEXTANT | QIB_I_GPIO |···31843186 */31853187 return IRQ_HANDLED;3186318831873187- qib_stats.sps_ints++;31883188- if (dd->int_counter != (u32) -1)31893189- dd->int_counter++;31893189+ this_cpu_inc(*dd->int_counter);3190319031913191 /* Clear the interrupt bit we expect to be set. */31923192 qib_write_kreg(dd, kr_intclear, ((1ULL << QIB_I_RCVAVAIL_LSB) |···32113215 */32123216 return IRQ_HANDLED;3213321732143214- qib_stats.sps_ints++;32153215- if (dd->int_counter != (u32) -1)32163216- dd->int_counter++;32183218+ this_cpu_inc(*dd->int_counter);3217321932183220 /* Clear the interrupt bit we expect to be set. */32193221 qib_write_kreg(dd, kr_intclear, QIB_I_SPIOBUFAVAIL);···32423248 */32433249 return IRQ_HANDLED;3244325032453245- qib_stats.sps_ints++;32463246- if (dd->int_counter != (u32) -1)32473247- dd->int_counter++;32513251+ this_cpu_inc(*dd->int_counter);3248325232493253 /* Clear the interrupt bit we expect to be set. */32503254 qib_write_kreg(dd, kr_intclear, ppd->hw_pidx ?···32693277 */32703278 return IRQ_HANDLED;3271327932723272- qib_stats.sps_ints++;32733273- if (dd->int_counter != (u32) -1)32743274- dd->int_counter++;32803280+ this_cpu_inc(*dd->int_counter);3275328132763282 /* Clear the interrupt bit we expect to be set. */32773283 qib_write_kreg(dd, kr_intclear, ppd->hw_pidx ?···32963306 */32973307 return IRQ_HANDLED;3298330832993299- qib_stats.sps_ints++;33003300- if (dd->int_counter != (u32) -1)33013301- dd->int_counter++;33093309+ this_cpu_inc(*dd->int_counter);3302331033033311 /* Clear the interrupt bit we expect to be set. */33043312 qib_write_kreg(dd, kr_intclear, ppd->hw_pidx ?···33243336 */33253337 return IRQ_HANDLED;3326333833273327- qib_stats.sps_ints++;33283328- if (dd->int_counter != (u32) -1)33293329- dd->int_counter++;33393339+ this_cpu_inc(*dd->int_counter);3330334033313341 /* Clear the interrupt bit we expect to be set. */33323342 qib_write_kreg(dd, kr_intclear, ppd->hw_pidx ?···37093723 dd->pport->cpspec->ibsymdelta = 0;37103724 dd->pport->cpspec->iblnkerrdelta = 0;37113725 dd->pport->cpspec->ibmalfdelta = 0;37123712- dd->int_counter = 0; /* so we check interrupts work again */37263726+ /* so we check interrupts work again */37273727+ dd->z_int_counter = qib_int_counter(dd);3713372837143729 /*37153730 * Keep chip from being accessed until we are ready. Use···65446557 }6545655865466559 dd->num_pports++;65476547- qib_init_pportdata(ppd, dd, pidx, dd->num_pports);65606560+ ret = qib_init_pportdata(ppd, dd, pidx, dd->num_pports);65616561+ if (ret) {65626562+ dd->num_pports--;65636563+ goto bail;65646564+ }6548656565496566 ppd->link_width_supported = IB_WIDTH_1X | IB_WIDTH_4X;65506567 ppd->link_width_enabled = IB_WIDTH_4X;
+67-29
drivers/infiniband/hw/qib/qib_init.c
···130130int qib_create_ctxts(struct qib_devdata *dd)131131{132132 unsigned i;133133- int ret;134133 int local_node_id = pcibus_to_node(dd->pcidev->bus);135134136135 if (local_node_id < 0)···144145 if (!dd->rcd) {145146 qib_dev_err(dd,146147 "Unable to allocate ctxtdata array, failing\n");147147- ret = -ENOMEM;148148- goto done;148148+ return -ENOMEM;149149 }150150151151 /* create (one or more) kctxt */···161163 if (!rcd) {162164 qib_dev_err(dd,163165 "Unable to allocate ctxtdata for Kernel ctxt, failing\n");164164- ret = -ENOMEM;165165- goto done;166166+ kfree(dd->rcd);167167+ dd->rcd = NULL;168168+ return -ENOMEM;166169 }167170 rcd->pkeys[0] = QIB_DEFAULT_P_KEY;168171 rcd->seq_cnt = 1;169172 }170170- ret = 0;171171-done:172172- return ret;173173+ return 0;173174}174175175176/*···230233/*231234 * Common code for initializing the physical port structure.232235 */233233-void qib_init_pportdata(struct qib_pportdata *ppd, struct qib_devdata *dd,236236+int qib_init_pportdata(struct qib_pportdata *ppd, struct qib_devdata *dd,234237 u8 hw_pidx, u8 port)235238{236239 int size;···240243241244 spin_lock_init(&ppd->sdma_lock);242245 spin_lock_init(&ppd->lflags_lock);246246+ spin_lock_init(&ppd->cc_shadow_lock);243247 init_waitqueue_head(&ppd->state_wait);244248245249 init_timer(&ppd->symerr_clear_timer);···248250 ppd->symerr_clear_timer.data = (unsigned long)ppd;249251250252 ppd->qib_wq = NULL;251251-252252- spin_lock_init(&ppd->cc_shadow_lock);253253+ ppd->ibport_data.pmastats =254254+ alloc_percpu(struct qib_pma_counters);255255+ if (!ppd->ibport_data.pmastats)256256+ return -ENOMEM;253257254258 if (qib_cc_table_size < IB_CCT_MIN_ENTRIES)255259 goto bail;···299299 goto bail_3;300300 }301301302302- return;302302+ return 0;303303304304bail_3:305305 kfree(ppd->ccti_entries_shadow);···313313bail:314314 /* User is intentionally disabling the congestion control agent */315315 if (!qib_cc_table_size)316316- return;316316+ return 0;317317318318 if (qib_cc_table_size < IB_CCT_MIN_ENTRIES) {319319 qib_cc_table_size = 0;···324324325325 qib_dev_err(dd, "Congestion Control Agent disabled for port %d\n",326326 port);327327- return;327327+ return 0;328328}329329330330static int init_pioavailregs(struct qib_devdata *dd)···525525static void verify_interrupt(unsigned long opaque)526526{527527 struct qib_devdata *dd = (struct qib_devdata *) opaque;528528+ u64 int_counter;528529529530 if (!dd)530531 return; /* being torn down */···534533 * If we don't have a lid or any interrupts, let the user know and535534 * don't bother checking again.536535 */537537- if (dd->int_counter == 0) {536536+ int_counter = qib_int_counter(dd) - dd->z_int_counter;537537+ if (int_counter == 0) {538538 if (!dd->f_intr_fallback(dd))539539 dev_err(&dd->pcidev->dev,540540 "No interrupts detected, not usable.\n");···633631 }634632 }635633 return -ENOMEM;634634+}635635+636636+static void qib_free_pportdata(struct qib_pportdata *ppd)637637+{638638+ free_percpu(ppd->ibport_data.pmastats);639639+ ppd->ibport_data.pmastats = NULL;636640}637641638642/**···928920 destroy_workqueue(ppd->qib_wq);929921 ppd->qib_wq = NULL;930922 }923923+ qib_free_pportdata(ppd);931924 }932925933926 qib_update_eeprom_log(dd);···10881079#ifdef CONFIG_DEBUG_FS10891080 qib_dbg_ibdev_exit(&dd->verbs_dev);10901081#endif10821082+ free_percpu(dd->int_counter);10911083 ib_dealloc_device(&dd->verbs_dev.ibdev);10841084+}10851085+10861086+u64 qib_int_counter(struct qib_devdata *dd)10871087+{10881088+ int cpu;10891089+ u64 int_counter = 0;10901090+10911091+ for_each_possible_cpu(cpu)10921092+ int_counter += *per_cpu_ptr(dd->int_counter, cpu);10931093+ return int_counter;10941094+}10951095+10961096+u64 qib_sps_ints(void)10971097+{10981098+ unsigned long flags;10991099+ struct qib_devdata *dd;11001100+ u64 sps_ints = 0;11011101+11021102+ spin_lock_irqsave(&qib_devs_lock, flags);11031103+ list_for_each_entry(dd, &qib_dev_list, list) {11041104+ sps_ints += qib_int_counter(dd);11051105+ }11061106+ spin_unlock_irqrestore(&qib_devs_lock, flags);11071107+ return sps_ints;10921108}1093110910941110/*···11311097 int ret;1132109811331099 dd = (struct qib_devdata *) ib_alloc_device(sizeof(*dd) + extra);11341134- if (!dd) {11351135- dd = ERR_PTR(-ENOMEM);11361136- goto bail;11371137- }11001100+ if (!dd)11011101+ return ERR_PTR(-ENOMEM);1138110211391139-#ifdef CONFIG_DEBUG_FS11401140- qib_dbg_ibdev_init(&dd->verbs_dev);11411141-#endif11031103+ INIT_LIST_HEAD(&dd->list);1142110411431105 idr_preload(GFP_KERNEL);11441106 spin_lock_irqsave(&qib_devs_lock, flags);···11511121 if (ret < 0) {11521122 qib_early_err(&pdev->dev,11531123 "Could not allocate unit ID: error %d\n", -ret);11541154-#ifdef CONFIG_DEBUG_FS11551155- qib_dbg_ibdev_exit(&dd->verbs_dev);11561156-#endif11571157- ib_dealloc_device(&dd->verbs_dev.ibdev);11581158- dd = ERR_PTR(ret);11241124+ goto bail;11251125+ }11261126+ dd->int_counter = alloc_percpu(u64);11271127+ if (!dd->int_counter) {11281128+ ret = -ENOMEM;11291129+ qib_early_err(&pdev->dev,11301130+ "Could not allocate per-cpu int_counter\n");11591131 goto bail;11601132 }11611133···11711139 qib_early_err(&pdev->dev,11721140 "Could not alloc cpulist info, cpu affinity might be wrong\n");11731141 }11741174-11751175-bail:11421142+#ifdef CONFIG_DEBUG_FS11431143+ qib_dbg_ibdev_init(&dd->verbs_dev);11441144+#endif11761145 return dd;11461146+bail:11471147+ if (!list_empty(&dd->list))11481148+ list_del_init(&dd->list);11491149+ ib_dealloc_device(&dd->verbs_dev.ibdev);11501150+ return ERR_PTR(ret);;11771151}1178115211791153/*
···664664 struct qib_opcode_stats stats[128];665665};666666667667+struct qib_pma_counters {668668+ u64 n_unicast_xmit; /* total unicast packets sent */669669+ u64 n_unicast_rcv; /* total unicast packets received */670670+ u64 n_multicast_xmit; /* total multicast packets sent */671671+ u64 n_multicast_rcv; /* total multicast packets received */672672+};673673+667674struct qib_ibport {668675 struct qib_qp __rcu *qp0;669676 struct qib_qp __rcu *qp1;···687680 __be64 mkey;688681 __be64 guids[QIB_GUIDS_PER_PORT - 1]; /* writable GUIDs */689682 u64 tid; /* TID for traps */690690- u64 n_unicast_xmit; /* total unicast packets sent */691691- u64 n_unicast_rcv; /* total unicast packets received */692692- u64 n_multicast_xmit; /* total multicast packets sent */693693- u64 n_multicast_rcv; /* total multicast packets received */683683+ struct qib_pma_counters __percpu *pmastats;684684+ u64 z_unicast_xmit; /* starting count for PMA */685685+ u64 z_unicast_rcv; /* starting count for PMA */686686+ u64 z_multicast_xmit; /* starting count for PMA */687687+ u64 z_multicast_rcv; /* starting count for PMA */694688 u64 z_symbol_error_counter; /* starting count for PMA */695689 u64 z_link_error_recovery_counter; /* starting count for PMA */696690 u64 z_link_downed_counter; /* starting count for PMA */
+1-1
drivers/infiniband/hw/usnic/usnic_uiom.c
···286286 err = iommu_map(pd->domain, va_start, pa_start,287287 size, flags);288288 if (err) {289289- usnic_err("Failed to map va 0x%lx pa 0x%pa size 0x%zx with err %d\n",289289+ usnic_err("Failed to map va 0x%lx pa %pa size 0x%zx with err %d\n",290290 va_start, &pa_start, size, err);291291 goto err_out;292292 }
+64-29
drivers/infiniband/ulp/iser/iscsi_iser.c
···55 * Copyright (C) 2004 Alex Aizman66 * Copyright (C) 2005 Mike Christie77 * Copyright (c) 2005, 2006 Voltaire, Inc. All rights reserved.88- * Copyright (c) 2013 Mellanox Technologies. All rights reserved.88+ * Copyright (c) 2013-2014 Mellanox Technologies. All rights reserved.99 * maintained by openib-general@openib.org1010 *1111 * This software is available to you under a choice of one of two···8282module_param_named(max_lun, iscsi_max_lun, uint, S_IRUGO);83838484int iser_debug_level = 0;8585+bool iser_pi_enable = false;8686+int iser_pi_guard = 0;85878688MODULE_DESCRIPTION("iSER (iSCSI Extensions for RDMA) Datamover");8789MODULE_LICENSE("Dual BSD/GPL");···92909391module_param_named(debug_level, iser_debug_level, int, 0644);9492MODULE_PARM_DESC(debug_level, "Enable debug tracing if > 0 (default:disabled)");9393+9494+module_param_named(pi_enable, iser_pi_enable, bool, 0644);9595+MODULE_PARM_DESC(pi_enable, "Enable T10-PI offload support (default:disabled)");9696+9797+module_param_named(pi_guard, iser_pi_guard, int, 0644);9898+MODULE_PARM_DESC(pi_guard, "T10-PI guard_type, 0:CRC|1:IP_CSUM (default:CRC)");959996100struct iser_global ig;97101···146138int iser_initialize_task_headers(struct iscsi_task *task,147139 struct iser_tx_desc *tx_desc)148140{149149- struct iscsi_iser_conn *iser_conn = task->conn->dd_data;150150- struct iser_device *device = iser_conn->ib_conn->device;141141+ struct iser_conn *ib_conn = task->conn->dd_data;142142+ struct iser_device *device = ib_conn->device;151143 struct iscsi_iser_task *iser_task = task->dd_data;152144 u64 dma_addr;153145···161153 tx_desc->tx_sg[0].length = ISER_HEADERS_LEN;162154 tx_desc->tx_sg[0].lkey = device->mr->lkey;163155164164- iser_task->iser_conn = iser_conn;156156+ iser_task->ib_conn = ib_conn;165157 return 0;166158}167159/**···184176185177 iser_task->command_sent = 0;186178 iser_task_rdma_init(iser_task);179179+ iser_task->sc = task->sc;180180+187181 return 0;188182}189183···288278static void iscsi_iser_cleanup_task(struct iscsi_task *task)289279{290280 struct iscsi_iser_task *iser_task = task->dd_data;291291- struct iser_tx_desc *tx_desc = &iser_task->desc;292292-293293- struct iscsi_iser_conn *iser_conn = task->conn->dd_data;294294- struct iser_device *device = iser_conn->ib_conn->device;281281+ struct iser_tx_desc *tx_desc = &iser_task->desc;282282+ struct iser_conn *ib_conn = task->conn->dd_data;283283+ struct iser_device *device = ib_conn->device;295284296285 ib_dma_unmap_single(device->ib_device,297286 tx_desc->dma_addr, ISER_HEADERS_LEN, DMA_TO_DEVICE);···305296 }306297}307298299299+static u8 iscsi_iser_check_protection(struct iscsi_task *task, sector_t *sector)300300+{301301+ struct iscsi_iser_task *iser_task = task->dd_data;302302+303303+ if (iser_task->dir[ISER_DIR_IN])304304+ return iser_check_task_pi_status(iser_task, ISER_DIR_IN,305305+ sector);306306+ else307307+ return iser_check_task_pi_status(iser_task, ISER_DIR_OUT,308308+ sector);309309+}310310+308311static struct iscsi_cls_conn *309312iscsi_iser_conn_create(struct iscsi_cls_session *cls_session, uint32_t conn_idx)310313{311314 struct iscsi_conn *conn;312315 struct iscsi_cls_conn *cls_conn;313313- struct iscsi_iser_conn *iser_conn;314316315315- cls_conn = iscsi_conn_setup(cls_session, sizeof(*iser_conn), conn_idx);317317+ cls_conn = iscsi_conn_setup(cls_session, 0, conn_idx);316318 if (!cls_conn)317319 return NULL;318320 conn = cls_conn->dd_data;···334314 */335315 conn->max_recv_dlength = ISER_RECV_DATA_SEG_LEN;336316337337- iser_conn = conn->dd_data;338338- conn->dd_data = iser_conn;339339- iser_conn->iscsi_conn = conn;340340-341317 return cls_conn;342318}343319···341325iscsi_iser_conn_destroy(struct iscsi_cls_conn *cls_conn)342326{343327 struct iscsi_conn *conn = cls_conn->dd_data;344344- struct iscsi_iser_conn *iser_conn = conn->dd_data;345345- struct iser_conn *ib_conn = iser_conn->ib_conn;328328+ struct iser_conn *ib_conn = conn->dd_data;346329347330 iscsi_conn_teardown(cls_conn);348331 /*···350335 * we free it here.351336 */352337 if (ib_conn) {353353- ib_conn->iser_conn = NULL;338338+ ib_conn->iscsi_conn = NULL;354339 iser_conn_put(ib_conn, 1); /* deref iscsi/ib conn unbinding */355340 }356341}···361346 int is_leading)362347{363348 struct iscsi_conn *conn = cls_conn->dd_data;364364- struct iscsi_iser_conn *iser_conn;365349 struct iscsi_session *session;366350 struct iser_conn *ib_conn;367351 struct iscsi_endpoint *ep;···387373 /* binds the iSER connection retrieved from the previously388374 * connected ep_handle to the iSCSI layer connection. exchanges389375 * connection pointers */390390- iser_info("binding iscsi/iser conn %p %p to ib_conn %p\n",391391- conn, conn->dd_data, ib_conn);392392- iser_conn = conn->dd_data;393393- ib_conn->iser_conn = iser_conn;394394- iser_conn->ib_conn = ib_conn;376376+ iser_info("binding iscsi conn %p to ib_conn %p\n", conn, ib_conn);377377+378378+ conn->dd_data = ib_conn;379379+ ib_conn->iscsi_conn = conn;380380+395381 iser_conn_get(ib_conn); /* ref iscsi/ib conn binding */396382 return 0;397383}···400386iscsi_iser_conn_stop(struct iscsi_cls_conn *cls_conn, int flag)401387{402388 struct iscsi_conn *conn = cls_conn->dd_data;403403- struct iscsi_iser_conn *iser_conn = conn->dd_data;404404- struct iser_conn *ib_conn = iser_conn->ib_conn;389389+ struct iser_conn *ib_conn = conn->dd_data;405390406391 /*407392 * Userspace may have goofed up and not bound the connection or···414401 */415402 iser_conn_put(ib_conn, 1); /* deref iscsi/ib conn unbinding */416403 }417417- iser_conn->ib_conn = NULL;404404+ conn->dd_data = NULL;418405}419406420407static void iscsi_iser_session_destroy(struct iscsi_cls_session *cls_session)···424411 iscsi_session_teardown(cls_session);425412 iscsi_host_remove(shost);426413 iscsi_host_free(shost);414414+}415415+416416+static inline unsigned int417417+iser_dif_prot_caps(int prot_caps)418418+{419419+ return ((prot_caps & IB_PROT_T10DIF_TYPE_1) ? SHOST_DIF_TYPE1_PROTECTION |420420+ SHOST_DIX_TYPE1_PROTECTION : 0) |421421+ ((prot_caps & IB_PROT_T10DIF_TYPE_2) ? SHOST_DIF_TYPE2_PROTECTION |422422+ SHOST_DIX_TYPE2_PROTECTION : 0) |423423+ ((prot_caps & IB_PROT_T10DIF_TYPE_3) ? SHOST_DIF_TYPE3_PROTECTION |424424+ SHOST_DIX_TYPE3_PROTECTION : 0);427425}428426429427static struct iscsi_cls_session *···461437 * older userspace tools (before 2.0-870) did not pass us462438 * the leading conn's ep so this will be NULL;463439 */464464- if (ep)440440+ if (ep) {465441 ib_conn = ep->dd_data;442442+ if (ib_conn->pi_support) {443443+ u32 sig_caps = ib_conn->device->dev_attr.sig_prot_cap;444444+445445+ scsi_host_set_prot(shost, iser_dif_prot_caps(sig_caps));446446+ if (iser_pi_guard)447447+ scsi_host_set_guard(shost, SHOST_DIX_GUARD_IP);448448+ else449449+ scsi_host_set_guard(shost, SHOST_DIX_GUARD_CRC);450450+ }451451+ }466452467453 if (iscsi_host_add(shost,468454 ep ? ib_conn->device->ib_device->dma_device : NULL))···652618 struct iser_conn *ib_conn;653619654620 ib_conn = ep->dd_data;655655- if (ib_conn->iser_conn)621621+ if (ib_conn->iscsi_conn)656622 /*657623 * Must suspend xmit path if the ep is bound to the658624 * iscsi_conn, so we know we are not accessing the ib_conn···660626 *661627 * This may not be bound if the ep poll failed.662628 */663663- iscsi_suspend_tx(ib_conn->iser_conn->iscsi_conn);629629+ iscsi_suspend_tx(ib_conn->iscsi_conn);664630665631666632 iser_info("ib conn %p state %d\n", ib_conn, ib_conn->state);···766732 .xmit_task = iscsi_iser_task_xmit,767733 .cleanup_task = iscsi_iser_cleanup_task,768734 .alloc_pdu = iscsi_iser_pdu_alloc,735735+ .check_protection = iscsi_iser_check_protection,769736 /* recovery */770737 .session_recovery_timedout = iscsi_session_recovery_timedout,771738
+62-23
drivers/infiniband/ulp/iser/iscsi_iser.h
···88 *99 * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved.1010 * Copyright (c) 2005, 2006 Cisco Systems. All rights reserved.1111- * Copyright (c) 2013 Mellanox Technologies. All rights reserved.1111+ * Copyright (c) 2013-2014 Mellanox Technologies. All rights reserved.1212 *1313 * This software is available to you under a choice of one of two1414 * licenses. You may choose to be licensed under the terms of the GNU···4646#include <linux/printk.h>4747#include <scsi/libiscsi.h>4848#include <scsi/scsi_transport_iscsi.h>4949+#include <scsi/scsi_cmnd.h>5050+#include <scsi/scsi_device.h>49515052#include <linux/interrupt.h>5153#include <linux/wait.h>···69677068#define DRV_NAME "iser"7169#define PFX DRV_NAME ": "7272-#define DRV_VER "1.1"7070+#define DRV_VER "1.3"73717472#define iser_dbg(fmt, arg...) \7573 do { \···136134 ISER_MAX_TX_MISC_PDUS + \137135 ISER_MAX_RX_MISC_PDUS)138136137137+/* Max registration work requests per command */138138+#define ISER_MAX_REG_WR_PER_CMD 5139139+140140+/* For Signature we don't support DATAOUTs so no need to make room for them */141141+#define ISER_QP_SIG_MAX_REQ_DTOS (ISER_DEF_XMIT_CMDS_MAX * \142142+ (1 + ISER_MAX_REG_WR_PER_CMD) + \143143+ ISER_MAX_TX_MISC_PDUS + \144144+ ISER_MAX_RX_MISC_PDUS)145145+139146#define ISER_VER 0x10140147#define ISER_WSV 0x08141148#define ISER_RSV 0x04149149+150150+#define ISER_FASTREG_LI_WRID 0xffffffffffffffffULL142151143152struct iser_hdr {144153 u8 flags;···214201/* fwd declarations */215202struct iser_device;216203struct iser_cq_desc;217217-struct iscsi_iser_conn;218204struct iscsi_iser_task;219205struct iscsi_endpoint;220206···270258struct iser_device {271259 struct ib_device *ib_device;272260 struct ib_pd *pd;261261+ struct ib_device_attr dev_attr;273262 struct ib_cq *rx_cq[ISER_MAX_CQ];274263 struct ib_cq *tx_cq[ISER_MAX_CQ];275264 struct ib_mr *mr;···290277 enum iser_data_dir cmd_dir);291278};292279280280+#define ISER_CHECK_GUARD 0xc0281281+#define ISER_CHECK_REFTAG 0x0f282282+#define ISER_CHECK_APPTAG 0x30283283+284284+enum iser_reg_indicator {285285+ ISER_DATA_KEY_VALID = 1 << 0,286286+ ISER_PROT_KEY_VALID = 1 << 1,287287+ ISER_SIG_KEY_VALID = 1 << 2,288288+ ISER_FASTREG_PROTECTED = 1 << 3,289289+};290290+291291+struct iser_pi_context {292292+ struct ib_mr *prot_mr;293293+ struct ib_fast_reg_page_list *prot_frpl;294294+ struct ib_mr *sig_mr;295295+};296296+293297struct fast_reg_descriptor {294298 struct list_head list;295299 /* For fast registration - FRWR */296300 struct ib_mr *data_mr;297301 struct ib_fast_reg_page_list *data_frpl;298298- /* Valid for fast registration flag */299299- bool valid;302302+ struct iser_pi_context *pi_ctx;303303+ /* registration indicators container */304304+ u8 reg_indicators;300305};301306302307struct iser_conn {303303- struct iscsi_iser_conn *iser_conn; /* iser conn for upcalls */308308+ struct iscsi_conn *iscsi_conn;304309 struct iscsi_endpoint *ep;305310 enum iser_ib_conn_state state; /* rdma connection state */306311 atomic_t refcount;···341310 unsigned int rx_desc_head;342311 struct iser_rx_desc *rx_descs;343312 struct ib_recv_wr rx_wr[ISER_MIN_POSTED_RX];313313+ bool pi_support;314314+315315+ /* Connection memory registration pool */344316 union {345317 struct {346318 struct ib_fmr_pool *pool; /* pool of IB FMRs */···353319 struct {354320 struct list_head pool;355321 int pool_size;356356- } frwr;357357- } fastreg;358358-};359359-360360-struct iscsi_iser_conn {361361- struct iscsi_conn *iscsi_conn;/* ptr to iscsi conn */362362- struct iser_conn *ib_conn; /* iSER IB conn */322322+ } fastreg;323323+ };363324};364325365326struct iscsi_iser_task {366327 struct iser_tx_desc desc;367367- struct iscsi_iser_conn *iser_conn;328328+ struct iser_conn *ib_conn;368329 enum iser_task_status status;330330+ struct scsi_cmnd *sc;369331 int command_sent; /* set if command sent */370332 int dir[ISER_DIRS_NUM]; /* set if dir use*/371333 struct iser_regd_buf rdma_regd[ISER_DIRS_NUM];/* regd rdma buf */372334 struct iser_data_buf data[ISER_DIRS_NUM]; /* orig. data des*/373335 struct iser_data_buf data_copy[ISER_DIRS_NUM];/* contig. copy */336336+ struct iser_data_buf prot[ISER_DIRS_NUM]; /* prot desc */337337+ struct iser_data_buf prot_copy[ISER_DIRS_NUM];/* prot copy */374338};375339376340struct iser_page_vec {···394362395363extern struct iser_global ig;396364extern int iser_debug_level;365365+extern bool iser_pi_enable;366366+extern int iser_pi_guard;397367398368/* allocate connection resources needed for rdma functionality */399369int iser_conn_set_full_featured_mode(struct iscsi_conn *conn);···435401436402void iser_free_rx_descriptors(struct iser_conn *ib_conn);437403438438-void iser_finalize_rdma_unaligned_sg(struct iscsi_iser_task *task,439439- enum iser_data_dir cmd_dir);404404+void iser_finalize_rdma_unaligned_sg(struct iscsi_iser_task *iser_task,405405+ struct iser_data_buf *mem,406406+ struct iser_data_buf *mem_copy,407407+ enum iser_data_dir cmd_dir);440408441409int iser_reg_rdma_mem_fmr(struct iscsi_iser_task *task,442410 enum iser_data_dir cmd_dir);443443-int iser_reg_rdma_mem_frwr(struct iscsi_iser_task *task,444444- enum iser_data_dir cmd_dir);411411+int iser_reg_rdma_mem_fastreg(struct iscsi_iser_task *task,412412+ enum iser_data_dir cmd_dir);445413446414int iser_connect(struct iser_conn *ib_conn,447415 struct sockaddr_in *src_addr,···456420457421void iser_unreg_mem_fmr(struct iscsi_iser_task *iser_task,458422 enum iser_data_dir cmd_dir);459459-void iser_unreg_mem_frwr(struct iscsi_iser_task *iser_task,460460- enum iser_data_dir cmd_dir);423423+void iser_unreg_mem_fastreg(struct iscsi_iser_task *iser_task,424424+ enum iser_data_dir cmd_dir);461425462426int iser_post_recvl(struct iser_conn *ib_conn);463427int iser_post_recvm(struct iser_conn *ib_conn, int count);···468432 enum iser_data_dir iser_dir,469433 enum dma_data_direction dma_dir);470434471471-void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task);435435+void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task,436436+ struct iser_data_buf *data);472437int iser_initialize_task_headers(struct iscsi_task *task,473438 struct iser_tx_desc *tx_desc);474439int iser_alloc_rx_descriptors(struct iser_conn *ib_conn, struct iscsi_session *session);475440int iser_create_fmr_pool(struct iser_conn *ib_conn, unsigned cmds_max);476441void iser_free_fmr_pool(struct iser_conn *ib_conn);477477-int iser_create_frwr_pool(struct iser_conn *ib_conn, unsigned cmds_max);478478-void iser_free_frwr_pool(struct iser_conn *ib_conn);442442+int iser_create_fastreg_pool(struct iser_conn *ib_conn, unsigned cmds_max);443443+void iser_free_fastreg_pool(struct iser_conn *ib_conn);444444+u8 iser_check_task_pi_status(struct iscsi_iser_task *iser_task,445445+ enum iser_data_dir cmd_dir, sector_t *sector);479446#endif
+109-45
drivers/infiniband/ulp/iser/iser_initiator.c
···11/*22 * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved.33- * Copyright (c) 2013 Mellanox Technologies. All rights reserved.33+ * Copyright (c) 2013-2014 Mellanox Technologies. All rights reserved.44 *55 * This software is available to you under a choice of one of two66 * licenses. You may choose to be licensed under the terms of the GNU···49495050{5151 struct iscsi_iser_task *iser_task = task->dd_data;5252- struct iser_device *device = iser_task->iser_conn->ib_conn->device;5252+ struct iser_device *device = iser_task->ib_conn->device;5353 struct iser_regd_buf *regd_buf;5454 int err;5555 struct iser_hdr *hdr = &iser_task->desc.iser_header;···6262 if (err)6363 return err;64646565+ if (scsi_prot_sg_count(iser_task->sc)) {6666+ struct iser_data_buf *pbuf_in = &iser_task->prot[ISER_DIR_IN];6767+6868+ err = iser_dma_map_task_data(iser_task,6969+ pbuf_in,7070+ ISER_DIR_IN,7171+ DMA_FROM_DEVICE);7272+ if (err)7373+ return err;7474+ }7575+6576 if (edtl > iser_task->data[ISER_DIR_IN].data_len) {6677 iser_err("Total data length: %ld, less than EDTL: "6778 "%d, in READ cmd BHS itt: %d, conn: 0x%p\n",6879 iser_task->data[ISER_DIR_IN].data_len, edtl,6969- task->itt, iser_task->iser_conn);8080+ task->itt, iser_task->ib_conn);7081 return -EINVAL;7182 }7283···11099 unsigned int edtl)111100{112101 struct iscsi_iser_task *iser_task = task->dd_data;113113- struct iser_device *device = iser_task->iser_conn->ib_conn->device;102102+ struct iser_device *device = iser_task->ib_conn->device;114103 struct iser_regd_buf *regd_buf;115104 int err;116105 struct iser_hdr *hdr = &iser_task->desc.iser_header;···123112 DMA_TO_DEVICE);124113 if (err)125114 return err;115115+116116+ if (scsi_prot_sg_count(iser_task->sc)) {117117+ struct iser_data_buf *pbuf_out = &iser_task->prot[ISER_DIR_OUT];118118+119119+ err = iser_dma_map_task_data(iser_task,120120+ pbuf_out,121121+ ISER_DIR_OUT,122122+ DMA_TO_DEVICE);123123+ if (err)124124+ return err;125125+ }126126127127 if (edtl > iser_task->data[ISER_DIR_OUT].data_len) {128128 iser_err("Total data length: %ld, less than EDTL: %d, "···349327350328static int iser_post_rx_bufs(struct iscsi_conn *conn, struct iscsi_hdr *req)351329{352352- struct iscsi_iser_conn *iser_conn = conn->dd_data;330330+ struct iser_conn *ib_conn = conn->dd_data;353331 struct iscsi_session *session = conn->session;354332355333 iser_dbg("req op %x flags %x\n", req->opcode, req->flags);···362340 * response) and no posted send buffers left - they must have been363341 * consumed during previous login phases.364342 */365365- WARN_ON(iser_conn->ib_conn->post_recv_buf_count != 1);366366- WARN_ON(atomic_read(&iser_conn->ib_conn->post_send_buf_count) != 0);343343+ WARN_ON(ib_conn->post_recv_buf_count != 1);344344+ WARN_ON(atomic_read(&ib_conn->post_send_buf_count) != 0);367345368346 if (session->discovery_sess) {369347 iser_info("Discovery session, re-using login RX buffer\n");370348 return 0;371349 } else372350 iser_info("Normal session, posting batch of RX %d buffers\n",373373- iser_conn->ib_conn->min_posted_rx);351351+ ib_conn->min_posted_rx);374352375353 /* Initial post receive buffers */376376- if (iser_post_recvm(iser_conn->ib_conn,377377- iser_conn->ib_conn->min_posted_rx))354354+ if (iser_post_recvm(ib_conn, ib_conn->min_posted_rx))378355 return -ENOMEM;379356380357 return 0;···385364int iser_send_command(struct iscsi_conn *conn,386365 struct iscsi_task *task)387366{388388- struct iscsi_iser_conn *iser_conn = conn->dd_data;367367+ struct iser_conn *ib_conn = conn->dd_data;389368 struct iscsi_iser_task *iser_task = task->dd_data;390369 unsigned long edtl;391370 int err;392392- struct iser_data_buf *data_buf;371371+ struct iser_data_buf *data_buf, *prot_buf;393372 struct iscsi_scsi_req *hdr = (struct iscsi_scsi_req *)task->hdr;394373 struct scsi_cmnd *sc = task->sc;395374 struct iser_tx_desc *tx_desc = &iser_task->desc;···398377399378 /* build the tx desc regd header and add it to the tx desc dto */400379 tx_desc->type = ISCSI_TX_SCSI_COMMAND;401401- iser_create_send_desc(iser_conn->ib_conn, tx_desc);380380+ iser_create_send_desc(ib_conn, tx_desc);402381403403- if (hdr->flags & ISCSI_FLAG_CMD_READ)382382+ if (hdr->flags & ISCSI_FLAG_CMD_READ) {404383 data_buf = &iser_task->data[ISER_DIR_IN];405405- else384384+ prot_buf = &iser_task->prot[ISER_DIR_IN];385385+ } else {406386 data_buf = &iser_task->data[ISER_DIR_OUT];387387+ prot_buf = &iser_task->prot[ISER_DIR_OUT];388388+ }407389408390 if (scsi_sg_count(sc)) { /* using a scatter list */409391 data_buf->buf = scsi_sglist(sc);410392 data_buf->size = scsi_sg_count(sc);411393 }412412-413394 data_buf->data_len = scsi_bufflen(sc);395395+396396+ if (scsi_prot_sg_count(sc)) {397397+ prot_buf->buf = scsi_prot_sglist(sc);398398+ prot_buf->size = scsi_prot_sg_count(sc);399399+ prot_buf->data_len = sc->prot_sdb->length;400400+ }414401415402 if (hdr->flags & ISCSI_FLAG_CMD_READ) {416403 err = iser_prepare_read_cmd(task, edtl);···437408438409 iser_task->status = ISER_TASK_STATUS_STARTED;439410440440- err = iser_post_send(iser_conn->ib_conn, tx_desc);411411+ err = iser_post_send(ib_conn, tx_desc);441412 if (!err)442413 return 0;443414···453424 struct iscsi_task *task,454425 struct iscsi_data *hdr)455426{456456- struct iscsi_iser_conn *iser_conn = conn->dd_data;427427+ struct iser_conn *ib_conn = conn->dd_data;457428 struct iscsi_iser_task *iser_task = task->dd_data;458429 struct iser_tx_desc *tx_desc = NULL;459430 struct iser_regd_buf *regd_buf;···502473 itt, buf_offset, data_seg_len);503474504475505505- err = iser_post_send(iser_conn->ib_conn, tx_desc);476476+ err = iser_post_send(ib_conn, tx_desc);506477 if (!err)507478 return 0;508479···515486int iser_send_control(struct iscsi_conn *conn,516487 struct iscsi_task *task)517488{518518- struct iscsi_iser_conn *iser_conn = conn->dd_data;489489+ struct iser_conn *ib_conn = conn->dd_data;519490 struct iscsi_iser_task *iser_task = task->dd_data;520491 struct iser_tx_desc *mdesc = &iser_task->desc;521492 unsigned long data_seg_len;522493 int err = 0;523494 struct iser_device *device;524524- struct iser_conn *ib_conn = iser_conn->ib_conn;525495526496 /* build the tx desc regd header and add it to the tx desc dto */527497 mdesc->type = ISCSI_TX_CONTROL;528528- iser_create_send_desc(iser_conn->ib_conn, mdesc);498498+ iser_create_send_desc(ib_conn, mdesc);529499530530- device = iser_conn->ib_conn->device;500500+ device = ib_conn->device;531501532502 data_seg_len = ntoh24(task->hdr->dlength);533503···541513 ib_conn->login_req_dma, task->data_count,542514 DMA_TO_DEVICE);543515544544- memcpy(iser_conn->ib_conn->login_req_buf, task->data,545545- task->data_count);516516+ memcpy(ib_conn->login_req_buf, task->data, task->data_count);546517547518 ib_dma_sync_single_for_device(device->ib_device,548519 ib_conn->login_req_dma, task->data_count,549520 DMA_TO_DEVICE);550521551551- tx_dsg->addr = iser_conn->ib_conn->login_req_dma;522522+ tx_dsg->addr = ib_conn->login_req_dma;552523 tx_dsg->length = task->data_count;553524 tx_dsg->lkey = device->mr->lkey;554525 mdesc->num_sge = 2;···556529 if (task == conn->login_task) {557530 iser_dbg("op %x dsl %lx, posting login rx buffer\n",558531 task->hdr->opcode, data_seg_len);559559- err = iser_post_recvl(iser_conn->ib_conn);532532+ err = iser_post_recvl(ib_conn);560533 if (err)561534 goto send_control_error;562535 err = iser_post_rx_bufs(conn, task->hdr);···564537 goto send_control_error;565538 }566539567567- err = iser_post_send(iser_conn->ib_conn, mdesc);540540+ err = iser_post_send(ib_conn, mdesc);568541 if (!err)569542 return 0;570543···580553 unsigned long rx_xfer_len,581554 struct iser_conn *ib_conn)582555{583583- struct iscsi_iser_conn *conn = ib_conn->iser_conn;584556 struct iscsi_hdr *hdr;585557 u64 rx_dma;586558 int rx_buflen, outstanding, count, err;···601575 iser_dbg("op 0x%x itt 0x%x dlen %d\n", hdr->opcode,602576 hdr->itt, (int)(rx_xfer_len - ISER_HEADERS_LEN));603577604604- iscsi_iser_recv(conn->iscsi_conn, hdr,605605- rx_desc->data, rx_xfer_len - ISER_HEADERS_LEN);578578+ iscsi_iser_recv(ib_conn->iscsi_conn, hdr, rx_desc->data,579579+ rx_xfer_len - ISER_HEADERS_LEN);606580607581 ib_dma_sync_single_for_device(ib_conn->device->ib_device, rx_dma,608608- rx_buflen, DMA_FROM_DEVICE);582582+ rx_buflen, DMA_FROM_DEVICE);609583610584 /* decrementing conn->post_recv_buf_count only --after-- freeing the *611585 * task eliminates the need to worry on tasks which are completed in *612586 * parallel to the execution of iser_conn_term. So the code that waits *613587 * for the posted rx bufs refcount to become zero handles everything */614614- conn->ib_conn->post_recv_buf_count--;588588+ ib_conn->post_recv_buf_count--;615589616590 if (rx_dma == ib_conn->login_resp_dma)617591 return;···661635 iser_task->data[ISER_DIR_IN].data_len = 0;662636 iser_task->data[ISER_DIR_OUT].data_len = 0;663637638638+ iser_task->prot[ISER_DIR_IN].data_len = 0;639639+ iser_task->prot[ISER_DIR_OUT].data_len = 0;640640+664641 memset(&iser_task->rdma_regd[ISER_DIR_IN], 0,665642 sizeof(struct iser_regd_buf));666643 memset(&iser_task->rdma_regd[ISER_DIR_OUT], 0,···672643673644void iser_task_rdma_finalize(struct iscsi_iser_task *iser_task)674645{675675- struct iser_device *device = iser_task->iser_conn->ib_conn->device;676676- int is_rdma_aligned = 1;646646+ struct iser_device *device = iser_task->ib_conn->device;647647+ int is_rdma_data_aligned = 1;648648+ int is_rdma_prot_aligned = 1;649649+ int prot_count = scsi_prot_sg_count(iser_task->sc);677650678651 /* if we were reading, copy back to unaligned sglist,679652 * anyway dma_unmap and free the copy680653 */681654 if (iser_task->data_copy[ISER_DIR_IN].copy_buf != NULL) {682682- is_rdma_aligned = 0;683683- iser_finalize_rdma_unaligned_sg(iser_task, ISER_DIR_IN);655655+ is_rdma_data_aligned = 0;656656+ iser_finalize_rdma_unaligned_sg(iser_task,657657+ &iser_task->data[ISER_DIR_IN],658658+ &iser_task->data_copy[ISER_DIR_IN],659659+ ISER_DIR_IN);684660 }661661+685662 if (iser_task->data_copy[ISER_DIR_OUT].copy_buf != NULL) {686686- is_rdma_aligned = 0;687687- iser_finalize_rdma_unaligned_sg(iser_task, ISER_DIR_OUT);663663+ is_rdma_data_aligned = 0;664664+ iser_finalize_rdma_unaligned_sg(iser_task,665665+ &iser_task->data[ISER_DIR_OUT],666666+ &iser_task->data_copy[ISER_DIR_OUT],667667+ ISER_DIR_OUT);688668 }689669690690- if (iser_task->dir[ISER_DIR_IN])670670+ if (iser_task->prot_copy[ISER_DIR_IN].copy_buf != NULL) {671671+ is_rdma_prot_aligned = 0;672672+ iser_finalize_rdma_unaligned_sg(iser_task,673673+ &iser_task->prot[ISER_DIR_IN],674674+ &iser_task->prot_copy[ISER_DIR_IN],675675+ ISER_DIR_IN);676676+ }677677+678678+ if (iser_task->prot_copy[ISER_DIR_OUT].copy_buf != NULL) {679679+ is_rdma_prot_aligned = 0;680680+ iser_finalize_rdma_unaligned_sg(iser_task,681681+ &iser_task->prot[ISER_DIR_OUT],682682+ &iser_task->prot_copy[ISER_DIR_OUT],683683+ ISER_DIR_OUT);684684+ }685685+686686+ if (iser_task->dir[ISER_DIR_IN]) {691687 device->iser_unreg_rdma_mem(iser_task, ISER_DIR_IN);688688+ if (is_rdma_data_aligned)689689+ iser_dma_unmap_task_data(iser_task,690690+ &iser_task->data[ISER_DIR_IN]);691691+ if (prot_count && is_rdma_prot_aligned)692692+ iser_dma_unmap_task_data(iser_task,693693+ &iser_task->prot[ISER_DIR_IN]);694694+ }692695693693- if (iser_task->dir[ISER_DIR_OUT])696696+ if (iser_task->dir[ISER_DIR_OUT]) {694697 device->iser_unreg_rdma_mem(iser_task, ISER_DIR_OUT);695695-696696- /* if the data was unaligned, it was already unmapped and then copied */697697- if (is_rdma_aligned)698698- iser_dma_unmap_task_data(iser_task);698698+ if (is_rdma_data_aligned)699699+ iser_dma_unmap_task_data(iser_task,700700+ &iser_task->data[ISER_DIR_OUT]);701701+ if (prot_count && is_rdma_prot_aligned)702702+ iser_dma_unmap_task_data(iser_task,703703+ &iser_task->prot[ISER_DIR_OUT]);704704+ }699705}
+345-125
drivers/infiniband/ulp/iser/iser_memory.c
···11/*22 * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved.33- * Copyright (c) 2013 Mellanox Technologies. All rights reserved.33+ * Copyright (c) 2013-2014 Mellanox Technologies. All rights reserved.44 *55 * This software is available to you under a choice of one of two66 * licenses. You may choose to be licensed under the terms of the GNU···4545 * iser_start_rdma_unaligned_sg4646 */4747static int iser_start_rdma_unaligned_sg(struct iscsi_iser_task *iser_task,4848+ struct iser_data_buf *data,4949+ struct iser_data_buf *data_copy,4850 enum iser_data_dir cmd_dir)4951{5050- int dma_nents;5151- struct ib_device *dev;5252+ struct ib_device *dev = iser_task->ib_conn->device->ib_device;5353+ struct scatterlist *sgl = (struct scatterlist *)data->buf;5454+ struct scatterlist *sg;5255 char *mem = NULL;5353- struct iser_data_buf *data = &iser_task->data[cmd_dir];5454- unsigned long cmd_data_len = data->data_len;5656+ unsigned long cmd_data_len = 0;5757+ int dma_nents, i;5858+5959+ for_each_sg(sgl, sg, data->size, i)6060+ cmd_data_len += ib_sg_dma_len(dev, sg);55615662 if (cmd_data_len > ISER_KMALLOC_THRESHOLD)5763 mem = (void *)__get_free_pages(GFP_ATOMIC,···67616862 if (mem == NULL) {6963 iser_err("Failed to allocate mem size %d %d for copying sglist\n",7070- data->size,(int)cmd_data_len);6464+ data->size, (int)cmd_data_len);7165 return -ENOMEM;7266 }73677468 if (cmd_dir == ISER_DIR_OUT) {7569 /* copy the unaligned sg the buffer which is used for RDMA */7676- struct scatterlist *sgl = (struct scatterlist *)data->buf;7777- struct scatterlist *sg;7870 int i;7971 char *p, *from;80727373+ sgl = (struct scatterlist *)data->buf;8174 p = mem;8275 for_each_sg(sgl, sg, data->size, i) {8376 from = kmap_atomic(sg_page(sg));···8883 }8984 }90859191- sg_init_one(&iser_task->data_copy[cmd_dir].sg_single, mem, cmd_data_len);9292- iser_task->data_copy[cmd_dir].buf =9393- &iser_task->data_copy[cmd_dir].sg_single;9494- iser_task->data_copy[cmd_dir].size = 1;8686+ sg_init_one(&data_copy->sg_single, mem, cmd_data_len);8787+ data_copy->buf = &data_copy->sg_single;8888+ data_copy->size = 1;8989+ data_copy->copy_buf = mem;95909696- iser_task->data_copy[cmd_dir].copy_buf = mem;9797-9898- dev = iser_task->iser_conn->ib_conn->device->ib_device;9999- dma_nents = ib_dma_map_sg(dev,100100- &iser_task->data_copy[cmd_dir].sg_single,101101- 1,9191+ dma_nents = ib_dma_map_sg(dev, &data_copy->sg_single, 1,10292 (cmd_dir == ISER_DIR_OUT) ?10393 DMA_TO_DEVICE : DMA_FROM_DEVICE);10494 BUG_ON(dma_nents == 0);10595106106- iser_task->data_copy[cmd_dir].dma_nents = dma_nents;9696+ data_copy->dma_nents = dma_nents;9797+ data_copy->data_len = cmd_data_len;9898+10799 return 0;108100}109101110102/**111103 * iser_finalize_rdma_unaligned_sg112104 */105105+113106void iser_finalize_rdma_unaligned_sg(struct iscsi_iser_task *iser_task,114114- enum iser_data_dir cmd_dir)107107+ struct iser_data_buf *data,108108+ struct iser_data_buf *data_copy,109109+ enum iser_data_dir cmd_dir)115110{116111 struct ib_device *dev;117117- struct iser_data_buf *mem_copy;118112 unsigned long cmd_data_len;119113120120- dev = iser_task->iser_conn->ib_conn->device->ib_device;121121- mem_copy = &iser_task->data_copy[cmd_dir];114114+ dev = iser_task->ib_conn->device->ib_device;122115123123- ib_dma_unmap_sg(dev, &mem_copy->sg_single, 1,116116+ ib_dma_unmap_sg(dev, &data_copy->sg_single, 1,124117 (cmd_dir == ISER_DIR_OUT) ?125118 DMA_TO_DEVICE : DMA_FROM_DEVICE);126119···130127 int i;131128132129 /* copy back read RDMA to unaligned sg */133133- mem = mem_copy->copy_buf;130130+ mem = data_copy->copy_buf;134131135135- sgl = (struct scatterlist *)iser_task->data[ISER_DIR_IN].buf;136136- sg_size = iser_task->data[ISER_DIR_IN].size;132132+ sgl = (struct scatterlist *)data->buf;133133+ sg_size = data->size;137134138135 p = mem;139136 for_each_sg(sgl, sg, sg_size, i) {···146143 }147144 }148145149149- cmd_data_len = iser_task->data[cmd_dir].data_len;146146+ cmd_data_len = data->data_len;150147151148 if (cmd_data_len > ISER_KMALLOC_THRESHOLD)152152- free_pages((unsigned long)mem_copy->copy_buf,149149+ free_pages((unsigned long)data_copy->copy_buf,153150 ilog2(roundup_pow_of_two(cmd_data_len)) - PAGE_SHIFT);154151 else155155- kfree(mem_copy->copy_buf);152152+ kfree(data_copy->copy_buf);156153157157- mem_copy->copy_buf = NULL;154154+ data_copy->copy_buf = NULL;158155}159156160157#define IS_4K_ALIGNED(addr) ((((unsigned long)addr) & ~MASK_4K) == 0)···322319 struct ib_device *dev;323320324321 iser_task->dir[iser_dir] = 1;325325- dev = iser_task->iser_conn->ib_conn->device->ib_device;322322+ dev = iser_task->ib_conn->device->ib_device;326323327324 data->dma_nents = ib_dma_map_sg(dev, data->buf, data->size, dma_dir);328325 if (data->dma_nents == 0) {···332329 return 0;333330}334331335335-void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task)332332+void iser_dma_unmap_task_data(struct iscsi_iser_task *iser_task,333333+ struct iser_data_buf *data)336334{337335 struct ib_device *dev;338338- struct iser_data_buf *data;339336340340- dev = iser_task->iser_conn->ib_conn->device->ib_device;341341-342342- if (iser_task->dir[ISER_DIR_IN]) {343343- data = &iser_task->data[ISER_DIR_IN];344344- ib_dma_unmap_sg(dev, data->buf, data->size, DMA_FROM_DEVICE);345345- }346346-347347- if (iser_task->dir[ISER_DIR_OUT]) {348348- data = &iser_task->data[ISER_DIR_OUT];349349- ib_dma_unmap_sg(dev, data->buf, data->size, DMA_TO_DEVICE);350350- }337337+ dev = iser_task->ib_conn->device->ib_device;338338+ ib_dma_unmap_sg(dev, data->buf, data->size, DMA_FROM_DEVICE);351339}352340353341static int fall_to_bounce_buf(struct iscsi_iser_task *iser_task,354342 struct ib_device *ibdev,343343+ struct iser_data_buf *mem,344344+ struct iser_data_buf *mem_copy,355345 enum iser_data_dir cmd_dir,356346 int aligned_len)357347{358358- struct iscsi_conn *iscsi_conn = iser_task->iser_conn->iscsi_conn;359359- struct iser_data_buf *mem = &iser_task->data[cmd_dir];348348+ struct iscsi_conn *iscsi_conn = iser_task->ib_conn->iscsi_conn;360349361350 iscsi_conn->fmr_unalign_cnt++;362351 iser_warn("rdma alignment violation (%d/%d aligned) or FMR not supported\n",···358363 iser_data_buf_dump(mem, ibdev);359364360365 /* unmap the command data before accessing it */361361- iser_dma_unmap_task_data(iser_task);366366+ iser_dma_unmap_task_data(iser_task, mem);362367363368 /* allocate copy buf, if we are writing, copy the */364369 /* unaligned scatterlist, dma map the copy */365365- if (iser_start_rdma_unaligned_sg(iser_task, cmd_dir) != 0)366366- return -ENOMEM;370370+ if (iser_start_rdma_unaligned_sg(iser_task, mem, mem_copy, cmd_dir) != 0)371371+ return -ENOMEM;367372368373 return 0;369374}···377382int iser_reg_rdma_mem_fmr(struct iscsi_iser_task *iser_task,378383 enum iser_data_dir cmd_dir)379384{380380- struct iser_conn *ib_conn = iser_task->iser_conn->ib_conn;385385+ struct iser_conn *ib_conn = iser_task->ib_conn;381386 struct iser_device *device = ib_conn->device;382387 struct ib_device *ibdev = device->ib_device;383388 struct iser_data_buf *mem = &iser_task->data[cmd_dir];···391396392397 aligned_len = iser_data_buf_aligned_len(mem, ibdev);393398 if (aligned_len != mem->dma_nents) {394394- err = fall_to_bounce_buf(iser_task, ibdev,399399+ err = fall_to_bounce_buf(iser_task, ibdev, mem,400400+ &iser_task->data_copy[cmd_dir],395401 cmd_dir, aligned_len);396402 if (err) {397403 iser_err("failed to allocate bounce buffer\n");···418422 (unsigned long)regd_buf->reg.va,419423 (unsigned long)regd_buf->reg.len);420424 } else { /* use FMR for multiple dma entries */421421- iser_page_vec_build(mem, ib_conn->fastreg.fmr.page_vec, ibdev);422422- err = iser_reg_page_vec(ib_conn, ib_conn->fastreg.fmr.page_vec,425425+ iser_page_vec_build(mem, ib_conn->fmr.page_vec, ibdev);426426+ err = iser_reg_page_vec(ib_conn, ib_conn->fmr.page_vec,423427 ®d_buf->reg);424428 if (err && err != -EAGAIN) {425429 iser_data_buf_dump(mem, ibdev);···427431 mem->dma_nents,428432 ntoh24(iser_task->desc.iscsi_header.dlength));429433 iser_err("page_vec: data_size = 0x%x, length = %d, offset = 0x%x\n",430430- ib_conn->fastreg.fmr.page_vec->data_size,431431- ib_conn->fastreg.fmr.page_vec->length,432432- ib_conn->fastreg.fmr.page_vec->offset);433433- for (i = 0; i < ib_conn->fastreg.fmr.page_vec->length; i++)434434+ ib_conn->fmr.page_vec->data_size,435435+ ib_conn->fmr.page_vec->length,436436+ ib_conn->fmr.page_vec->offset);437437+ for (i = 0; i < ib_conn->fmr.page_vec->length; i++)434438 iser_err("page_vec[%d] = 0x%llx\n", i,435435- (unsigned long long) ib_conn->fastreg.fmr.page_vec->pages[i]);439439+ (unsigned long long) ib_conn->fmr.page_vec->pages[i]);436440 }437441 if (err)438442 return err;···440444 return 0;441445}442446443443-static int iser_fast_reg_mr(struct fast_reg_descriptor *desc,444444- struct iser_conn *ib_conn,445445- struct iser_regd_buf *regd_buf,446446- u32 offset, unsigned int data_size,447447- unsigned int page_list_len)447447+static inline enum ib_t10_dif_type448448+scsi2ib_prot_type(unsigned char prot_type)448449{450450+ switch (prot_type) {451451+ case SCSI_PROT_DIF_TYPE0:452452+ return IB_T10DIF_NONE;453453+ case SCSI_PROT_DIF_TYPE1:454454+ return IB_T10DIF_TYPE1;455455+ case SCSI_PROT_DIF_TYPE2:456456+ return IB_T10DIF_TYPE2;457457+ case SCSI_PROT_DIF_TYPE3:458458+ return IB_T10DIF_TYPE3;459459+ default:460460+ return IB_T10DIF_NONE;461461+ }462462+}463463+464464+465465+static int466466+iser_set_sig_attrs(struct scsi_cmnd *sc, struct ib_sig_attrs *sig_attrs)467467+{468468+ unsigned char scsi_ptype = scsi_get_prot_type(sc);469469+470470+ sig_attrs->mem.sig_type = IB_SIG_TYPE_T10_DIF;471471+ sig_attrs->wire.sig_type = IB_SIG_TYPE_T10_DIF;472472+ sig_attrs->mem.sig.dif.pi_interval = sc->device->sector_size;473473+ sig_attrs->wire.sig.dif.pi_interval = sc->device->sector_size;474474+475475+ switch (scsi_get_prot_op(sc)) {476476+ case SCSI_PROT_WRITE_INSERT:477477+ case SCSI_PROT_READ_STRIP:478478+ sig_attrs->mem.sig.dif.type = IB_T10DIF_NONE;479479+ sig_attrs->wire.sig.dif.type = scsi2ib_prot_type(scsi_ptype);480480+ sig_attrs->wire.sig.dif.bg_type = IB_T10DIF_CRC;481481+ sig_attrs->wire.sig.dif.ref_tag = scsi_get_lba(sc) &482482+ 0xffffffff;483483+ break;484484+ case SCSI_PROT_READ_INSERT:485485+ case SCSI_PROT_WRITE_STRIP:486486+ sig_attrs->mem.sig.dif.type = scsi2ib_prot_type(scsi_ptype);487487+ sig_attrs->mem.sig.dif.bg_type = IB_T10DIF_CRC;488488+ sig_attrs->mem.sig.dif.ref_tag = scsi_get_lba(sc) &489489+ 0xffffffff;490490+ sig_attrs->wire.sig.dif.type = IB_T10DIF_NONE;491491+ break;492492+ case SCSI_PROT_READ_PASS:493493+ case SCSI_PROT_WRITE_PASS:494494+ sig_attrs->mem.sig.dif.type = scsi2ib_prot_type(scsi_ptype);495495+ sig_attrs->mem.sig.dif.bg_type = IB_T10DIF_CRC;496496+ sig_attrs->mem.sig.dif.ref_tag = scsi_get_lba(sc) &497497+ 0xffffffff;498498+ sig_attrs->wire.sig.dif.type = scsi2ib_prot_type(scsi_ptype);499499+ sig_attrs->wire.sig.dif.bg_type = IB_T10DIF_CRC;500500+ sig_attrs->wire.sig.dif.ref_tag = scsi_get_lba(sc) &501501+ 0xffffffff;502502+ break;503503+ default:504504+ iser_err("Unsupported PI operation %d\n",505505+ scsi_get_prot_op(sc));506506+ return -EINVAL;507507+ }508508+ return 0;509509+}510510+511511+512512+static int513513+iser_set_prot_checks(struct scsi_cmnd *sc, u8 *mask)514514+{515515+ switch (scsi_get_prot_type(sc)) {516516+ case SCSI_PROT_DIF_TYPE0:517517+ *mask = 0x0;518518+ break;519519+ case SCSI_PROT_DIF_TYPE1:520520+ case SCSI_PROT_DIF_TYPE2:521521+ *mask = ISER_CHECK_GUARD | ISER_CHECK_REFTAG;522522+ break;523523+ case SCSI_PROT_DIF_TYPE3:524524+ *mask = ISER_CHECK_GUARD;525525+ break;526526+ default:527527+ iser_err("Unsupported protection type %d\n",528528+ scsi_get_prot_type(sc));529529+ return -EINVAL;530530+ }531531+532532+ return 0;533533+}534534+535535+static int536536+iser_reg_sig_mr(struct iscsi_iser_task *iser_task,537537+ struct fast_reg_descriptor *desc, struct ib_sge *data_sge,538538+ struct ib_sge *prot_sge, struct ib_sge *sig_sge)539539+{540540+ struct iser_conn *ib_conn = iser_task->ib_conn;541541+ struct iser_pi_context *pi_ctx = desc->pi_ctx;542542+ struct ib_send_wr sig_wr, inv_wr;543543+ struct ib_send_wr *bad_wr, *wr = NULL;544544+ struct ib_sig_attrs sig_attrs;545545+ int ret;546546+ u32 key;547547+548548+ memset(&sig_attrs, 0, sizeof(sig_attrs));549549+ ret = iser_set_sig_attrs(iser_task->sc, &sig_attrs);550550+ if (ret)551551+ goto err;552552+553553+ ret = iser_set_prot_checks(iser_task->sc, &sig_attrs.check_mask);554554+ if (ret)555555+ goto err;556556+557557+ if (!(desc->reg_indicators & ISER_SIG_KEY_VALID)) {558558+ memset(&inv_wr, 0, sizeof(inv_wr));559559+ inv_wr.opcode = IB_WR_LOCAL_INV;560560+ inv_wr.wr_id = ISER_FASTREG_LI_WRID;561561+ inv_wr.ex.invalidate_rkey = pi_ctx->sig_mr->rkey;562562+ wr = &inv_wr;563563+ /* Bump the key */564564+ key = (u8)(pi_ctx->sig_mr->rkey & 0x000000FF);565565+ ib_update_fast_reg_key(pi_ctx->sig_mr, ++key);566566+ }567567+568568+ memset(&sig_wr, 0, sizeof(sig_wr));569569+ sig_wr.opcode = IB_WR_REG_SIG_MR;570570+ sig_wr.wr_id = ISER_FASTREG_LI_WRID;571571+ sig_wr.sg_list = data_sge;572572+ sig_wr.num_sge = 1;573573+ sig_wr.wr.sig_handover.sig_attrs = &sig_attrs;574574+ sig_wr.wr.sig_handover.sig_mr = pi_ctx->sig_mr;575575+ if (scsi_prot_sg_count(iser_task->sc))576576+ sig_wr.wr.sig_handover.prot = prot_sge;577577+ sig_wr.wr.sig_handover.access_flags = IB_ACCESS_LOCAL_WRITE |578578+ IB_ACCESS_REMOTE_READ |579579+ IB_ACCESS_REMOTE_WRITE;580580+581581+ if (!wr)582582+ wr = &sig_wr;583583+ else584584+ wr->next = &sig_wr;585585+586586+ ret = ib_post_send(ib_conn->qp, wr, &bad_wr);587587+ if (ret) {588588+ iser_err("reg_sig_mr failed, ret:%d\n", ret);589589+ goto err;590590+ }591591+ desc->reg_indicators &= ~ISER_SIG_KEY_VALID;592592+593593+ sig_sge->lkey = pi_ctx->sig_mr->lkey;594594+ sig_sge->addr = 0;595595+ sig_sge->length = data_sge->length + prot_sge->length;596596+ if (scsi_get_prot_op(iser_task->sc) == SCSI_PROT_WRITE_INSERT ||597597+ scsi_get_prot_op(iser_task->sc) == SCSI_PROT_READ_STRIP) {598598+ sig_sge->length += (data_sge->length /599599+ iser_task->sc->device->sector_size) * 8;600600+ }601601+602602+ iser_dbg("sig_sge: addr: 0x%llx length: %u lkey: 0x%x\n",603603+ sig_sge->addr, sig_sge->length,604604+ sig_sge->lkey);605605+err:606606+ return ret;607607+}608608+609609+static int iser_fast_reg_mr(struct iscsi_iser_task *iser_task,610610+ struct iser_regd_buf *regd_buf,611611+ struct iser_data_buf *mem,612612+ enum iser_reg_indicator ind,613613+ struct ib_sge *sge)614614+{615615+ struct fast_reg_descriptor *desc = regd_buf->reg.mem_h;616616+ struct iser_conn *ib_conn = iser_task->ib_conn;617617+ struct iser_device *device = ib_conn->device;618618+ struct ib_device *ibdev = device->ib_device;619619+ struct ib_mr *mr;620620+ struct ib_fast_reg_page_list *frpl;449621 struct ib_send_wr fastreg_wr, inv_wr;450622 struct ib_send_wr *bad_wr, *wr = NULL;451623 u8 key;452452- int ret;624624+ int ret, offset, size, plen;453625454454- if (!desc->valid) {626626+ /* if there a single dma entry, dma mr suffices */627627+ if (mem->dma_nents == 1) {628628+ struct scatterlist *sg = (struct scatterlist *)mem->buf;629629+630630+ sge->lkey = device->mr->lkey;631631+ sge->addr = ib_sg_dma_address(ibdev, &sg[0]);632632+ sge->length = ib_sg_dma_len(ibdev, &sg[0]);633633+634634+ iser_dbg("Single DMA entry: lkey=0x%x, addr=0x%llx, length=0x%x\n",635635+ sge->lkey, sge->addr, sge->length);636636+ return 0;637637+ }638638+639639+ if (ind == ISER_DATA_KEY_VALID) {640640+ mr = desc->data_mr;641641+ frpl = desc->data_frpl;642642+ } else {643643+ mr = desc->pi_ctx->prot_mr;644644+ frpl = desc->pi_ctx->prot_frpl;645645+ }646646+647647+ plen = iser_sg_to_page_vec(mem, device->ib_device, frpl->page_list,648648+ &offset, &size);649649+ if (plen * SIZE_4K < size) {650650+ iser_err("fast reg page_list too short to hold this SG\n");651651+ return -EINVAL;652652+ }653653+654654+ if (!(desc->reg_indicators & ind)) {455655 memset(&inv_wr, 0, sizeof(inv_wr));656656+ inv_wr.wr_id = ISER_FASTREG_LI_WRID;456657 inv_wr.opcode = IB_WR_LOCAL_INV;457457- inv_wr.send_flags = IB_SEND_SIGNALED;458458- inv_wr.ex.invalidate_rkey = desc->data_mr->rkey;658658+ inv_wr.ex.invalidate_rkey = mr->rkey;459659 wr = &inv_wr;460660 /* Bump the key */461461- key = (u8)(desc->data_mr->rkey & 0x000000FF);462462- ib_update_fast_reg_key(desc->data_mr, ++key);661661+ key = (u8)(mr->rkey & 0x000000FF);662662+ ib_update_fast_reg_key(mr, ++key);463663 }464664465665 /* Prepare FASTREG WR */466666 memset(&fastreg_wr, 0, sizeof(fastreg_wr));667667+ fastreg_wr.wr_id = ISER_FASTREG_LI_WRID;467668 fastreg_wr.opcode = IB_WR_FAST_REG_MR;468468- fastreg_wr.send_flags = IB_SEND_SIGNALED;469469- fastreg_wr.wr.fast_reg.iova_start = desc->data_frpl->page_list[0] + offset;470470- fastreg_wr.wr.fast_reg.page_list = desc->data_frpl;471471- fastreg_wr.wr.fast_reg.page_list_len = page_list_len;669669+ fastreg_wr.wr.fast_reg.iova_start = frpl->page_list[0] + offset;670670+ fastreg_wr.wr.fast_reg.page_list = frpl;671671+ fastreg_wr.wr.fast_reg.page_list_len = plen;472672 fastreg_wr.wr.fast_reg.page_shift = SHIFT_4K;473473- fastreg_wr.wr.fast_reg.length = data_size;474474- fastreg_wr.wr.fast_reg.rkey = desc->data_mr->rkey;673673+ fastreg_wr.wr.fast_reg.length = size;674674+ fastreg_wr.wr.fast_reg.rkey = mr->rkey;475675 fastreg_wr.wr.fast_reg.access_flags = (IB_ACCESS_LOCAL_WRITE |476676 IB_ACCESS_REMOTE_WRITE |477677 IB_ACCESS_REMOTE_READ);478678479479- if (!wr) {679679+ if (!wr)480680 wr = &fastreg_wr;481481- atomic_inc(&ib_conn->post_send_buf_count);482482- } else {681681+ else483682 wr->next = &fastreg_wr;484484- atomic_add(2, &ib_conn->post_send_buf_count);485485- }486683487684 ret = ib_post_send(ib_conn->qp, wr, &bad_wr);488685 if (ret) {489489- if (bad_wr->next)490490- atomic_sub(2, &ib_conn->post_send_buf_count);491491- else492492- atomic_dec(&ib_conn->post_send_buf_count);493686 iser_err("fast registration failed, ret:%d\n", ret);494687 return ret;495688 }496496- desc->valid = false;689689+ desc->reg_indicators &= ~ind;497690498498- regd_buf->reg.mem_h = desc;499499- regd_buf->reg.lkey = desc->data_mr->lkey;500500- regd_buf->reg.rkey = desc->data_mr->rkey;501501- regd_buf->reg.va = desc->data_frpl->page_list[0] + offset;502502- regd_buf->reg.len = data_size;503503- regd_buf->reg.is_mr = 1;691691+ sge->lkey = mr->lkey;692692+ sge->addr = frpl->page_list[0] + offset;693693+ sge->length = size;504694505695 return ret;506696}507697508698/**509509- * iser_reg_rdma_mem_frwr - Registers memory intended for RDMA,699699+ * iser_reg_rdma_mem_fastreg - Registers memory intended for RDMA,510700 * using Fast Registration WR (if possible) obtaining rkey and va511701 *512702 * returns 0 on success, errno code on failure513703 */514514-int iser_reg_rdma_mem_frwr(struct iscsi_iser_task *iser_task,515515- enum iser_data_dir cmd_dir)704704+int iser_reg_rdma_mem_fastreg(struct iscsi_iser_task *iser_task,705705+ enum iser_data_dir cmd_dir)516706{517517- struct iser_conn *ib_conn = iser_task->iser_conn->ib_conn;707707+ struct iser_conn *ib_conn = iser_task->ib_conn;518708 struct iser_device *device = ib_conn->device;519709 struct ib_device *ibdev = device->ib_device;520710 struct iser_data_buf *mem = &iser_task->data[cmd_dir];521711 struct iser_regd_buf *regd_buf = &iser_task->rdma_regd[cmd_dir];522522- struct fast_reg_descriptor *desc;523523- unsigned int data_size, page_list_len;712712+ struct fast_reg_descriptor *desc = NULL;713713+ struct ib_sge data_sge;524714 int err, aligned_len;525715 unsigned long flags;526526- u32 offset;527716528717 aligned_len = iser_data_buf_aligned_len(mem, ibdev);529718 if (aligned_len != mem->dma_nents) {530530- err = fall_to_bounce_buf(iser_task, ibdev,719719+ err = fall_to_bounce_buf(iser_task, ibdev, mem,720720+ &iser_task->data_copy[cmd_dir],531721 cmd_dir, aligned_len);532722 if (err) {533723 iser_err("failed to allocate bounce buffer\n");···722540 mem = &iser_task->data_copy[cmd_dir];723541 }724542725725- /* if there a single dma entry, dma mr suffices */726726- if (mem->dma_nents == 1) {727727- struct scatterlist *sg = (struct scatterlist *)mem->buf;728728-729729- regd_buf->reg.lkey = device->mr->lkey;730730- regd_buf->reg.rkey = device->mr->rkey;731731- regd_buf->reg.len = ib_sg_dma_len(ibdev, &sg[0]);732732- regd_buf->reg.va = ib_sg_dma_address(ibdev, &sg[0]);733733- regd_buf->reg.is_mr = 0;734734- } else {543543+ if (mem->dma_nents != 1 ||544544+ scsi_get_prot_op(iser_task->sc) != SCSI_PROT_NORMAL) {735545 spin_lock_irqsave(&ib_conn->lock, flags);736736- desc = list_first_entry(&ib_conn->fastreg.frwr.pool,546546+ desc = list_first_entry(&ib_conn->fastreg.pool,737547 struct fast_reg_descriptor, list);738548 list_del(&desc->list);739549 spin_unlock_irqrestore(&ib_conn->lock, flags);740740- page_list_len = iser_sg_to_page_vec(mem, device->ib_device,741741- desc->data_frpl->page_list,742742- &offset, &data_size);550550+ regd_buf->reg.mem_h = desc;551551+ }743552744744- if (page_list_len * SIZE_4K < data_size) {745745- iser_err("fast reg page_list too short to hold this SG\n");746746- err = -EINVAL;747747- goto err_reg;553553+ err = iser_fast_reg_mr(iser_task, regd_buf, mem,554554+ ISER_DATA_KEY_VALID, &data_sge);555555+ if (err)556556+ goto err_reg;557557+558558+ if (scsi_get_prot_op(iser_task->sc) != SCSI_PROT_NORMAL) {559559+ struct ib_sge prot_sge, sig_sge;560560+561561+ memset(&prot_sge, 0, sizeof(prot_sge));562562+ if (scsi_prot_sg_count(iser_task->sc)) {563563+ mem = &iser_task->prot[cmd_dir];564564+ aligned_len = iser_data_buf_aligned_len(mem, ibdev);565565+ if (aligned_len != mem->dma_nents) {566566+ err = fall_to_bounce_buf(iser_task, ibdev, mem,567567+ &iser_task->prot_copy[cmd_dir],568568+ cmd_dir, aligned_len);569569+ if (err) {570570+ iser_err("failed to allocate bounce buffer\n");571571+ return err;572572+ }573573+ mem = &iser_task->prot_copy[cmd_dir];574574+ }575575+576576+ err = iser_fast_reg_mr(iser_task, regd_buf, mem,577577+ ISER_PROT_KEY_VALID, &prot_sge);578578+ if (err)579579+ goto err_reg;748580 }749581750750- err = iser_fast_reg_mr(desc, ib_conn, regd_buf,751751- offset, data_size, page_list_len);752752- if (err)753753- goto err_reg;582582+ err = iser_reg_sig_mr(iser_task, desc, &data_sge,583583+ &prot_sge, &sig_sge);584584+ if (err) {585585+ iser_err("Failed to register signature mr\n");586586+ return err;587587+ }588588+ desc->reg_indicators |= ISER_FASTREG_PROTECTED;589589+590590+ regd_buf->reg.lkey = sig_sge.lkey;591591+ regd_buf->reg.rkey = desc->pi_ctx->sig_mr->rkey;592592+ regd_buf->reg.va = sig_sge.addr;593593+ regd_buf->reg.len = sig_sge.length;594594+ regd_buf->reg.is_mr = 1;595595+ } else {596596+ if (desc) {597597+ regd_buf->reg.rkey = desc->data_mr->rkey;598598+ regd_buf->reg.is_mr = 1;599599+ } else {600600+ regd_buf->reg.rkey = device->mr->rkey;601601+ regd_buf->reg.is_mr = 0;602602+ }603603+604604+ regd_buf->reg.lkey = data_sge.lkey;605605+ regd_buf->reg.va = data_sge.addr;606606+ regd_buf->reg.len = data_sge.length;754607 }755608756609 return 0;757610err_reg:758758- spin_lock_irqsave(&ib_conn->lock, flags);759759- list_add_tail(&desc->list, &ib_conn->fastreg.frwr.pool);760760- spin_unlock_irqrestore(&ib_conn->lock, flags);611611+ if (desc) {612612+ spin_lock_irqsave(&ib_conn->lock, flags);613613+ list_add_tail(&desc->list, &ib_conn->fastreg.pool);614614+ spin_unlock_irqrestore(&ib_conn->lock, flags);615615+ }616616+761617 return err;762618}
+235-90
drivers/infiniband/ulp/iser/iser_verbs.c
···11/*22 * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved.33 * Copyright (c) 2005, 2006 Cisco Systems. All rights reserved.44- * Copyright (c) 2013 Mellanox Technologies. All rights reserved.44+ * Copyright (c) 2013-2014 Mellanox Technologies. All rights reserved.55 *66 * This software is available to you under a choice of one of two77 * licenses. You may choose to be licensed under the terms of the GNU···7171 */7272static int iser_create_device_ib_res(struct iser_device *device)7373{7474- int i, j;7574 struct iser_cq_desc *cq_desc;7676- struct ib_device_attr *dev_attr;7575+ struct ib_device_attr *dev_attr = &device->dev_attr;7676+ int ret, i, j;77777878- dev_attr = kmalloc(sizeof(*dev_attr), GFP_KERNEL);7979- if (!dev_attr)8080- return -ENOMEM;8181-8282- if (ib_query_device(device->ib_device, dev_attr)) {7878+ ret = ib_query_device(device->ib_device, dev_attr);7979+ if (ret) {8380 pr_warn("Query device failed for %s\n", device->ib_device->name);8484- goto dev_attr_err;8181+ return ret;8582 }86838784 /* Assign function handles - based on FMR support */···9194 device->iser_unreg_rdma_mem = iser_unreg_mem_fmr;9295 } else9396 if (dev_attr->device_cap_flags & IB_DEVICE_MEM_MGT_EXTENSIONS) {9494- iser_info("FRWR supported, using FRWR for registration\n");9595- device->iser_alloc_rdma_reg_res = iser_create_frwr_pool;9696- device->iser_free_rdma_reg_res = iser_free_frwr_pool;9797- device->iser_reg_rdma_mem = iser_reg_rdma_mem_frwr;9898- device->iser_unreg_rdma_mem = iser_unreg_mem_frwr;9797+ iser_info("FastReg supported, using FastReg for registration\n");9898+ device->iser_alloc_rdma_reg_res = iser_create_fastreg_pool;9999+ device->iser_free_rdma_reg_res = iser_free_fastreg_pool;100100+ device->iser_reg_rdma_mem = iser_reg_rdma_mem_fastreg;101101+ device->iser_unreg_rdma_mem = iser_unreg_mem_fastreg;99102 } else {100100- iser_err("IB device does not support FMRs nor FRWRs, can't register memory\n");101101- goto dev_attr_err;103103+ iser_err("IB device does not support FMRs nor FastRegs, can't register memory\n");104104+ return -1;102105 }103106104107 device->cqs_used = min(ISER_MAX_CQ, device->ib_device->num_comp_vectors);···155158 if (ib_register_event_handler(&device->event_handler))156159 goto handler_err;157160158158- kfree(dev_attr);159161 return 0;160162161163handler_err:···174178 kfree(device->cq_desc);175179cq_desc_err:176180 iser_err("failed to allocate an IB resource\n");177177-dev_attr_err:178178- kfree(dev_attr);179181 return -1;180182}181183···215221 struct ib_fmr_pool_param params;216222 int ret = -ENOMEM;217223218218- ib_conn->fastreg.fmr.page_vec = kmalloc(sizeof(struct iser_page_vec) +219219- (sizeof(u64)*(ISCSI_ISER_SG_TABLESIZE + 1)),220220- GFP_KERNEL);221221- if (!ib_conn->fastreg.fmr.page_vec)224224+ ib_conn->fmr.page_vec = kmalloc(sizeof(*ib_conn->fmr.page_vec) +225225+ (sizeof(u64)*(ISCSI_ISER_SG_TABLESIZE + 1)),226226+ GFP_KERNEL);227227+ if (!ib_conn->fmr.page_vec)222228 return ret;223229224224- ib_conn->fastreg.fmr.page_vec->pages = (u64 *)(ib_conn->fastreg.fmr.page_vec + 1);230230+ ib_conn->fmr.page_vec->pages = (u64 *)(ib_conn->fmr.page_vec + 1);225231226232 params.page_shift = SHIFT_4K;227233 /* when the first/last SG element are not start/end *···237243 IB_ACCESS_REMOTE_WRITE |238244 IB_ACCESS_REMOTE_READ);239245240240- ib_conn->fastreg.fmr.pool = ib_create_fmr_pool(device->pd, ¶ms);241241- if (!IS_ERR(ib_conn->fastreg.fmr.pool))246246+ ib_conn->fmr.pool = ib_create_fmr_pool(device->pd, ¶ms);247247+ if (!IS_ERR(ib_conn->fmr.pool))242248 return 0;243249244250 /* no FMR => no need for page_vec */245245- kfree(ib_conn->fastreg.fmr.page_vec);246246- ib_conn->fastreg.fmr.page_vec = NULL;251251+ kfree(ib_conn->fmr.page_vec);252252+ ib_conn->fmr.page_vec = NULL;247253248248- ret = PTR_ERR(ib_conn->fastreg.fmr.pool);249249- ib_conn->fastreg.fmr.pool = NULL;254254+ ret = PTR_ERR(ib_conn->fmr.pool);255255+ ib_conn->fmr.pool = NULL;250256 if (ret != -ENOSYS) {251257 iser_err("FMR allocation failed, err %d\n", ret);252258 return ret;···262268void iser_free_fmr_pool(struct iser_conn *ib_conn)263269{264270 iser_info("freeing conn %p fmr pool %p\n",265265- ib_conn, ib_conn->fastreg.fmr.pool);271271+ ib_conn, ib_conn->fmr.pool);266272267267- if (ib_conn->fastreg.fmr.pool != NULL)268268- ib_destroy_fmr_pool(ib_conn->fastreg.fmr.pool);273273+ if (ib_conn->fmr.pool != NULL)274274+ ib_destroy_fmr_pool(ib_conn->fmr.pool);269275270270- ib_conn->fastreg.fmr.pool = NULL;276276+ ib_conn->fmr.pool = NULL;271277272272- kfree(ib_conn->fastreg.fmr.page_vec);273273- ib_conn->fastreg.fmr.page_vec = NULL;278278+ kfree(ib_conn->fmr.page_vec);279279+ ib_conn->fmr.page_vec = NULL;280280+}281281+282282+static int283283+iser_create_fastreg_desc(struct ib_device *ib_device, struct ib_pd *pd,284284+ bool pi_enable, struct fast_reg_descriptor *desc)285285+{286286+ int ret;287287+288288+ desc->data_frpl = ib_alloc_fast_reg_page_list(ib_device,289289+ ISCSI_ISER_SG_TABLESIZE + 1);290290+ if (IS_ERR(desc->data_frpl)) {291291+ ret = PTR_ERR(desc->data_frpl);292292+ iser_err("Failed to allocate ib_fast_reg_page_list err=%d\n",293293+ ret);294294+ return PTR_ERR(desc->data_frpl);295295+ }296296+297297+ desc->data_mr = ib_alloc_fast_reg_mr(pd, ISCSI_ISER_SG_TABLESIZE + 1);298298+ if (IS_ERR(desc->data_mr)) {299299+ ret = PTR_ERR(desc->data_mr);300300+ iser_err("Failed to allocate ib_fast_reg_mr err=%d\n", ret);301301+ goto fast_reg_mr_failure;302302+ }303303+ desc->reg_indicators |= ISER_DATA_KEY_VALID;304304+305305+ if (pi_enable) {306306+ struct ib_mr_init_attr mr_init_attr = {0};307307+ struct iser_pi_context *pi_ctx = NULL;308308+309309+ desc->pi_ctx = kzalloc(sizeof(*desc->pi_ctx), GFP_KERNEL);310310+ if (!desc->pi_ctx) {311311+ iser_err("Failed to allocate pi context\n");312312+ ret = -ENOMEM;313313+ goto pi_ctx_alloc_failure;314314+ }315315+ pi_ctx = desc->pi_ctx;316316+317317+ pi_ctx->prot_frpl = ib_alloc_fast_reg_page_list(ib_device,318318+ ISCSI_ISER_SG_TABLESIZE);319319+ if (IS_ERR(pi_ctx->prot_frpl)) {320320+ ret = PTR_ERR(pi_ctx->prot_frpl);321321+ iser_err("Failed to allocate prot frpl ret=%d\n",322322+ ret);323323+ goto prot_frpl_failure;324324+ }325325+326326+ pi_ctx->prot_mr = ib_alloc_fast_reg_mr(pd,327327+ ISCSI_ISER_SG_TABLESIZE + 1);328328+ if (IS_ERR(pi_ctx->prot_mr)) {329329+ ret = PTR_ERR(pi_ctx->prot_mr);330330+ iser_err("Failed to allocate prot frmr ret=%d\n",331331+ ret);332332+ goto prot_mr_failure;333333+ }334334+ desc->reg_indicators |= ISER_PROT_KEY_VALID;335335+336336+ mr_init_attr.max_reg_descriptors = 2;337337+ mr_init_attr.flags |= IB_MR_SIGNATURE_EN;338338+ pi_ctx->sig_mr = ib_create_mr(pd, &mr_init_attr);339339+ if (IS_ERR(pi_ctx->sig_mr)) {340340+ ret = PTR_ERR(pi_ctx->sig_mr);341341+ iser_err("Failed to allocate signature enabled mr err=%d\n",342342+ ret);343343+ goto sig_mr_failure;344344+ }345345+ desc->reg_indicators |= ISER_SIG_KEY_VALID;346346+ }347347+ desc->reg_indicators &= ~ISER_FASTREG_PROTECTED;348348+349349+ iser_dbg("Create fr_desc %p page_list %p\n",350350+ desc, desc->data_frpl->page_list);351351+352352+ return 0;353353+sig_mr_failure:354354+ ib_dereg_mr(desc->pi_ctx->prot_mr);355355+prot_mr_failure:356356+ ib_free_fast_reg_page_list(desc->pi_ctx->prot_frpl);357357+prot_frpl_failure:358358+ kfree(desc->pi_ctx);359359+pi_ctx_alloc_failure:360360+ ib_dereg_mr(desc->data_mr);361361+fast_reg_mr_failure:362362+ ib_free_fast_reg_page_list(desc->data_frpl);363363+364364+ return ret;274365}275366276367/**277277- * iser_create_frwr_pool - Creates pool of fast_reg descriptors368368+ * iser_create_fastreg_pool - Creates pool of fast_reg descriptors278369 * for fast registration work requests.279370 * returns 0 on success, or errno code on failure280371 */281281-int iser_create_frwr_pool(struct iser_conn *ib_conn, unsigned cmds_max)372372+int iser_create_fastreg_pool(struct iser_conn *ib_conn, unsigned cmds_max)282373{283374 struct iser_device *device = ib_conn->device;284375 struct fast_reg_descriptor *desc;285376 int i, ret;286377287287- INIT_LIST_HEAD(&ib_conn->fastreg.frwr.pool);288288- ib_conn->fastreg.frwr.pool_size = 0;378378+ INIT_LIST_HEAD(&ib_conn->fastreg.pool);379379+ ib_conn->fastreg.pool_size = 0;289380 for (i = 0; i < cmds_max; i++) {290290- desc = kmalloc(sizeof(*desc), GFP_KERNEL);381381+ desc = kzalloc(sizeof(*desc), GFP_KERNEL);291382 if (!desc) {292383 iser_err("Failed to allocate a new fast_reg descriptor\n");293384 ret = -ENOMEM;294385 goto err;295386 }296387297297- desc->data_frpl = ib_alloc_fast_reg_page_list(device->ib_device,298298- ISCSI_ISER_SG_TABLESIZE + 1);299299- if (IS_ERR(desc->data_frpl)) {300300- ret = PTR_ERR(desc->data_frpl);301301- iser_err("Failed to allocate ib_fast_reg_page_list err=%d\n", ret);302302- goto fast_reg_page_failure;388388+ ret = iser_create_fastreg_desc(device->ib_device, device->pd,389389+ ib_conn->pi_support, desc);390390+ if (ret) {391391+ iser_err("Failed to create fastreg descriptor err=%d\n",392392+ ret);393393+ kfree(desc);394394+ goto err;303395 }304396305305- desc->data_mr = ib_alloc_fast_reg_mr(device->pd,306306- ISCSI_ISER_SG_TABLESIZE + 1);307307- if (IS_ERR(desc->data_mr)) {308308- ret = PTR_ERR(desc->data_mr);309309- iser_err("Failed to allocate ib_fast_reg_mr err=%d\n", ret);310310- goto fast_reg_mr_failure;311311- }312312- desc->valid = true;313313- list_add_tail(&desc->list, &ib_conn->fastreg.frwr.pool);314314- ib_conn->fastreg.frwr.pool_size++;397397+ list_add_tail(&desc->list, &ib_conn->fastreg.pool);398398+ ib_conn->fastreg.pool_size++;315399 }316400317401 return 0;318402319319-fast_reg_mr_failure:320320- ib_free_fast_reg_page_list(desc->data_frpl);321321-fast_reg_page_failure:322322- kfree(desc);323403err:324324- iser_free_frwr_pool(ib_conn);404404+ iser_free_fastreg_pool(ib_conn);325405 return ret;326406}327407328408/**329329- * iser_free_frwr_pool - releases the pool of fast_reg descriptors409409+ * iser_free_fastreg_pool - releases the pool of fast_reg descriptors330410 */331331-void iser_free_frwr_pool(struct iser_conn *ib_conn)411411+void iser_free_fastreg_pool(struct iser_conn *ib_conn)332412{333413 struct fast_reg_descriptor *desc, *tmp;334414 int i = 0;335415336336- if (list_empty(&ib_conn->fastreg.frwr.pool))416416+ if (list_empty(&ib_conn->fastreg.pool))337417 return;338418339339- iser_info("freeing conn %p frwr pool\n", ib_conn);419419+ iser_info("freeing conn %p fr pool\n", ib_conn);340420341341- list_for_each_entry_safe(desc, tmp, &ib_conn->fastreg.frwr.pool, list) {421421+ list_for_each_entry_safe(desc, tmp, &ib_conn->fastreg.pool, list) {342422 list_del(&desc->list);343423 ib_free_fast_reg_page_list(desc->data_frpl);344424 ib_dereg_mr(desc->data_mr);425425+ if (desc->pi_ctx) {426426+ ib_free_fast_reg_page_list(desc->pi_ctx->prot_frpl);427427+ ib_dereg_mr(desc->pi_ctx->prot_mr);428428+ ib_destroy_mr(desc->pi_ctx->sig_mr);429429+ kfree(desc->pi_ctx);430430+ }345431 kfree(desc);346432 ++i;347433 }348434349349- if (i < ib_conn->fastreg.frwr.pool_size)435435+ if (i < ib_conn->fastreg.pool_size)350436 iser_warn("pool still has %d regions registered\n",351351- ib_conn->fastreg.frwr.pool_size - i);437437+ ib_conn->fastreg.pool_size - i);352438}353439354440/**···463389 init_attr.qp_context = (void *)ib_conn;464390 init_attr.send_cq = device->tx_cq[min_index];465391 init_attr.recv_cq = device->rx_cq[min_index];466466- init_attr.cap.max_send_wr = ISER_QP_MAX_REQ_DTOS;467392 init_attr.cap.max_recv_wr = ISER_QP_MAX_RECV_DTOS;468393 init_attr.cap.max_send_sge = 2;469394 init_attr.cap.max_recv_sge = 1;470395 init_attr.sq_sig_type = IB_SIGNAL_REQ_WR;471396 init_attr.qp_type = IB_QPT_RC;397397+ if (ib_conn->pi_support) {398398+ init_attr.cap.max_send_wr = ISER_QP_SIG_MAX_REQ_DTOS;399399+ init_attr.create_flags |= IB_QP_CREATE_SIGNATURE_EN;400400+ } else {401401+ init_attr.cap.max_send_wr = ISER_QP_MAX_REQ_DTOS;402402+ }472403473404 ret = rdma_create_qp(ib_conn->cma_id, device->pd, &init_attr);474405 if (ret)···670591 ib_conn = (struct iser_conn *)cma_id->context;671592 ib_conn->device = device;672593594594+ /* connection T10-PI support */595595+ if (iser_pi_enable) {596596+ if (!(device->dev_attr.device_cap_flags &597597+ IB_DEVICE_SIGNATURE_HANDOVER)) {598598+ iser_warn("T10-PI requested but not supported on %s, "599599+ "continue without T10-PI\n",600600+ ib_conn->device->ib_device->name);601601+ ib_conn->pi_support = false;602602+ } else {603603+ ib_conn->pi_support = true;604604+ }605605+ }606606+673607 ret = rdma_resolve_route(cma_id, 1000);674608 if (ret) {675609 iser_err("resolve route failed: %d\n", ret);···728636static void iser_connected_handler(struct rdma_cm_id *cma_id)729637{730638 struct iser_conn *ib_conn;639639+ struct ib_qp_attr attr;640640+ struct ib_qp_init_attr init_attr;641641+642642+ (void)ib_query_qp(cma_id->qp, &attr, ~0, &init_attr);643643+ iser_info("remote qpn:%x my qpn:%x\n", attr.dest_qp_num, cma_id->qp->qp_num);731644732645 ib_conn = (struct iser_conn *)cma_id->context;733646 ib_conn->state = ISER_CONN_UP;···750653 * terminated asynchronously from the iSCSI layer's perspective. */751654 if (iser_conn_state_comp_exch(ib_conn, ISER_CONN_UP,752655 ISER_CONN_TERMINATING)){753753- if (ib_conn->iser_conn)754754- iscsi_conn_failure(ib_conn->iser_conn->iscsi_conn,755755- ISCSI_ERR_CONN_FAILED);656656+ if (ib_conn->iscsi_conn)657657+ iscsi_conn_failure(ib_conn->iscsi_conn, ISCSI_ERR_CONN_FAILED);756658 else757659 iser_err("iscsi_iser connection isn't bound\n");758660 }···897801 page_list = page_vec->pages;898802 io_addr = page_list[0];899803900900- mem = ib_fmr_pool_map_phys(ib_conn->fastreg.fmr.pool,804804+ mem = ib_fmr_pool_map_phys(ib_conn->fmr.pool,901805 page_list,902806 page_vec->length,903807 io_addr);···951855 reg->mem_h = NULL;952856}953857954954-void iser_unreg_mem_frwr(struct iscsi_iser_task *iser_task,955955- enum iser_data_dir cmd_dir)858858+void iser_unreg_mem_fastreg(struct iscsi_iser_task *iser_task,859859+ enum iser_data_dir cmd_dir)956860{957861 struct iser_mem_reg *reg = &iser_task->rdma_regd[cmd_dir].reg;958958- struct iser_conn *ib_conn = iser_task->iser_conn->ib_conn;862862+ struct iser_conn *ib_conn = iser_task->ib_conn;959863 struct fast_reg_descriptor *desc = reg->mem_h;960864961865 if (!reg->is_mr)···964868 reg->mem_h = NULL;965869 reg->is_mr = 0;966870 spin_lock_bh(&ib_conn->lock);967967- list_add_tail(&desc->list, &ib_conn->fastreg.frwr.pool);871871+ list_add_tail(&desc->list, &ib_conn->fastreg.pool);968872 spin_unlock_bh(&ib_conn->lock);969873}970874···1065969 * perspective. */1066970 if (iser_conn_state_comp_exch(ib_conn, ISER_CONN_UP,1067971 ISER_CONN_TERMINATING))10681068- iscsi_conn_failure(ib_conn->iser_conn->iscsi_conn,972972+ iscsi_conn_failure(ib_conn->iscsi_conn,1069973 ISCSI_ERR_CONN_FAILED);10709741071975 /* no more non completed posts to the QP, complete the···1089993 if (wc.status == IB_WC_SUCCESS) {1090994 if (wc.opcode == IB_WC_SEND)1091995 iser_snd_completion(tx_desc, ib_conn);10921092- else if (wc.opcode == IB_WC_LOCAL_INV ||10931093- wc.opcode == IB_WC_FAST_REG_MR) {10941094- atomic_dec(&ib_conn->post_send_buf_count);10951095- continue;10961096- } else996996+ else1097997 iser_err("expected opcode %d got %d\n",1098998 IB_WC_SEND, wc.opcode);1099999 } else {11001000 iser_err("tx id %llx status %d vend_err %x\n",11011101- wc.wr_id, wc.status, wc.vendor_err);11021102- atomic_dec(&ib_conn->post_send_buf_count);11031103- iser_handle_comp_error(tx_desc, ib_conn);10011001+ wc.wr_id, wc.status, wc.vendor_err);10021002+ if (wc.wr_id != ISER_FASTREG_LI_WRID) {10031003+ atomic_dec(&ib_conn->post_send_buf_count);10041004+ iser_handle_comp_error(tx_desc, ib_conn);10051005+ }11041006 }11051007 completed_tx++;11061008 }···11161022 struct iser_rx_desc *desc;11171023 unsigned long xfer_len;11181024 struct iser_conn *ib_conn;11191119- int completed_tx, completed_rx;11201120- completed_tx = completed_rx = 0;10251025+ int completed_tx, completed_rx = 0;10261026+10271027+ /* First do tx drain, so in a case where we have rx flushes and a successful10281028+ * tx completion we will still go through completion error handling.10291029+ */10301030+ completed_tx = iser_drain_tx_cq(device, cq_index);1121103111221032 while (ib_poll_cq(cq, 1, &wc) == 1) {11231033 desc = (struct iser_rx_desc *) (unsigned long) wc.wr_id;···11491051 * " would not cause interrupts to be missed" */11501052 ib_req_notify_cq(cq, IB_CQ_NEXT_COMP);1151105311521152- completed_tx += iser_drain_tx_cq(device, cq_index);11531054 iser_dbg("got %d rx %d tx completions\n", completed_rx, completed_tx);11541055}11551056···11591062 int cq_index = cq_desc->cq_index;1160106311611064 tasklet_schedule(&device->cq_tasklet[cq_index]);10651065+}10661066+10671067+u8 iser_check_task_pi_status(struct iscsi_iser_task *iser_task,10681068+ enum iser_data_dir cmd_dir, sector_t *sector)10691069+{10701070+ struct iser_mem_reg *reg = &iser_task->rdma_regd[cmd_dir].reg;10711071+ struct fast_reg_descriptor *desc = reg->mem_h;10721072+ unsigned long sector_size = iser_task->sc->device->sector_size;10731073+ struct ib_mr_status mr_status;10741074+ int ret;10751075+10761076+ if (desc && desc->reg_indicators & ISER_FASTREG_PROTECTED) {10771077+ desc->reg_indicators &= ~ISER_FASTREG_PROTECTED;10781078+ ret = ib_check_mr_status(desc->pi_ctx->sig_mr,10791079+ IB_MR_CHECK_SIG_STATUS, &mr_status);10801080+ if (ret) {10811081+ pr_err("ib_check_mr_status failed, ret %d\n", ret);10821082+ goto err;10831083+ }10841084+10851085+ if (mr_status.fail_status & IB_MR_CHECK_SIG_STATUS) {10861086+ sector_t sector_off = mr_status.sig_err.sig_err_offset;10871087+10881088+ do_div(sector_off, sector_size + 8);10891089+ *sector = scsi_get_lba(iser_task->sc) + sector_off;10901090+10911091+ pr_err("PI error found type %d at sector %llx "10921092+ "expected %x vs actual %x\n",10931093+ mr_status.sig_err.err_type,10941094+ (unsigned long long)*sector,10951095+ mr_status.sig_err.expected,10961096+ mr_status.sig_err.actual);10971097+10981098+ switch (mr_status.sig_err.err_type) {10991099+ case IB_SIG_BAD_GUARD:11001100+ return 0x1;11011101+ case IB_SIG_BAD_REFTAG:11021102+ return 0x3;11031103+ case IB_SIG_BAD_APPTAG:11041104+ return 0x2;11051105+ }11061106+ }11071107+ }11081108+11091109+ return 0;11101110+err:11111111+ /* Not alot we can do here, return ambiguous guard error */11121112+ return 0x1;11621113}
+55-28
drivers/infiniband/ulp/srp/ib_srp.c
···411411412412static int srp_lookup_path(struct srp_target_port *target)413413{414414+ int ret;415415+414416 target->path.numb_path = 1;415417416418 init_completion(&target->done);···433431 if (target->path_query_id < 0)434432 return target->path_query_id;435433436436- wait_for_completion(&target->done);434434+ ret = wait_for_completion_interruptible(&target->done);435435+ if (ret < 0)436436+ return ret;437437438438 if (target->status < 0)439439 shost_printk(KERN_WARNING, target->scsi_host,···714710 ret = srp_send_req(target);715711 if (ret)716712 return ret;717717- wait_for_completion(&target->done);713713+ ret = wait_for_completion_interruptible(&target->done);714714+ if (ret < 0)715715+ return ret;718716719717 /*720718 * The CM event handling code will set status to···783777 * srp_claim_req - Take ownership of the scmnd associated with a request.784778 * @target: SRP target port.785779 * @req: SRP request.780780+ * @sdev: If not NULL, only take ownership for this SCSI device.786781 * @scmnd: If NULL, take ownership of @req->scmnd. If not NULL, only take787782 * ownership of @req->scmnd if it equals @scmnd.788783 *···792785 */793786static struct scsi_cmnd *srp_claim_req(struct srp_target_port *target,794787 struct srp_request *req,788788+ struct scsi_device *sdev,795789 struct scsi_cmnd *scmnd)796790{797791 unsigned long flags;798792799793 spin_lock_irqsave(&target->lock, flags);800800- if (!scmnd) {794794+ if (req->scmnd &&795795+ (!sdev || req->scmnd->device == sdev) &&796796+ (!scmnd || req->scmnd == scmnd)) {801797 scmnd = req->scmnd;802802- req->scmnd = NULL;803803- } else if (req->scmnd == scmnd) {804798 req->scmnd = NULL;805799 } else {806800 scmnd = NULL;···829821}830822831823static void srp_finish_req(struct srp_target_port *target,832832- struct srp_request *req, int result)824824+ struct srp_request *req, struct scsi_device *sdev,825825+ int result)833826{834834- struct scsi_cmnd *scmnd = srp_claim_req(target, req, NULL);827827+ struct scsi_cmnd *scmnd = srp_claim_req(target, req, sdev, NULL);835828836829 if (scmnd) {837830 srp_free_req(target, req, scmnd, 0);···844835static void srp_terminate_io(struct srp_rport *rport)845836{846837 struct srp_target_port *target = rport->lld_data;838838+ struct Scsi_Host *shost = target->scsi_host;839839+ struct scsi_device *sdev;847840 int i;841841+842842+ /*843843+ * Invoking srp_terminate_io() while srp_queuecommand() is running844844+ * is not safe. Hence the warning statement below.845845+ */846846+ shost_for_each_device(sdev, shost)847847+ WARN_ON_ONCE(sdev->request_queue->request_fn_active);848848849849 for (i = 0; i < target->req_ring_size; ++i) {850850 struct srp_request *req = &target->req_ring[i];851851- srp_finish_req(target, req, DID_TRANSPORT_FAILFAST << 16);851851+ srp_finish_req(target, req, NULL, DID_TRANSPORT_FAILFAST << 16);852852 }853853}854854···894876895877 for (i = 0; i < target->req_ring_size; ++i) {896878 struct srp_request *req = &target->req_ring[i];897897- srp_finish_req(target, req, DID_RESET << 16);879879+ srp_finish_req(target, req, NULL, DID_RESET << 16);898880 }899881900882 INIT_LIST_HEAD(&target->free_tx);···13021284 complete(&target->tsk_mgmt_done);13031285 } else {13041286 req = &target->req_ring[rsp->tag];13051305- scmnd = srp_claim_req(target, req, NULL);12871287+ scmnd = srp_claim_req(target, req, NULL, NULL);13061288 if (!scmnd) {13071289 shost_printk(KERN_ERR, target->scsi_host,13081290 "Null scmnd for RSP w/tag %016llx\n",···18221804 shost_printk(KERN_WARNING, shost,18231805 PFX "SRP_LOGIN_REJ: requested max_it_iu_len too large\n");18241806 else18251825- shost_printk(KERN_WARNING, shost,18261826- PFX "SRP LOGIN REJECTED, reason 0x%08x\n", reason);18071807+ shost_printk(KERN_WARNING, shost, PFX18081808+ "SRP LOGIN from %pI6 to %pI6 REJECTED, reason 0x%08x\n",18091809+ target->path.sgid.raw,18101810+ target->orig_dgid, reason);18271811 } else18281812 shost_printk(KERN_WARNING, shost,18291813 " REJ reason: IB_CM_REJ_CONSUMER_DEFINED,"···18831863 case IB_CM_TIMEWAIT_EXIT:18841864 shost_printk(KERN_ERR, target->scsi_host,18851865 PFX "connection closed\n");18661866+ comp = 1;1886186718871868 target->status = 0;18881869 break;···2020199920212000 shost_printk(KERN_ERR, target->scsi_host, "SRP abort called\n");2022200120232023- if (!req || !srp_claim_req(target, req, scmnd))20022002+ if (!req || !srp_claim_req(target, req, NULL, scmnd))20242003 return SUCCESS;20252004 if (srp_send_tsk_mgmt(target, req->index, scmnd->device->lun,20262005 SRP_TSK_ABORT_TASK) == 0)···2051203020522031 for (i = 0; i < target->req_ring_size; ++i) {20532032 struct srp_request *req = &target->req_ring[i];20542054- if (req->scmnd && req->scmnd->device == scmnd->device)20552055- srp_finish_req(target, req, DID_RESET << 16);20332033+ srp_finish_req(target, req, scmnd->device, DID_RESET << 16);20562034 }2057203520582036 return SUCCESS;···26322612 target->tl_retry_count = 7;26332613 target->queue_size = SRP_DEFAULT_QUEUE_SIZE;2634261426152615+ mutex_lock(&host->add_target_mutex);26162616+26352617 ret = srp_parse_options(buf, target);26362618 if (ret)26372619 goto err;···26712649 if (ret)26722650 goto err_free_mem;2673265126742674- ib_query_gid(ibdev, host->port, 0, &target->path.sgid);26752675-26762676- shost_printk(KERN_DEBUG, target->scsi_host, PFX26772677- "new target: id_ext %016llx ioc_guid %016llx pkey %04x "26782678- "service_id %016llx dgid %pI6\n",26792679- (unsigned long long) be64_to_cpu(target->id_ext),26802680- (unsigned long long) be64_to_cpu(target->ioc_guid),26812681- be16_to_cpu(target->path.pkey),26822682- (unsigned long long) be64_to_cpu(target->service_id),26832683- target->path.dgid.raw);26522652+ ret = ib_query_gid(ibdev, host->port, 0, &target->path.sgid);26532653+ if (ret)26542654+ goto err_free_mem;2684265526852656 ret = srp_create_target_ib(target);26862657 if (ret)···26942679 if (ret)26952680 goto err_disconnect;2696268126972697- return count;26822682+ shost_printk(KERN_DEBUG, target->scsi_host, PFX26832683+ "new target: id_ext %016llx ioc_guid %016llx pkey %04x service_id %016llx sgid %pI6 dgid %pI6\n",26842684+ be64_to_cpu(target->id_ext),26852685+ be64_to_cpu(target->ioc_guid),26862686+ be16_to_cpu(target->path.pkey),26872687+ be64_to_cpu(target->service_id),26882688+ target->path.sgid.raw, target->path.dgid.raw);26892689+26902690+ ret = count;26912691+26922692+out:26932693+ mutex_unlock(&host->add_target_mutex);26942694+ return ret;2698269526992696err_disconnect:27002697 srp_disconnect_target(target);···2722269527232696err:27242697 scsi_host_put(target_host);27252725-27262726- return ret;26982698+ goto out;27272699}2728270027292701static DEVICE_ATTR(add_target, S_IWUSR, NULL, srp_create_target);···27582732 INIT_LIST_HEAD(&host->target_list);27592733 spin_lock_init(&host->target_lock);27602734 init_completion(&host->released);27352735+ mutex_init(&host->add_target_mutex);27612736 host->srp_dev = device;27622737 host->port = port;27632738
···35353636 if (!ocrdma_drv)3737 return;3838+3939+ if (ocrdma_drv->be_abi_version != BE_ROCE_ABI_VERSION) {4040+ dev_warn(&pdev->dev, "Cannot initialize RoCE due to ocrdma ABI mismatch\n");4141+ return;4242+ }4343+3844 if (pdev->device == OC_DEVICE_ID5) {3945 /* only msix is supported on these devices */4046 if (!msix_enabled(adapter))
···395395 if (rc)396396 return rc;397397 }398398+399399+ if (scsi_get_prot_op(sc) != SCSI_PROT_NORMAL)400400+ task->protected = true;401401+398402 if (sc->sc_data_direction == DMA_TO_DEVICE) {399403 unsigned out_len = scsi_out(sc)->length;400404 struct iscsi_r2t_info *r2t = &task->unsol_r2t;···826822 conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1;827823828824 sc->result = (DID_OK << 16) | rhdr->cmd_status;825825+826826+ if (task->protected) {827827+ sector_t sector;828828+ u8 ascq;829829+830830+ /**831831+ * Transports that didn't implement check_protection832832+ * callback but still published T10-PI support to scsi-mid833833+ * deserve this BUG_ON.834834+ **/835835+ BUG_ON(!session->tt->check_protection);836836+837837+ ascq = session->tt->check_protection(task, §or);838838+ if (ascq) {839839+ sc->result = DRIVER_SENSE << 24 |840840+ SAM_STAT_CHECK_CONDITION;841841+ scsi_build_sense_buffer(1, sc->sense_buffer,842842+ ILLEGAL_REQUEST, 0x10, ascq);843843+ sc->sense_buffer[7] = 0xc; /* Additional sense length */844844+ sc->sense_buffer[8] = 0; /* Information desc type */845845+ sc->sense_buffer[9] = 0xa; /* Additional desc length */846846+ sc->sense_buffer[10] = 0x80; /* Validity bit */847847+848848+ put_unaligned_be64(sector, &sc->sense_buffer[12]);849849+ goto out;850850+ }851851+ }829852830853 if (rhdr->response != ISCSI_STATUS_CMD_COMPLETED) {831854 sc->result = DID_ERROR << 16;···15981567 task->have_checked_conn = false;15991568 task->last_timeout = jiffies;16001569 task->last_xfer = jiffies;15701570+ task->protected = false;16011571 INIT_LIST_HEAD(&task->running);16021572 return task;16031573}
+1
drivers/scsi/scsi_transport_srp.c
···810810811811/**812812 * srp_stop_rport_timers - stop the transport layer recovery timers813813+ * @rport: SRP remote port for which to stop the timers.813814 *814815 * Must be called after srp_remove_host() and scsi_remove_host(). The caller815816 * must hold a reference on the rport (rport->dev) and on the SCSI host
···14121412 void (*unmap_sg)(struct ib_device *dev,14131413 struct scatterlist *sg, int nents,14141414 enum dma_data_direction direction);14151415- u64 (*dma_address)(struct ib_device *dev,14161416- struct scatterlist *sg);14171417- unsigned int (*dma_len)(struct ib_device *dev,14181418- struct scatterlist *sg);14191415 void (*sync_single_for_cpu)(struct ib_device *dev,14201416 u64 dma_handle,14211417 size_t size,···22362240 * ib_sg_dma_address - Return the DMA address from a scatter/gather entry22372241 * @dev: The device for which the DMA addresses were created22382242 * @sg: The scatter/gather entry22432243+ *22442244+ * Note: this function is obsolete. To do: change all occurrences of22452245+ * ib_sg_dma_address() into sg_dma_address().22392246 */22402247static inline u64 ib_sg_dma_address(struct ib_device *dev,22412248 struct scatterlist *sg)22422249{22432243- if (dev->dma_ops)22442244- return dev->dma_ops->dma_address(dev, sg);22452250 return sg_dma_address(sg);22462251}22472252···22502253 * ib_sg_dma_len - Return the DMA length from a scatter/gather entry22512254 * @dev: The device for which the DMA addresses were created22522255 * @sg: The scatter/gather entry22562256+ *22572257+ * Note: this function is obsolete. To do: change all occurrences of22582258+ * ib_sg_dma_len() into sg_dma_len().22532259 */22542260static inline unsigned int ib_sg_dma_len(struct ib_device *dev,22552261 struct scatterlist *sg)22562262{22572257- if (dev->dma_ops)22582258- return dev->dma_ops->dma_len(dev, sg);22592263 return sg_dma_len(sg);22602264}22612265
+4
include/scsi/libiscsi.h
···133133 unsigned long last_xfer;134134 unsigned long last_timeout;135135 bool have_checked_conn;136136+137137+ /* T10 protection information */138138+ bool protected;139139+136140 /* state set/tested under session->lock */137141 int state;138142 atomic_t refcount;
+1
include/scsi/scsi_transport_iscsi.h
···167167 struct iscsi_bus_flash_conn *fnode_conn);168168 int (*logout_flashnode_sid) (struct iscsi_cls_session *cls_sess);169169 int (*get_host_stats) (struct Scsi_Host *shost, char *buf, int len);170170+ u8 (*check_protection)(struct iscsi_task *task, sector_t *sector);170171};171172172173/*
-1
include/scsi/scsi_transport_srp.h
···4141 * @mutex: Protects against concurrent rport reconnect /4242 * fast_io_fail / dev_loss_tmo activity.4343 * @state: rport state.4444- * @deleted: Whether or not srp_rport_del() has already been invoked.4544 * @reconnect_delay: Reconnect delay in seconds.4645 * @failed_reconnects: Number of failed reconnect attempts.4746 * @reconnect_work: Work structure used for scheduling reconnect attempts.