• Home
  • Raw
  • Download

Lines Matching full:target

96 		 "Enable workarounds for Topspin/Cisco SRP target bugs if != 0");
138 …"Number of RDMA channels to use for communication with an SRP target. Using more than one channel …
210 static int srp_target_is_topspin(struct srp_target_port *target) in srp_target_is_topspin() argument
216 (!memcmp(&target->ioc_guid, topspin_oui, sizeof topspin_oui) || in srp_target_is_topspin()
217 !memcmp(&target->ioc_guid, cisco_oui, sizeof cisco_oui)); in srp_target_is_topspin()
269 static int srp_init_ib_qp(struct srp_target_port *target, in srp_init_ib_qp() argument
279 ret = ib_find_cached_pkey(target->srp_host->srp_dev->dev, in srp_init_ib_qp()
280 target->srp_host->port, in srp_init_ib_qp()
281 be16_to_cpu(target->ib_cm.pkey), in srp_init_ib_qp()
289 attr->port_num = target->srp_host->port; in srp_init_ib_qp()
304 struct srp_target_port *target = ch->target; in srp_new_ib_cm_id() local
307 new_cm_id = ib_create_cm_id(target->srp_host->srp_dev->dev, in srp_new_ib_cm_id()
315 if (rdma_cap_opa_ah(target->srp_host->srp_dev->dev, in srp_new_ib_cm_id()
316 target->srp_host->port)) in srp_new_ib_cm_id()
320 ch->ib_cm.path.sgid = target->sgid; in srp_new_ib_cm_id()
321 ch->ib_cm.path.dgid = target->ib_cm.orig_dgid; in srp_new_ib_cm_id()
322 ch->ib_cm.path.pkey = target->ib_cm.pkey; in srp_new_ib_cm_id()
323 ch->ib_cm.path.service_id = target->ib_cm.service_id; in srp_new_ib_cm_id()
330 struct srp_target_port *target = ch->target; in srp_new_rdma_cm_id() local
334 new_cm_id = rdma_create_id(target->net, srp_rdma_cm_handler, ch, in srp_new_rdma_cm_id()
343 ret = rdma_resolve_addr(new_cm_id, target->rdma_cm.src_specified ? in srp_new_rdma_cm_id()
344 (struct sockaddr *)&target->rdma_cm.src : NULL, in srp_new_rdma_cm_id()
345 (struct sockaddr *)&target->rdma_cm.dst, in srp_new_rdma_cm_id()
349 &target->rdma_cm.src, &target->rdma_cm.dst, ret); in srp_new_rdma_cm_id()
359 &target->rdma_cm.dst, ret); in srp_new_rdma_cm_id()
374 struct srp_target_port *target = ch->target; in srp_new_cm_id() local
376 return target->using_rdma_cm ? srp_new_rdma_cm_id(ch) : in srp_new_cm_id()
380 static struct ib_fmr_pool *srp_alloc_fmr_pool(struct srp_target_port *target) in srp_alloc_fmr_pool() argument
382 struct srp_device *dev = target->srp_host->srp_dev; in srp_alloc_fmr_pool()
386 fmr_param.pool_size = target->mr_pool_size; in srp_alloc_fmr_pool()
515 static struct srp_fr_pool *srp_alloc_fr_pool(struct srp_target_port *target) in srp_alloc_fr_pool() argument
517 struct srp_device *dev = target->srp_host->srp_dev; in srp_alloc_fr_pool()
519 return srp_create_fr_pool(dev->dev, dev->pd, target->mr_pool_size, in srp_alloc_fr_pool()
543 struct srp_target_port *target = ch->target; in srp_create_ch_ib() local
544 struct srp_device *dev = target->srp_host->srp_dev; in srp_create_ch_ib()
550 const int m = 1 + dev->use_fast_reg * target->mr_per_cmd * 2; in srp_create_ch_ib()
558 recv_cq = ib_alloc_cq(dev->dev, ch, target->queue_size + 1, in srp_create_ch_ib()
565 send_cq = ib_alloc_cq(dev->dev, ch, m * target->queue_size, in srp_create_ch_ib()
573 init_attr->cap.max_send_wr = m * target->queue_size; in srp_create_ch_ib()
574 init_attr->cap.max_recv_wr = target->queue_size + 1; in srp_create_ch_ib()
582 if (target->using_rdma_cm) { in srp_create_ch_ib()
588 ret = srp_init_ib_qp(target, qp); in srp_create_ch_ib()
602 fr_pool = srp_alloc_fr_pool(target); in srp_create_ch_ib()
605 shost_printk(KERN_WARNING, target->scsi_host, PFX in srp_create_ch_ib()
610 fmr_pool = srp_alloc_fmr_pool(target); in srp_create_ch_ib()
613 shost_printk(KERN_WARNING, target->scsi_host, PFX in srp_create_ch_ib()
644 if (target->using_rdma_cm) in srp_create_ch_ib()
664 static void srp_free_ch_ib(struct srp_target_port *target, in srp_free_ch_ib() argument
667 struct srp_device *dev = target->srp_host->srp_dev; in srp_free_ch_ib()
670 if (!ch->target) in srp_free_ch_ib()
673 if (target->using_rdma_cm) { in srp_free_ch_ib()
707 ch->target = NULL; in srp_free_ch_ib()
713 for (i = 0; i < target->queue_size; ++i) in srp_free_ch_ib()
714 srp_free_iu(target->srp_host, ch->rx_ring[i]); in srp_free_ch_ib()
719 for (i = 0; i < target->queue_size; ++i) in srp_free_ch_ib()
720 srp_free_iu(target->srp_host, ch->tx_ring[i]); in srp_free_ch_ib()
731 struct srp_target_port *target = ch->target; in srp_path_rec_completion() local
735 shost_printk(KERN_ERR, target->scsi_host, in srp_path_rec_completion()
744 struct srp_target_port *target = ch->target; in srp_ib_lookup_path() local
752 target->srp_host->srp_dev->dev, in srp_ib_lookup_path()
753 target->srp_host->port, in srp_ib_lookup_path()
772 shost_printk(KERN_WARNING, target->scsi_host, in srp_ib_lookup_path()
775 be16_to_cpu(target->ib_cm.pkey), in srp_ib_lookup_path()
776 be64_to_cpu(target->ib_cm.service_id)); in srp_ib_lookup_path()
783 struct srp_target_port *target = ch->target; in srp_rdma_lookup_path() local
795 shost_printk(KERN_WARNING, target->scsi_host, in srp_rdma_lookup_path()
803 struct srp_target_port *target = ch->target; in srp_lookup_path() local
805 return target->using_rdma_cm ? srp_rdma_lookup_path(ch) : in srp_lookup_path()
828 struct srp_target_port *target = ch->target; in srp_send_req() local
843 req->ib_param.retry_count = target->tl_retry_count; in srp_send_req()
855 req->ib_req.req_it_iu_len = cpu_to_be32(target->max_iu_len); in srp_send_req()
861 if (target->using_rdma_cm) { in srp_send_req()
882 subnet_timeout = srp_get_subnet_timeout(target->srp_host); in srp_send_req()
886 req->ib_param.service_id = target->ib_cm.service_id; in srp_send_req()
909 if (target->io_class == SRP_REV10_IB_IO_CLASS) { in srp_send_req()
910 memcpy(ipi, &target->sgid.global.interface_id, 8); in srp_send_req()
911 memcpy(ipi + 8, &target->initiator_ext, 8); in srp_send_req()
912 memcpy(tpi, &target->ioc_guid, 8); in srp_send_req()
913 memcpy(tpi + 8, &target->id_ext, 8); in srp_send_req()
915 memcpy(ipi, &target->initiator_ext, 8); in srp_send_req()
916 memcpy(ipi + 8, &target->sgid.global.interface_id, 8); in srp_send_req()
917 memcpy(tpi, &target->id_ext, 8); in srp_send_req()
918 memcpy(tpi + 8, &target->ioc_guid, 8); in srp_send_req()
926 if (srp_target_is_topspin(target)) { in srp_send_req()
927 shost_printk(KERN_DEBUG, target->scsi_host, in srp_send_req()
929 "activated for target GUID %016llx\n", in srp_send_req()
930 be64_to_cpu(target->ioc_guid)); in srp_send_req()
932 memcpy(ipi + 8, &target->srp_host->srp_dev->dev->node_guid, 8); in srp_send_req()
935 if (target->using_rdma_cm) in srp_send_req()
945 static bool srp_queue_remove_work(struct srp_target_port *target) in srp_queue_remove_work() argument
949 spin_lock_irq(&target->lock); in srp_queue_remove_work()
950 if (target->state != SRP_TARGET_REMOVED) { in srp_queue_remove_work()
951 target->state = SRP_TARGET_REMOVED; in srp_queue_remove_work()
954 spin_unlock_irq(&target->lock); in srp_queue_remove_work()
957 queue_work(srp_remove_wq, &target->remove_work); in srp_queue_remove_work()
962 static void srp_disconnect_target(struct srp_target_port *target) in srp_disconnect_target() argument
969 for (i = 0; i < target->ch_count; i++) { in srp_disconnect_target()
970 ch = &target->ch[i]; in srp_disconnect_target()
973 if (target->using_rdma_cm) { in srp_disconnect_target()
982 shost_printk(KERN_DEBUG, target->scsi_host, in srp_disconnect_target()
988 static void srp_free_req_data(struct srp_target_port *target, in srp_free_req_data() argument
991 struct srp_device *dev = target->srp_host->srp_dev; in srp_free_req_data()
999 for (i = 0; i < target->req_ring_size; ++i) { in srp_free_req_data()
1009 target->indirect_size, in srp_free_req_data()
1021 struct srp_target_port *target = ch->target; in srp_alloc_req_data() local
1022 struct srp_device *srp_dev = target->srp_host->srp_dev; in srp_alloc_req_data()
1029 ch->req_ring = kcalloc(target->req_ring_size, sizeof(*ch->req_ring), in srp_alloc_req_data()
1034 for (i = 0; i < target->req_ring_size; ++i) { in srp_alloc_req_data()
1036 mr_list = kmalloc_array(target->mr_per_cmd, sizeof(void *), in srp_alloc_req_data()
1050 req->indirect_desc = kmalloc(target->indirect_size, GFP_KERNEL); in srp_alloc_req_data()
1055 target->indirect_size, in srp_alloc_req_data()
1083 static void srp_remove_target(struct srp_target_port *target) in srp_remove_target() argument
1088 WARN_ON_ONCE(target->state != SRP_TARGET_REMOVED); in srp_remove_target()
1090 srp_del_scsi_host_attr(target->scsi_host); in srp_remove_target()
1091 srp_rport_get(target->rport); in srp_remove_target()
1092 srp_remove_host(target->scsi_host); in srp_remove_target()
1093 scsi_remove_host(target->scsi_host); in srp_remove_target()
1094 srp_stop_rport_timers(target->rport); in srp_remove_target()
1095 srp_disconnect_target(target); in srp_remove_target()
1096 kobj_ns_drop(KOBJ_NS_TYPE_NET, target->net); in srp_remove_target()
1097 for (i = 0; i < target->ch_count; i++) { in srp_remove_target()
1098 ch = &target->ch[i]; in srp_remove_target()
1099 srp_free_ch_ib(target, ch); in srp_remove_target()
1101 cancel_work_sync(&target->tl_err_work); in srp_remove_target()
1102 srp_rport_put(target->rport); in srp_remove_target()
1103 for (i = 0; i < target->ch_count; i++) { in srp_remove_target()
1104 ch = &target->ch[i]; in srp_remove_target()
1105 srp_free_req_data(target, ch); in srp_remove_target()
1107 kfree(target->ch); in srp_remove_target()
1108 target->ch = NULL; in srp_remove_target()
1110 spin_lock(&target->srp_host->target_lock); in srp_remove_target()
1111 list_del(&target->list); in srp_remove_target()
1112 spin_unlock(&target->srp_host->target_lock); in srp_remove_target()
1114 scsi_host_put(target->scsi_host); in srp_remove_target()
1119 struct srp_target_port *target = in srp_remove_work() local
1122 WARN_ON_ONCE(target->state != SRP_TARGET_REMOVED); in srp_remove_work()
1124 srp_remove_target(target); in srp_remove_work()
1129 struct srp_target_port *target = rport->lld_data; in srp_rport_delete() local
1131 srp_queue_remove_work(target); in srp_rport_delete()
1136 * @target: SRP target port.
1138 static int srp_connected_ch(struct srp_target_port *target) in srp_connected_ch() argument
1142 for (i = 0; i < target->ch_count; i++) in srp_connected_ch()
1143 c += target->ch[i].connected; in srp_connected_ch()
1150 struct srp_target_port *target = ch->target; in srp_connect_ch() local
1153 WARN_ON_ONCE(!multich && srp_connected_ch(target) > 0); in srp_connect_ch()
1190 shost_printk(KERN_ERR, target->scsi_host, PFX in srp_connect_ch()
1229 struct srp_target_port *target = ch->target; in srp_unmap_data() local
1230 struct srp_device *dev = target->srp_host->srp_dev; in srp_unmap_data()
1245 shost_printk(KERN_ERR, target->scsi_host, PFX in srp_unmap_data()
1249 &target->tl_err_work); in srp_unmap_data()
1303 * @req_lim_delta: Amount to be added to @target->req_lim.
1331 struct srp_target_port *target = rport->lld_data; in srp_terminate_io() local
1333 struct Scsi_Host *shost = target->scsi_host; in srp_terminate_io()
1344 for (i = 0; i < target->ch_count; i++) { in srp_terminate_io()
1345 ch = &target->ch[i]; in srp_terminate_io()
1347 for (j = 0; j < target->req_ring_size; ++j) { in srp_terminate_io()
1367 struct srp_target_port *target = rport->lld_data; in srp_rport_reconnect() local
1372 srp_disconnect_target(target); in srp_rport_reconnect()
1374 if (target->state == SRP_TARGET_SCANNING) in srp_rport_reconnect()
1378 * Now get a new local CM ID so that we avoid confusing the target in in srp_rport_reconnect()
1382 for (i = 0; i < target->ch_count; i++) { in srp_rport_reconnect()
1383 ch = &target->ch[i]; in srp_rport_reconnect()
1386 for (i = 0; i < target->ch_count; i++) { in srp_rport_reconnect()
1387 ch = &target->ch[i]; in srp_rport_reconnect()
1388 for (j = 0; j < target->req_ring_size; ++j) { in srp_rport_reconnect()
1394 for (i = 0; i < target->ch_count; i++) { in srp_rport_reconnect()
1395 ch = &target->ch[i]; in srp_rport_reconnect()
1404 for (j = 0; j < target->queue_size; ++j) in srp_rport_reconnect()
1408 target->qp_in_error = false; in srp_rport_reconnect()
1410 for (i = 0; i < target->ch_count; i++) { in srp_rport_reconnect()
1411 ch = &target->ch[i]; in srp_rport_reconnect()
1419 shost_printk(KERN_INFO, target->scsi_host, in srp_rport_reconnect()
1444 struct srp_target_port *target = ch->target; in srp_map_finish_fmr() local
1445 struct srp_device *dev = target->srp_host->srp_dev; in srp_map_finish_fmr()
1450 shost_printk(KERN_ERR, ch->target->scsi_host, in srp_map_finish_fmr()
1452 ch->target->mr_per_cmd); in srp_map_finish_fmr()
1461 if (state->npages == 1 && target->global_rkey) { in srp_map_finish_fmr()
1463 target->global_rkey); in srp_map_finish_fmr()
1501 struct srp_target_port *target = ch->target; in srp_map_finish_fr() local
1502 struct srp_device *dev = target->srp_host->srp_dev; in srp_map_finish_fr()
1509 shost_printk(KERN_ERR, ch->target->scsi_host, in srp_map_finish_fr()
1511 ch->target->mr_per_cmd); in srp_map_finish_fr()
1517 if (sg_nents == 1 && target->global_rkey) { in srp_map_finish_fr()
1522 target->global_rkey); in srp_map_finish_fr()
1579 struct srp_target_port *target = ch->target; in srp_map_sg_entry() local
1580 struct srp_device *dev = target->srp_host->srp_dev; in srp_map_sg_entry()
1629 state->fmr.end = req->fmr_list + ch->target->mr_per_cmd; in srp_map_sg_fmr()
1651 state->fr.end = req->fr_list + ch->target->mr_per_cmd; in srp_map_sg_fr()
1676 struct srp_target_port *target = ch->target; in srp_map_sg_dma() local
1677 struct srp_device *dev = target->srp_host->srp_dev; in srp_map_sg_dma()
1684 target->global_rkey); in srp_map_sg_dma()
1701 struct srp_target_port *target = ch->target; in srp_map_idb() local
1702 struct srp_device *dev = target->srp_host->srp_dev; in srp_map_idb()
1749 struct srp_device *dev = ch->target->srp_host->srp_dev; in srp_check_mapping()
1781 struct srp_target_port *target = ch->target; in srp_map_data() local
1798 shost_printk(KERN_WARNING, target->scsi_host, in srp_map_data()
1807 dev = target->srp_host->srp_dev; in srp_map_data()
1817 if (count == 1 && target->global_rkey) { in srp_map_data()
1827 buf->key = cpu_to_be32(target->global_rkey); in srp_map_data()
1841 target->indirect_size, DMA_TO_DEVICE); in srp_map_data()
1864 * target is not using an external indirect table, we are in srp_map_data()
1879 if (unlikely(target->cmd_sg_cnt < state.ndesc && in srp_map_data()
1880 !target->allow_ext_sg)) { in srp_map_data()
1881 shost_printk(KERN_ERR, target->scsi_host, in srp_map_data()
1887 count = min(state.ndesc, target->cmd_sg_cnt); in srp_map_data()
1898 if (!target->global_rkey) { in srp_map_data()
1905 idb_rkey = cpu_to_be32(target->global_rkey); in srp_map_data()
1931 if (ret == -ENOMEM && req->nmdesc >= target->mr_pool_size) in srp_map_data()
1961 * - SRP_IU_RSP: 1, since a conforming SRP target never sends more than
1967 struct srp_target_port *target = ch->target; in __srp_get_tx_iu() local
1978 /* Initiator responses to target requests do not consume credits */ in __srp_get_tx_iu()
1981 ++target->zero_req_lim; in __srp_get_tx_iu()
2015 struct srp_target_port *target = ch->target; in srp_post_send() local
2021 list.lkey = target->lkey; in srp_post_send()
2037 struct srp_target_port *target = ch->target; in srp_post_recv() local
2043 list.lkey = target->lkey; in srp_post_recv()
2057 struct srp_target_port *target = ch->target; in srp_process_rsp() local
2071 shost_printk(KERN_ERR, target->scsi_host, in srp_process_rsp()
2077 scmnd = scsi_host_find_tag(target->scsi_host, rsp->tag); in srp_process_rsp()
2085 shost_printk(KERN_ERR, target->scsi_host, in srp_process_rsp()
2087 rsp->tag, ch - target->ch, ch->qp->qp_num); in srp_process_rsp()
2124 struct srp_target_port *target = ch->target; in srp_response_common() local
2125 struct ib_device *dev = target->srp_host->srp_dev->dev; in srp_response_common()
2136 shost_printk(KERN_ERR, target->scsi_host, PFX in srp_response_common()
2147 shost_printk(KERN_ERR, target->scsi_host, PFX in srp_response_common()
2165 shost_printk(KERN_ERR, ch->target->scsi_host, PFX in srp_process_cred_req()
2172 struct srp_target_port *target = ch->target; in srp_process_aer_req() local
2179 shost_printk(KERN_ERR, target->scsi_host, PFX in srp_process_aer_req()
2183 shost_printk(KERN_ERR, target->scsi_host, PFX in srp_process_aer_req()
2191 struct srp_target_port *target = ch->target; in srp_recv_done() local
2192 struct ib_device *dev = target->srp_host->srp_dev->dev; in srp_recv_done()
2207 shost_printk(KERN_ERR, target->scsi_host, in srp_recv_done()
2227 /* XXX Handle target logout */ in srp_recv_done()
2228 shost_printk(KERN_WARNING, target->scsi_host, in srp_recv_done()
2229 PFX "Got target logout request\n"); in srp_recv_done()
2233 shost_printk(KERN_WARNING, target->scsi_host, in srp_recv_done()
2243 shost_printk(KERN_ERR, target->scsi_host, in srp_recv_done()
2249 * @work: Work structure embedded in an SRP target port.
2252 * hence the target->rport test.
2256 struct srp_target_port *target; in srp_tl_err_work() local
2258 target = container_of(work, struct srp_target_port, tl_err_work); in srp_tl_err_work()
2259 if (target->rport) in srp_tl_err_work()
2260 srp_start_tl_fail_timers(target->rport); in srp_tl_err_work()
2267 struct srp_target_port *target = ch->target; in srp_handle_qp_err() local
2269 if (ch->connected && !target->qp_in_error) { in srp_handle_qp_err()
2270 shost_printk(KERN_ERR, target->scsi_host, in srp_handle_qp_err()
2274 queue_work(system_long_wq, &target->tl_err_work); in srp_handle_qp_err()
2276 target->qp_in_error = true; in srp_handle_qp_err()
2281 struct srp_target_port *target = host_to_target(shost); in srp_queuecommand() local
2282 struct srp_rport *rport = target->rport; in srp_queuecommand()
2303 scmnd->result = srp_chkready(target->rport); in srp_queuecommand()
2309 ch = &target->ch[blk_mq_unique_tag_to_hwq(tag)]; in srp_queuecommand()
2311 WARN_ONCE(idx >= target->req_ring_size, "%s: tag %#x: idx %d >= %d\n", in srp_queuecommand()
2313 target->req_ring_size); in srp_queuecommand()
2323 dev = target->srp_host->srp_dev->dev; in srp_queuecommand()
2324 ib_dma_sync_single_for_cpu(dev, iu->dma, target->max_iu_len, in srp_queuecommand()
2342 shost_printk(KERN_ERR, target->scsi_host, in srp_queuecommand()
2355 ib_dma_sync_single_for_device(dev, iu->dma, target->max_iu_len, in srp_queuecommand()
2359 shost_printk(KERN_ERR, target->scsi_host, PFX "Send failed\n"); in srp_queuecommand()
2401 struct srp_target_port *target = ch->target; in srp_alloc_iu_bufs() local
2404 ch->rx_ring = kcalloc(target->queue_size, sizeof(*ch->rx_ring), in srp_alloc_iu_bufs()
2408 ch->tx_ring = kcalloc(target->queue_size, sizeof(*ch->tx_ring), in srp_alloc_iu_bufs()
2413 for (i = 0; i < target->queue_size; ++i) { in srp_alloc_iu_bufs()
2414 ch->rx_ring[i] = srp_alloc_iu(target->srp_host, in srp_alloc_iu_bufs()
2421 for (i = 0; i < target->queue_size; ++i) { in srp_alloc_iu_bufs()
2422 ch->tx_ring[i] = srp_alloc_iu(target->srp_host, in srp_alloc_iu_bufs()
2423 target->max_iu_len, in srp_alloc_iu_bufs()
2434 for (i = 0; i < target->queue_size; ++i) { in srp_alloc_iu_bufs()
2435 srp_free_iu(target->srp_host, ch->rx_ring[i]); in srp_alloc_iu_bufs()
2436 srp_free_iu(target->srp_host, ch->tx_ring[i]); in srp_alloc_iu_bufs()
2463 * Set target->rq_tmo_jiffies to one second more than the largest time in srp_compute_rq_tmo()
2480 struct srp_target_port *target = ch->target; in srp_cm_rep_handler() local
2494 target->scsi_host->can_queue in srp_cm_rep_handler()
2496 target->scsi_host->can_queue); in srp_cm_rep_handler()
2497 target->scsi_host->cmd_per_lun in srp_cm_rep_handler()
2498 = min_t(int, target->scsi_host->can_queue, in srp_cm_rep_handler()
2499 target->scsi_host->cmd_per_lun); in srp_cm_rep_handler()
2501 shost_printk(KERN_WARNING, target->scsi_host, in srp_cm_rep_handler()
2513 for (i = 0; i < target->queue_size; i++) { in srp_cm_rep_handler()
2521 if (!target->using_rdma_cm) { in srp_cm_rep_handler()
2541 target->rq_tmo_jiffies = srp_compute_rq_tmo(qp_attr, attr_mask); in srp_cm_rep_handler()
2561 struct srp_target_port *target = ch->target; in srp_ib_cm_rej_handler() local
2562 struct Scsi_Host *shost = target->scsi_host; in srp_ib_cm_rej_handler()
2580 if (srp_target_is_topspin(target)) { in srp_ib_cm_rej_handler()
2591 PFX "Topspin/Cisco redirect to target port GID %016llx%016llx\n", in srp_ib_cm_rej_handler()
2621 target->sgid.raw, in srp_ib_cm_rej_handler()
2622 target->ib_cm.orig_dgid.raw, in srp_ib_cm_rej_handler()
2647 struct srp_target_port *target = ch->target; in srp_ib_cm_handler() local
2652 shost_printk(KERN_DEBUG, target->scsi_host, in srp_ib_cm_handler()
2664 shost_printk(KERN_DEBUG, target->scsi_host, PFX "REJ received\n"); in srp_ib_cm_handler()
2671 shost_printk(KERN_WARNING, target->scsi_host, in srp_ib_cm_handler()
2675 shost_printk(KERN_ERR, target->scsi_host, in srp_ib_cm_handler()
2677 queue_work(system_long_wq, &target->tl_err_work); in srp_ib_cm_handler()
2681 shost_printk(KERN_ERR, target->scsi_host, in srp_ib_cm_handler()
2694 shost_printk(KERN_WARNING, target->scsi_host, in srp_ib_cm_handler()
2708 struct srp_target_port *target = ch->target; in srp_rdma_cm_rej_handler() local
2709 struct Scsi_Host *shost = target->scsi_host; in srp_rdma_cm_rej_handler()
2759 struct srp_target_port *target = ch->target; in srp_rdma_cm_handler() local
2785 shost_printk(KERN_DEBUG, target->scsi_host, in srp_rdma_cm_handler()
2797 shost_printk(KERN_DEBUG, target->scsi_host, PFX "REJ received\n"); in srp_rdma_cm_handler()
2805 shost_printk(KERN_WARNING, target->scsi_host, in srp_rdma_cm_handler()
2810 queue_work(system_long_wq, &target->tl_err_work); in srp_rdma_cm_handler()
2815 shost_printk(KERN_ERR, target->scsi_host, in srp_rdma_cm_handler()
2823 shost_printk(KERN_WARNING, target->scsi_host, in srp_rdma_cm_handler()
2852 struct srp_target_port *target = ch->target; in srp_send_tsk_mgmt() local
2853 struct srp_rport *rport = target->rport; in srp_send_tsk_mgmt()
2854 struct ib_device *dev = target->srp_host->srp_dev->dev; in srp_send_tsk_mgmt()
2859 if (!ch->connected || target->qp_in_error) in srp_send_tsk_mgmt()
2915 struct srp_target_port *target = host_to_target(scmnd->device->host); in srp_abort() local
2922 shost_printk(KERN_ERR, target->scsi_host, "SRP abort called\n"); in srp_abort()
2928 if (WARN_ON_ONCE(ch_idx >= target->ch_count)) in srp_abort()
2930 ch = &target->ch[ch_idx]; in srp_abort()
2933 shost_printk(KERN_ERR, target->scsi_host, in srp_abort()
2938 else if (target->rport->state == SRP_RPORT_LOST) in srp_abort()
2953 struct srp_target_port *target = host_to_target(scmnd->device->host); in srp_reset_device() local
2957 shost_printk(KERN_ERR, target->scsi_host, "SRP reset_device called\n"); in srp_reset_device()
2959 ch = &target->ch[0]; in srp_reset_device()
2971 struct srp_target_port *target = host_to_target(scmnd->device->host); in srp_reset_host() local
2973 shost_printk(KERN_ERR, target->scsi_host, PFX "SRP reset_host called\n"); in srp_reset_host()
2975 return srp_reconnect_rport(target->rport) == 0 ? SUCCESS : FAILED; in srp_reset_host()
2981 struct srp_target_port *target = host_to_target(shost); in srp_target_alloc() local
2983 if (target->target_can_queue) in srp_target_alloc()
2984 starget->can_queue = target->target_can_queue; in srp_target_alloc()
2991 struct srp_target_port *target = host_to_target(shost); in srp_slave_alloc() local
2992 struct srp_device *srp_dev = target->srp_host->srp_dev; in srp_slave_alloc()
3005 struct srp_target_port *target = host_to_target(shost); in srp_slave_configure() local
3010 timeout = max_t(unsigned, 30 * HZ, target->rq_tmo_jiffies); in srp_slave_configure()
3020 struct srp_target_port *target = host_to_target(class_to_shost(dev)); in show_id_ext() local
3022 return sprintf(buf, "0x%016llx\n", be64_to_cpu(target->id_ext)); in show_id_ext()
3028 struct srp_target_port *target = host_to_target(class_to_shost(dev)); in show_ioc_guid() local
3030 return sprintf(buf, "0x%016llx\n", be64_to_cpu(target->ioc_guid)); in show_ioc_guid()
3036 struct srp_target_port *target = host_to_target(class_to_shost(dev)); in show_service_id() local
3038 if (target->using_rdma_cm) in show_service_id()
3041 be64_to_cpu(target->ib_cm.service_id)); in show_service_id()
3047 struct srp_target_port *target = host_to_target(class_to_shost(dev)); in show_pkey() local
3049 if (target->using_rdma_cm) in show_pkey()
3051 return sprintf(buf, "0x%04x\n", be16_to_cpu(target->ib_cm.pkey)); in show_pkey()
3057 struct srp_target_port *target = host_to_target(class_to_shost(dev)); in show_sgid() local
3059 return sprintf(buf, "%pI6\n", target->sgid.raw); in show_sgid()
3065 struct srp_target_port *target = host_to_target(class_to_shost(dev)); in show_dgid() local
3066 struct srp_rdma_ch *ch = &target->ch[0]; in show_dgid()
3068 if (target->using_rdma_cm) in show_dgid()
3076 struct srp_target_port *target = host_to_target(class_to_shost(dev)); in show_orig_dgid() local
3078 if (target->using_rdma_cm) in show_orig_dgid()
3080 return sprintf(buf, "%pI6\n", target->ib_cm.orig_dgid.raw); in show_orig_dgid()
3086 struct srp_target_port *target = host_to_target(class_to_shost(dev)); in show_req_lim() local
3090 for (i = 0; i < target->ch_count; i++) { in show_req_lim()
3091 ch = &target->ch[i]; in show_req_lim()
3100 struct srp_target_port *target = host_to_target(class_to_shost(dev)); in show_zero_req_lim() local
3102 return sprintf(buf, "%d\n", target->zero_req_lim); in show_zero_req_lim()
3108 struct srp_target_port *target = host_to_target(class_to_shost(dev)); in show_local_ib_port() local
3110 return sprintf(buf, "%d\n", target->srp_host->port); in show_local_ib_port()
3116 struct srp_target_port *target = host_to_target(class_to_shost(dev)); in show_local_ib_device() local
3118 return sprintf(buf, "%s\n", target->srp_host->srp_dev->dev->name); in show_local_ib_device()
3124 struct srp_target_port *target = host_to_target(class_to_shost(dev)); in show_ch_count() local
3126 return sprintf(buf, "%d\n", target->ch_count); in show_ch_count()
3132 struct srp_target_port *target = host_to_target(class_to_shost(dev)); in show_comp_vector() local
3134 return sprintf(buf, "%d\n", target->comp_vector); in show_comp_vector()
3140 struct srp_target_port *target = host_to_target(class_to_shost(dev)); in show_tl_retry_count() local
3142 return sprintf(buf, "%d\n", target->tl_retry_count); in show_tl_retry_count()
3148 struct srp_target_port *target = host_to_target(class_to_shost(dev)); in show_cmd_sg_entries() local
3150 return sprintf(buf, "%u\n", target->cmd_sg_cnt); in show_cmd_sg_entries()
3156 struct srp_target_port *target = host_to_target(class_to_shost(dev)); in show_allow_ext_sg() local
3158 return sprintf(buf, "%s\n", target->allow_ext_sg ? "true" : "false"); in show_allow_ext_sg()
3235 * < 0 upon failure. Caller is responsible for SRP target port cleanup.
3236 * 0 and target->state == SRP_TARGET_REMOVED if asynchronous target port
3238 * 0 and target->state != SRP_TARGET_REMOVED upon success.
3240 static int srp_add_target(struct srp_host *host, struct srp_target_port *target) in srp_add_target() argument
3245 target->state = SRP_TARGET_SCANNING; in srp_add_target()
3246 sprintf(target->target_name, "SRP.T10:%016llX", in srp_add_target()
3247 be64_to_cpu(target->id_ext)); in srp_add_target()
3249 if (scsi_add_host(target->scsi_host, host->srp_dev->dev->dev.parent)) in srp_add_target()
3252 memcpy(ids.port_id, &target->id_ext, 8); in srp_add_target()
3253 memcpy(ids.port_id + 8, &target->ioc_guid, 8); in srp_add_target()
3255 rport = srp_rport_add(target->scsi_host, &ids); in srp_add_target()
3257 scsi_remove_host(target->scsi_host); in srp_add_target()
3261 rport->lld_data = target; in srp_add_target()
3262 target->rport = rport; in srp_add_target()
3265 list_add_tail(&target->list, &host->target_list); in srp_add_target()
3268 scsi_scan_target(&target->scsi_host->shost_gendev, in srp_add_target()
3269 0, target->scsi_id, SCAN_WILD_CARD, SCSI_SCAN_INITIAL); in srp_add_target()
3271 if (srp_connected_ch(target) < target->ch_count || in srp_add_target()
3272 target->qp_in_error) { in srp_add_target()
3273 shost_printk(KERN_INFO, target->scsi_host, in srp_add_target()
3275 srp_queue_remove_work(target); in srp_add_target()
3280 dev_name(&target->scsi_host->shost_gendev), in srp_add_target()
3281 srp_sdev_count(target->scsi_host)); in srp_add_target()
3283 spin_lock_irq(&target->lock); in srp_add_target()
3284 if (target->state == SRP_TARGET_SCANNING) in srp_add_target()
3285 target->state = SRP_TARGET_LIVE; in srp_add_target()
3286 spin_unlock_irq(&target->lock); in srp_add_target()
3306 * srp_conn_unique() - check whether the connection to a target is unique
3308 * @target: SRP target port.
3311 struct srp_target_port *target) in srp_conn_unique() argument
3316 if (target->state == SRP_TARGET_REMOVED) in srp_conn_unique()
3323 if (t != target && in srp_conn_unique()
3324 target->id_ext == t->id_ext && in srp_conn_unique()
3325 target->ioc_guid == t->ioc_guid && in srp_conn_unique()
3326 target->initiator_ext == t->initiator_ext) { in srp_conn_unique()
3338 * Target ports are added by writing
3445 struct srp_target_port *target) in srp_parse_options() argument
3482 target->id_ext = cpu_to_be64(ull); in srp_parse_options()
3498 target->ioc_guid = cpu_to_be64(ull); in srp_parse_options()
3514 ret = hex2bin(target->ib_cm.orig_dgid.raw, p, 16); in srp_parse_options()
3525 target->ib_cm.pkey = cpu_to_be16(token); in srp_parse_options()
3540 target->ib_cm.service_id = cpu_to_be64(ull); in srp_parse_options()
3550 ret = srp_parse_in(net, &target->rdma_cm.src.ss, p, in srp_parse_options()
3557 target->rdma_cm.src_specified = true; in srp_parse_options()
3567 ret = srp_parse_in(net, &target->rdma_cm.dst.ss, p, in srp_parse_options()
3576 target->using_rdma_cm = true; in srp_parse_options()
3585 target->scsi_host->max_sectors = token; in srp_parse_options()
3593 target->scsi_host->can_queue = token; in srp_parse_options()
3594 target->queue_size = token + SRP_RSP_SQ_SIZE + in srp_parse_options()
3597 target->scsi_host->cmd_per_lun = token; in srp_parse_options()
3606 target->scsi_host->cmd_per_lun = token; in srp_parse_options()
3615 target->target_can_queue = token; in srp_parse_options()
3630 target->io_class = token; in srp_parse_options()
3645 target->initiator_ext = cpu_to_be64(ull); in srp_parse_options()
3655 target->cmd_sg_cnt = token; in srp_parse_options()
3663 target->allow_ext_sg = !!token; in srp_parse_options()
3673 target->sg_tablesize = token; in srp_parse_options()
3681 target->comp_vector = token; in srp_parse_options()
3690 target->tl_retry_count = token; in srp_parse_options()
3694 pr_warn("unknown parameter or missing value '%s' in target creation request\n", in srp_parse_options()
3707 pr_warn("target creation request is missing one or more parameters\n"); in srp_parse_options()
3709 if (target->scsi_host->cmd_per_lun > target->scsi_host->can_queue in srp_parse_options()
3712 target->scsi_host->cmd_per_lun, in srp_parse_options()
3713 target->scsi_host->can_queue); in srp_parse_options()
3727 struct srp_target_port *target; in srp_create_target() local
3746 target = host_to_target(target_host); in srp_create_target()
3748 target->net = kobj_ns_grab_current(KOBJ_NS_TYPE_NET); in srp_create_target()
3749 target->io_class = SRP_REV16A_IB_IO_CLASS; in srp_create_target()
3750 target->scsi_host = target_host; in srp_create_target()
3751 target->srp_host = host; in srp_create_target()
3752 target->lkey = host->srp_dev->pd->local_dma_lkey; in srp_create_target()
3753 target->global_rkey = host->srp_dev->global_rkey; in srp_create_target()
3754 target->cmd_sg_cnt = cmd_sg_entries; in srp_create_target()
3755 target->sg_tablesize = indirect_sg_entries ? : cmd_sg_entries; in srp_create_target()
3756 target->allow_ext_sg = allow_ext_sg; in srp_create_target()
3757 target->tl_retry_count = 7; in srp_create_target()
3758 target->queue_size = SRP_DEFAULT_QUEUE_SIZE; in srp_create_target()
3764 scsi_host_get(target->scsi_host); in srp_create_target()
3770 ret = srp_parse_options(target->net, buf, target); in srp_create_target()
3774 target->req_ring_size = target->queue_size - SRP_TSK_MGMT_SQ_SIZE; in srp_create_target()
3776 if (!srp_conn_unique(target->srp_host, target)) { in srp_create_target()
3777 if (target->using_rdma_cm) { in srp_create_target()
3778 shost_printk(KERN_INFO, target->scsi_host, in srp_create_target()
3779 PFX "Already connected to target port with id_ext=%016llx;ioc_guid=%016llx;dest=%pIS\n", in srp_create_target()
3780 be64_to_cpu(target->id_ext), in srp_create_target()
3781 be64_to_cpu(target->ioc_guid), in srp_create_target()
3782 &target->rdma_cm.dst); in srp_create_target()
3784 shost_printk(KERN_INFO, target->scsi_host, in srp_create_target()
3785 …PFX "Already connected to target port with id_ext=%016llx;ioc_guid=%016llx;initiator_ext=%016llx\n… in srp_create_target()
3786 be64_to_cpu(target->id_ext), in srp_create_target()
3787 be64_to_cpu(target->ioc_guid), in srp_create_target()
3788 be64_to_cpu(target->initiator_ext)); in srp_create_target()
3794 if (!srp_dev->has_fmr && !srp_dev->has_fr && !target->allow_ext_sg && in srp_create_target()
3795 target->cmd_sg_cnt < target->sg_tablesize) { in srp_create_target()
3797 target->sg_tablesize = target->cmd_sg_cnt; in srp_create_target()
3821 (target->scsi_host->max_sectors + 1 + in srp_create_target()
3825 (target->sg_tablesize + in srp_create_target()
3830 target->scsi_host->max_sectors, srp_dev->max_pages_per_mr, srp_dev->mr_page_size, in srp_create_target()
3834 target_host->sg_tablesize = target->sg_tablesize; in srp_create_target()
3835 target->mr_pool_size = target->scsi_host->can_queue * mr_per_cmd; in srp_create_target()
3836 target->mr_per_cmd = mr_per_cmd; in srp_create_target()
3837 target->indirect_size = target->sg_tablesize * in srp_create_target()
3839 target->max_iu_len = sizeof (struct srp_cmd) + in srp_create_target()
3841 target->cmd_sg_cnt * sizeof (struct srp_direct_buf); in srp_create_target()
3843 INIT_WORK(&target->tl_err_work, srp_tl_err_work); in srp_create_target()
3844 INIT_WORK(&target->remove_work, srp_remove_work); in srp_create_target()
3845 spin_lock_init(&target->lock); in srp_create_target()
3846 ret = rdma_query_gid(ibdev, host->port, 0, &target->sgid); in srp_create_target()
3851 target->ch_count = max_t(unsigned, num_online_nodes(), in srp_create_target()
3856 target->ch = kcalloc(target->ch_count, sizeof(*target->ch), in srp_create_target()
3858 if (!target->ch) in srp_create_target()
3863 const int ch_start = (node_idx * target->ch_count / in srp_create_target()
3865 const int ch_end = ((node_idx + 1) * target->ch_count / in srp_create_target()
3878 ch = &target->ch[ch_start + cpu_idx]; in srp_create_target()
3879 ch->target = target; in srp_create_target()
3900 if (target->using_rdma_cm) in srp_create_target()
3902 &target->rdma_cm.dst); in srp_create_target()
3905 target->ib_cm.orig_dgid.raw); in srp_create_target()
3906 shost_printk(KERN_ERR, target->scsi_host, in srp_create_target()
3909 target->ch_count, dst); in srp_create_target()
3913 srp_free_ch_ib(target, ch); in srp_create_target()
3914 srp_free_req_data(target, ch); in srp_create_target()
3915 target->ch_count = ch - target->ch; in srp_create_target()
3927 target->scsi_host->nr_hw_queues = target->ch_count; in srp_create_target()
3929 ret = srp_add_target(host, target); in srp_create_target()
3933 if (target->state != SRP_TARGET_REMOVED) { in srp_create_target()
3934 if (target->using_rdma_cm) { in srp_create_target()
3935 shost_printk(KERN_DEBUG, target->scsi_host, PFX in srp_create_target()
3936 "new target: id_ext %016llx ioc_guid %016llx sgid %pI6 dest %pIS\n", in srp_create_target()
3937 be64_to_cpu(target->id_ext), in srp_create_target()
3938 be64_to_cpu(target->ioc_guid), in srp_create_target()
3939 target->sgid.raw, &target->rdma_cm.dst); in srp_create_target()
3941 shost_printk(KERN_DEBUG, target->scsi_host, PFX in srp_create_target()
3942 … "new target: id_ext %016llx ioc_guid %016llx pkey %04x service_id %016llx sgid %pI6 dgid %pI6\n", in srp_create_target()
3943 be64_to_cpu(target->id_ext), in srp_create_target()
3944 be64_to_cpu(target->ioc_guid), in srp_create_target()
3945 be16_to_cpu(target->ib_cm.pkey), in srp_create_target()
3946 be64_to_cpu(target->ib_cm.service_id), in srp_create_target()
3947 target->sgid.raw, in srp_create_target()
3948 target->ib_cm.orig_dgid.raw); in srp_create_target()
3958 scsi_host_put(target->scsi_host); in srp_create_target()
3965 if (target->state != SRP_TARGET_REMOVED) in srp_create_target()
3966 kobj_ns_drop(KOBJ_NS_TYPE_NET, target->net); in srp_create_target()
3967 scsi_host_put(target->scsi_host); in srp_create_target()
3973 srp_disconnect_target(target); in srp_create_target()
3976 for (i = 0; i < target->ch_count; i++) { in srp_create_target()
3977 ch = &target->ch[i]; in srp_create_target()
3978 srp_free_ch_ib(target, ch); in srp_create_target()
3979 srp_free_req_data(target, ch); in srp_create_target()
3982 kfree(target->ch); in srp_create_target()
4134 struct srp_target_port *target; in srp_remove_one() local
4144 * target ports can be created. in srp_remove_one()
4149 * Remove all target ports. in srp_remove_one()
4152 list_for_each_entry(target, &host->target_list, list) in srp_remove_one()
4153 srp_queue_remove_work(target); in srp_remove_one()
4157 * Wait for tl_err and target port removal tasks. in srp_remove_one()