IB/srpt patches for Linux kernel v4.6
Subsystems (3)
v2 cover IB/srpt patches for Linux kernel v4.6
This series of patches is what I came up with while testing the most recent version of my SCSI target patch series (see also
http://thread.gmane.org/gmane.linux.scsi.target.devel/10905). This includes fixes for ABORT handling and a lockup during driver shutdown.
The changes compared to v1 of this patch series are:
- Rebased this patch series on top of kernel v4.5-rc1.
- As proposed by Alex Estrin, modified patch "Simplify srpt_handle_tsk_mgmt()" such that task management function code validity is now checked by the target core.
- Added a comment in patch "Simplify channel state management".
- Changed "return true" into "return 1" in patch "Simplify srpt_shutdown_session()" as proposed by Christoph.
- Fixed patch "Fix srpt_handle_cmd() error paths" based on the feedback provided by Sagi.
- Split patch "Eliminate srpt_find_channel()" in three patches.
- Left out patch "Fix a rare crash in srpt_close_session()". It is no longer needed because srpt_disconnect_ch() is now called with the sdev mutex held.
- Added several new patches.
The patches in this series are:
0001-IB-srpt-Add-parentheses-around-sizeof-argument.patch 0002-IB-srpt-Remove-struct-srpt_node_acl.patch 0003-IB-srpt-Inline-srpt_sdev_name.patch 0004-IB-srpt-Inline-srpt_get_ch_state.patch 0005-IB-srpt-Introduce-target_reverse_dma_direction.patch 0006-IB-srpt-Use-scsilun_to_int.patch 0007-IB-srpt-Simplify-srpt_handle_tsk_mgmt.patch 0008-IB-srpt-Simplify-channel-state-management.patch 0009-IB-srpt-Simplify-srpt_shutdown_session.patch 0010-IB-srpt-Do-not-complain-about-initiator-names-withou.patch 0011-IB-srpt-Fix-srpt_close_session.patch 0012-IB-srpt-Fix-srpt_handle_cmd-error-paths.patch 0013-IB-srpt-Fix-how-aborted-commands-are-processed.patch 0014-IB-srpt-Inline-trivial-CM-callback-functions.patch 0015-IB-srpt-Eliminate-srpt_find_channel.patch 0016-IB-srpt-Log-private-data-associated-with-REJ.patch 0017-IB-srpt-Convert-rch_list-to-RCU.patch 0018-IB-srpt-Detect-session-shutdown-reliably.patch 0019-IB-srpt-Fix-srpt_write_pending.patch 0020-IB-srpt-Log-out-all-initiators-if-a-port-is-disabled.patch 0021-IB-srpt-Introduce-srpt_process_wait_list.patch 0022-IB-srpt-Fix-wait-list-processing.patch
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH v2 1/22 IB/srpt: Add parentheses around sizeof argument
Although sizeof is an operator and hence in many cases parentheses can be left out, the recommended kernel coding style is to surround the sizeof argument with parentheses. This patch does not change any functionality and has been generated by running the following shell command:
sed -i 's/sizeof \([^ );,]*\)/sizeof(\1)/g' drivers/infiniband/ulp/srpt/*.[ch]
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 42 +++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +21 -21
@@ -281,7 +281,7 @@ static void srpt_get_class_port_info(struct ib_dm_mad *mad)struct ib_class_port_info *cif; cif = (struct ib_class_port_info *)mad->data; -memset (cif,0 ,sizeof *cif); +memset (cif,0 ,sizeof (*cif)); cif->base_version =1 ; cif->class_version =1 ; cif->resp_time_value =20 ;
@@ -340,7 +340,7 @@ static void srpt_get_ioc(struct srpt_port *sport, u32 slot,return ; } -memset (iocp,0 ,sizeof *iocp); +memset (iocp,0 ,sizeof (*iocp));strcpy (iocp->id_string,SRPT_ID_STRING ); iocp->guid =cpu_to_be64 (srpt_service_guid); iocp->vendor_id =cpu_to_be32 (sdev->device->attrs.vendor_id);
@@ -390,7 +390,7 @@ static void srpt_get_svc_entries(u64 ioc_guid, } svc_entries = (struct ib_dm_svc_entries *)mad->data; -memset (svc_entries,0 ,sizeof *svc_entries); +memset (svc_entries,0 ,sizeof (*svc_entries)); svc_entries->service_entries[0 ].id =cpu_to_be64 (ioc_guid); snprintf(svc_entries->service_entries[0].name, sizeof(svc_entries->service_entries[0].name),
@@ -484,7 +484,7 @@ static void srpt_mad_recv_handler(struct ib_mad_agent *mad_agent, rsp->ah = ah; dm_mad = rsp->mad; -memcpy (dm_mad, mad_wc->recv_buf.mad,sizeof *dm_mad); +memcpy (dm_mad, mad_wc->recv_buf.mad,sizeof (*dm_mad)); dm_mad->mad_hdr.method =IB_MGMT_METHOD_GET_RESP ; dm_mad->mad_hdr.status =0 ;
@@ -532,7 +532,7 @@ static int srpt_refresh_port(struct srpt_port *sport)struct ib_port_attr port_attr;int ret; -memset (&port_modify,0 ,sizeof port_modify); +memset (&port_modify,0 ,sizeof (port_modify)); port_modify.set_port_cap_mask =IB_PORT_DEVICE_MGMT_SUP ; port_modify.clr_port_cap_mask =0 ;
@@ -553,7 +553,7 @@ static int srpt_refresh_port(struct srpt_port *sport) goto err_query_port;if (!sport->mad_agent) { -memset (®_req,0 ,sizeof reg_req); +memset (®_req,0 ,sizeof (reg_req)); reg_req.mgmt_class =IB_MGMT_CLASS_DEVICE_MGMT ; reg_req.mgmt_class_version =IB_MGMT_BASE_VERSION ;set_bit (IB_MGMT_METHOD_GET , reg_req.method_mask);
@@ -903,14 +903,14 @@ static int srpt_get_desc_tbl(struct srpt_send_ioctx *ioctx, db = (struct srp_direct_buf *)(srp_cmd->add_data + add_cdb_offset); -memcpy (ioctx->rbufs, db,sizeof *db); +memcpy (ioctx->rbufs, db,sizeof (*db)); *data_len =be32_to_cpu (db->len); }else if (((srp_cmd->buf_fmt &0xf ) ==SRP_DATA_DESC_INDIRECT ) || ((srp_cmd->buf_fmt >>4 ) ==SRP_DATA_DESC_INDIRECT )) { idb = (struct srp_indirect_buf *)(srp_cmd->add_data + add_cdb_offset); - ioctx->n_rbuf =be32_to_cpu (idb->table_desc.len) /sizeof *db; + ioctx->n_rbuf =be32_to_cpu (idb->table_desc.len) /sizeof (*db);if (ioctx->n_rbuf > (srp_cmd->data_out_desc_cnt + srp_cmd->data_in_desc_cnt)) {
@@ -929,7 +929,7 @@ static int srpt_get_desc_tbl(struct srpt_send_ioctx *ioctx, ioctx->rbufs = &ioctx->single_rbuf; else { ioctx->rbufs = -kmalloc (ioctx->n_rbuf *sizeof *db,GFP_ATOMIC ); +kmalloc (ioctx->n_rbuf *sizeof (*db),GFP_ATOMIC );if (!ioctx->rbufs) { ioctx->n_rbuf =0 ; ret = -ENOMEM ;
@@ -938,7 +938,7 @@ static int srpt_get_desc_tbl(struct srpt_send_ioctx *ioctx, } db = idb->desc_list; -memcpy (ioctx->rbufs, db, ioctx->n_rbuf *sizeof *db); +memcpy (ioctx->rbufs, db, ioctx->n_rbuf *sizeof (*db)); *data_len =be32_to_cpu (idb->len); } out:
@@ -956,7 +956,7 @@ static int srpt_init_ch_qp(struct srpt_rdma_ch *ch, struct ib_qp *qp)struct ib_qp_attr *attr;int ret; - attr =kzalloc (sizeof *attr,GFP_KERNEL ); + attr =kzalloc (sizeof (*attr),GFP_KERNEL );if (!attr)return -ENOMEM ;
@@ -1464,7 +1464,7 @@ static int srpt_build_cmd_rsp(struct srpt_rdma_ch *ch, sense_data_len = ioctx->cmd.scsi_sense_length;WARN_ON (sense_data_len >sizeof (ioctx->sense_data)); -memset (srp_rsp,0 ,sizeof *srp_rsp); +memset (srp_rsp,0 ,sizeof (*srp_rsp)); srp_rsp->opcode =SRP_RSP ; srp_rsp->req_lim_delta =cpu_to_be32 (1 +atomic_xchg (&ch->req_lim_delta,0 ));
@@ -1514,7 +1514,7 @@ static int srpt_build_tskmgmt_rsp(struct srpt_rdma_ch *ch, srp_rsp = ioctx->ioctx.buf;BUG_ON (!srp_rsp); -memset (srp_rsp,0 ,sizeof *srp_rsp); +memset (srp_rsp,0 ,sizeof (*srp_rsp)); srp_rsp->opcode =SRP_RSP ; srp_rsp->req_lim_delta =
@@ -1950,7 +1950,7 @@ static int srpt_create_ch_ib(struct srpt_rdma_ch *ch)WARN_ON (ch->rq_size <1 ); ret = -ENOMEM ; - qp_init =kzalloc (sizeof *qp_init,GFP_KERNEL ); + qp_init =kzalloc (sizeof (*qp_init),GFP_KERNEL );if (!qp_init) goto out;
@@ -2266,9 +2266,9 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,be64_to_cpu (*(__be64 *)&sdev->port[param->port -1 ].gid.raw[0 ]), be64_to_cpu(*(__be64 *)&sdev->port[param->port - 1].gid.raw[8])); - rsp =kzalloc (sizeof *rsp,GFP_KERNEL ); - rej =kzalloc (sizeof *rej,GFP_KERNEL ); - rep_param =kzalloc (sizeof *rep_param,GFP_KERNEL ); + rsp =kzalloc (sizeof (*rsp),GFP_KERNEL ); + rej =kzalloc (sizeof (*rej),GFP_KERNEL ); + rep_param =kzalloc (sizeof (*rep_param),GFP_KERNEL );if (!rsp || !rej || !rep_param) { ret = -ENOMEM ;
@@ -2340,7 +2340,7 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, goto reject; } - ch =kzalloc (sizeof *ch,GFP_KERNEL ); + ch =kzalloc (sizeof (*ch),GFP_KERNEL );if (!ch) { rej->reason =cpu_to_be32 (SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES );
@@ -2453,7 +2453,7 @@ try_again:/* create cm reply */ rep_param->qp_num = ch->qp->qp_num; rep_param->private_data = (void *)rsp; - rep_param->private_data_len =sizeof *rsp; + rep_param->private_data_len =sizeof (*rsp); rep_param->rnr_retry_count =7 ; rep_param->flow_control =1 ; rep_param->failover_accepted =0 ;
@@ -2497,7 +2497,7 @@ reject: | SRP_BUF_FORMAT_INDIRECT);ib_send_cm_rej (cm_id,IB_CM_REJ_CONSUMER_DEFINED ,NULL ,0 , - (void *)rej,sizeof *rej); + (void *)rej,sizeof (*rej)); out:kfree (rep_param);
@@ -3003,7 +3003,7 @@ static void srpt_add_one(struct ib_device *device)pr_debug ("device = %p, device->dma_ops = %p\n" , device, device->dma_ops); - sdev =kzalloc (sizeof *sdev,GFP_KERNEL ); + sdev =kzalloc (sizeof (*sdev),GFP_KERNEL );if (!sdev) goto err;
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 2/22 IB/srpt: Remove struct srpt_node_acl
In reply to a message not in the archiveSince struct srpt_node_acl is identical to struct se_node_acl, remove the definition of the former structure. This patch does not change any functionality.
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 2 +- drivers/infiniband/ulp/srpt/ib_srpt.h | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +1 -1
@@ -3565,7 +3565,7 @@ static struct configfs_attribute *srpt_wwn_attrs[] = {static const struct target_core_fabric_ops srpt_template = { .module =THIS_MODULE , .name ="srpt" , - .node_acl_size =sizeof (struct srpt_node_acl ), + .node_acl_size =sizeof (struct se_node_acl ), .get_fabric_name = srpt_get_fabric_name, .tpg_get_wwn = srpt_get_fabric_wwn, .tpg_get_tag = srpt_get_tag,
drivers/infiniband/ulp/srpt/ib_srpt.h +0 -8
@@ -363,12 +363,4 @@ struct srpt_device { struct list_head list; }; -/** -* struct srpt_node_acl - Per-initiator ACL data (managed via configfs). -* @nacl: Target core node ACL information. -*/ -struct srpt_node_acl { -struct se_node_acl nacl; -}; -#endif /* IB_SRPT_H */
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): [email protected]
Christoph Hellwig
Reviewed-byRe: [PATCH v2 02/22] IB/srpt: Remove struct srpt_node_acl
drivers/infiniband/ulp/srpt/ib_srpt.c static struct configfs_attribute *srpt_wwn_attrs[] = { · line 3568
Quoted 1 line
drivers/infiniband/ulp/srpt/ib_srpt.c +1
-0+ .node_acl_size = sizeof(struct se_node_acl),
This is the default, no need to even set this member.
Otherwise looks fine:
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH v2 02/22] IB/srpt: Remove struct srpt_node_acl
In reply to a message not in the archiveTG9va3MgZ29vZC4NCg0KUmV2aWV3ZWQtYnk6IEFsZXggRXN0cmluIDxhbGV4LmVzdHJpbkBpbnRl bC5jb20+DQoNCj4gU2luY2Ugc3RydWN0IHNycHRfbm9kZV9hY2wgaXMgaWRlbnRpY2FsIHRvIHN0 cnVjdCBzZV9ub2RlX2FjbCwNCj4gcmVtb3ZlIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBmb3JtZXIg c3RydWN0dXJlLiBUaGlzIHBhdGNoIGRvZXMNCj4gbm90IGNoYW5nZSBhbnkgZnVuY3Rpb25hbGl0 eS4NCj4gDQo+IFNpZ25lZC1vZmYtYnk6IEJhcnQgVmFuIEFzc2NoZSA8YmFydC52YW5hc3NjaGVA c2FuZGlzay5jb20+DQo+IENjOiBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGxzdC5kZT4NCj4gQ2M6 IFNhZ2kgR3JpbWJlcmcgPHNhZ2lnQG1lbGxhbm94LmNvbT4NCj4gLS0tDQo+ICBkcml2ZXJzL2lu ZmluaWJhbmQvdWxwL3NycHQvaWJfc3JwdC5jIHwgMiArLQ0KPiAgZHJpdmVycy9pbmZpbmliYW5k L3VscC9zcnB0L2liX3NycHQuaCB8IDggLS0tLS0tLS0NCj4gIDIgZmlsZXMgY2hhbmdlZCwgMSBp bnNlcnRpb24oKyksIDkgZGVsZXRpb25zKC0pDQo+IA0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9p bmZpbmliYW5kL3VscC9zcnB0L2liX3NycHQuYw0KPiBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAv c3JwdC9pYl9zcnB0LmMNCj4gaW5kZXggZjY1YWU2MC4uZmRlMzJlZCAxMDA2NDQNCj4gLS0tIGEv ZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnB0L2liX3NycHQuYw0KPiArKysgYi9kcml2ZXJzL2lu ZmluaWJhbmQvdWxwL3NycHQvaWJfc3JwdC5jDQo+IEBAIC0zNTY1LDcgKzM1NjUsNyBAQCBzdGF0 aWMgc3RydWN0IGNvbmZpZ2ZzX2F0dHJpYnV0ZSAqc3JwdF93d25fYXR0cnNbXSA9IHsNCj4gIHN0 YXRpYyBjb25zdCBzdHJ1Y3QgdGFyZ2V0X2NvcmVfZmFicmljX29wcyBzcnB0X3RlbXBsYXRlID0g ew0KPiAgCS5tb2R1bGUJCQkJPSBUSElTX01PRFVMRSwNCj4gIAkubmFtZQkJCQk9ICJzcnB0IiwN Cj4gLQkubm9kZV9hY2xfc2l6ZQkJCT0gc2l6ZW9mKHN0cnVjdCBzcnB0X25vZGVfYWNsKSwNCj4g Kwkubm9kZV9hY2xfc2l6ZQkJCT0gc2l6ZW9mKHN0cnVjdCBzZV9ub2RlX2FjbCksDQo+ICAJLmdl dF9mYWJyaWNfbmFtZQkJPSBzcnB0X2dldF9mYWJyaWNfbmFtZSwNCj4gIAkudHBnX2dldF93d24J CQk9IHNycHRfZ2V0X2ZhYnJpY193d24sDQo+ICAJLnRwZ19nZXRfdGFnCQkJPSBzcnB0X2dldF90 YWcsDQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycHQvaWJfc3JwdC5o DQo+IGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnB0L2liX3NycHQuaA0KPiBpbmRleCAwOTAz N2YyLi5iMGVkZTk3IDEwMDY0NA0KPiAtLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycHQv aWJfc3JwdC5oDQo+ICsrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwdC9pYl9zcnB0LmgN Cj4gQEAgLTM2MywxMiArMzYzLDQgQEAgc3RydWN0IHNycHRfZGV2aWNlIHsNCj4gIAlzdHJ1Y3Qg bGlzdF9oZWFkCWxpc3Q7DQo+ICB9Ow0KPiANCj4gLS8qKg0KPiAtICogc3RydWN0IHNycHRfbm9k ZV9hY2wgLSBQZXItaW5pdGlhdG9yIEFDTCBkYXRhIChtYW5hZ2VkIHZpYSBjb25maWdmcykuDQo+ IC0gKiBAbmFjbDogICAgICBUYXJnZXQgY29yZSBub2RlIEFDTCBpbmZvcm1hdGlvbi4NCj4gLSAq Lw0KPiAtc3RydWN0IHNycHRfbm9kZV9hY2wgew0KPiAtCXN0cnVjdCBzZV9ub2RlX2FjbAluYWNs Ow0KPiAtfTsNCj4gLQ0KPiAgI2VuZGlmCQkJCS8qIElCX1NSUFRfSCAqLw0KPiAtLQ0KPiAyLjcu MA0KDQo=
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 3/22 IB/srpt: Inline srpt_sdev_name()
In reply to a message not in the archivesrpt_sdev_name() is too trivial to keep it as a separate function. Hence inline this function.
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +2 -12
@@ -109,16 +109,6 @@ enum dma_data_direction opposite_dma_dir(enum dma_data_direction dir) } } -/** -* srpt_sdev_name() - Return the name associated with the HCA. -* -* Examples are ib0, ib1, ... -*/ -static inline const char *srpt_sdev_name (struct srpt_device *sdev) -{ -return sdev->device->name; -} -static enum rdma_ch_state srpt_get_ch_state (struct srpt_rdma_ch *ch) {unsigned long flags;
@@ -182,7 +172,7 @@ static void srpt_event_handler(struct ib_event_handler *handler,return ;pr_debug ("ASYNC event= %d on device= %s\n" , event->event, -srpt_sdev_name (sdev)); + sdev->device->name);switch (event->event) {case IB_EVENT_PORT_ERR :
@@ -3082,7 +3072,7 @@ static void srpt_add_one(struct ib_device *device)if (srpt_refresh_port (sport)) {pr_err ("MAD registration failed for %s-%d.\n" , -srpt_sdev_name (sdev), i); + sdev->device->name, i); goto err_ring; } snprintf(sport->port_guid, sizeof(sport->port_guid),
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 4/22 IB/srpt: Inline srpt_get_ch_state()
In reply to a message not in the archiveThe callers of srpt_get_ch_state() can access ch->state safely without using locking. Hence inline this function.
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 42 ++++++++++------------------------- 1 file changed, 12 insertions(+), 30 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +12 -30
@@ -109,17 +109,6 @@ enum dma_data_direction opposite_dma_dir(enum dma_data_direction dir) } } -static enum rdma_ch_state srpt_get_ch_state (struct srpt_rdma_ch *ch) -{ -unsigned long flags; -enum rdma_ch_state state; - -spin_lock_irqsave (&ch->spinlock, flags); - state = ch->state; -spin_unlock_irqrestore (&ch->spinlock, flags); -return state; -} -static enum rdma_ch_state srpt_set_ch_state (struct srpt_rdma_ch *ch,enum rdma_ch_state new_state) {
@@ -216,7 +205,7 @@ static void srpt_srq_event(struct ib_event *event, void *ctx)static void srpt_qp_event (struct ib_event *event,struct srpt_rdma_ch *ch) {pr_debug ("QP event %d on cm_id=%p sess_name=%s state=%d\n" , - event->event, ch->cm_id, ch->sess_name,srpt_get_ch_state (ch)); + event->event, ch->cm_id, ch->sess_name, ch->state);switch (event->event) {case IB_EVENT_COMM_EST :
@@ -228,7 +217,7 @@ static void srpt_qp_event(struct ib_event *event, struct srpt_rdma_ch *ch)srpt_release_channel (ch); else pr_debug("%s: state %d - ignored LAST_WQE.\n", - ch->sess_name, srpt_get_ch_state(ch)); + ch->sess_name, ch->state);break ;default :pr_err ("received unrecognized IB QP event %d\n" , event->event);
@@ -1790,7 +1779,6 @@ static void srpt_handle_new_iu(struct srpt_rdma_ch *ch, struct srpt_send_ioctx *send_ioctx) {struct srp_cmd *srp_cmd; -enum rdma_ch_state ch_state;BUG_ON (!ch);BUG_ON (!recv_ioctx);
@@ -1799,13 +1787,12 @@ static void srpt_handle_new_iu(struct srpt_rdma_ch *ch, recv_ioctx->ioctx.dma, srp_max_req_size, DMA_FROM_DEVICE); - ch_state =srpt_get_ch_state (ch); -if (unlikely (ch_state ==CH_CONNECTING )) { +if (unlikely (ch->state ==CH_CONNECTING )) {list_add_tail (&recv_ioctx->wait_list, &ch->cmd_wait_list); goto out; } -if (unlikely (ch_state !=CH_LIVE )) +if (unlikely (ch->state !=CH_LIVE )) goto out; srp_cmd = recv_ioctx->ioctx.buf;
@@ -1914,7 +1901,7 @@ static void srpt_send_done(struct ib_cq *cq, struct ib_wc *wc) out:while (!list_empty (&ch->cmd_wait_list) && -srpt_get_ch_state (ch) ==CH_LIVE && + ch->state ==CH_LIVE && (ioctx =srpt_get_send_ioctx (ch)) !=NULL ) {struct srpt_recv_ioctx *recv_ioctx;
@@ -2295,17 +2282,14 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, && param->port == ch->sport->port && param->listen_id == ch->sport->sdev->cm_id && ch->cm_id) { -enum rdma_ch_state ch_state; - - ch_state =srpt_get_ch_state (ch); -if (ch_state !=CH_CONNECTING - && ch_state !=CH_LIVE ) +if (ch->state !=CH_CONNECTING + && ch->state !=CH_LIVE )continue ;/* found an existing channel */ pr_debug ("Found existing channel %s" " cm_id= %p state= %d\n" , - ch->sess_name, ch->cm_id, ch_state); + ch->sess_name, ch->cm_id, ch->state);__srpt_close_ch (ch);
@@ -2556,7 +2540,7 @@ static void srpt_cm_dreq_recv(struct ib_cm_id *cm_id) ch =srpt_find_channel (cm_id->context, cm_id);BUG_ON (!ch); -pr_debug ("cm_id= %p ch->state= %d\n" , cm_id,srpt_get_ch_state (ch)); +pr_debug ("cm_id= %p ch->state= %d\n" , cm_id, ch->state);spin_lock_irqsave (&ch->spinlock, flags);switch (ch->state) {
@@ -2748,7 +2732,6 @@ static int srpt_write_pending(struct se_cmd *se_cmd)struct srpt_rdma_ch *ch;struct srpt_send_ioctx *ioctx;enum srpt_command_state new_state; -enum rdma_ch_state ch_state;int ret; ioctx = container_of(se_cmd, struct srpt_send_ioctx, cmd);
@@ -2759,10 +2742,9 @@ static int srpt_write_pending(struct se_cmd *se_cmd) ch = ioctx->ch;BUG_ON (!ch); - ch_state =srpt_get_ch_state (ch); -switch (ch_state) { +switch (ch->state) {case CH_CONNECTING : -WARN (true,"unexpected channel state %d\n" , ch_state); +WARN (true,"unexpected channel state %d\n" , ch->state); ret = -EINVAL ; goto out;case CH_LIVE :
@@ -3228,7 +3210,7 @@ static void srpt_close_session(struct se_session *se_sess) ch = se_sess->fabric_sess_ptr;WARN_ON (ch->sess != se_sess); -pr_debug ("ch %p state %d\n" , ch,srpt_get_ch_state (ch)); +pr_debug ("ch %p state %d\n" , ch, ch->state); sdev = ch->sport->sdev;spin_lock_irq (&sdev->spinlock);
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 5/22 IB/srpt: Introduce target_reverse_dma_direction()
In reply to a message not in the archiveUse the function target_reverse_dma_direction() instead of reimplementing it.
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +2 -15
@@ -96,19 +96,6 @@ static int srpt_queue_status(struct se_cmd *cmd);static void srpt_recv_done (struct ib_cq *cq,struct ib_wc *wc);static void srpt_send_done (struct ib_cq *cq,struct ib_wc *wc); -/** -* opposite_dma_dir() - Swap DMA_TO_DEVICE and DMA_FROM_DEVICE. -*/ -static inline -enum dma_data_direction opposite_dma_dir (enum dma_data_direction dir) -{ -switch (dir) { -case DMA_TO_DEVICE :return DMA_FROM_DEVICE ; -case DMA_FROM_DEVICE :return DMA_TO_DEVICE ; -default :return dir; - } -} -static enum rdma_ch_state srpt_set_ch_state (struct srpt_rdma_ch *ch,enum rdma_ch_state new_state) {
@@ -1049,7 +1036,7 @@ static void srpt_unmap_sg_to_ib_sge(struct srpt_rdma_ch *ch, dir = ioctx->cmd.data_direction;BUG_ON (dir ==DMA_NONE );ib_dma_unmap_sg (ch->sport->sdev->device, sg, ioctx->sg_cnt, -opposite_dma_dir (dir)); +target_reverse_dma_direction (&ioctx->cmd)); ioctx->mapped_sg_count =0 ; } }
@@ -1086,7 +1073,7 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch, ioctx->sg_cnt = sg_cnt = cmd->t_data_nents; count =ib_dma_map_sg (ch->sport->sdev->device, sg, sg_cnt, -opposite_dma_dir (dir)); +target_reverse_dma_direction (cmd));if (unlikely (!count))return -EAGAIN ;
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 6/22 IB/srpt: Use scsilun_to_int()
In reply to a message not in the archiveJust like other target drivers, use scsilun_to_int() to unpack SCSI LUN numbers. This patch only changes the behavior of ib_srpt for LUN numbers >= 16384.
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 92 +++-------------------------------- 1 file changed, 6 insertions(+), 86 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +6 -86
@@ -1494,80 +1494,6 @@ static int srpt_build_tskmgmt_rsp(struct srpt_rdma_ch *ch,return resp_len; } -#define NO_SUCH_LUN ((uint64_t)-1LL) - -/* -* SCSI LUN addressing method. See also SAM-2 and the section about -* eight byte LUNs. -*/ -enum scsi_lun_addr_method { -SCSI_LUN_ADDR_METHOD_PERIPHERAL =0 , -SCSI_LUN_ADDR_METHOD_FLAT =1 , -SCSI_LUN_ADDR_METHOD_LUN =2 , -SCSI_LUN_ADDR_METHOD_EXTENDED_LUN =3 , -}; - -/* -* srpt_unpack_lun() - Convert from network LUN to linear LUN. -* -* Convert an 2-byte, 4-byte, 6-byte or 8-byte LUN structure in network byte -* order (big endian) to a linear LUN. Supports three LUN addressing methods: -* peripheral, flat and logical unit. See also SAM-2, section 4.9.4 (page 40). -*/ -static uint64_t srpt_unpack_lun (const uint8_t *lun,int len) -{ -uint64_t res =NO_SUCH_LUN ; -int addressing_method; - -if (unlikely (len <2 )) { -pr_err ("Illegal LUN length %d, expected 2 bytes or more\n" , - len); - goto out; - } - -switch (len) { -case 8 : -if ((*((__be64 *)lun) & -cpu_to_be64 (0x0000FFFFFFFFFFFFLL )) !=0 ) - goto out_err; -break ; -case 4 : -if (*((__be16 *)&lun[2 ]) !=0 ) - goto out_err; -break ; -case 6 : -if (*((__be32 *)&lun[2 ]) !=0 ) - goto out_err; -break ; -case 2 : -break ; -default : - goto out_err; - } - - addressing_method = (*lun) >>6 ;/* highest two bits of byte 0 */ -switch (addressing_method) { -case SCSI_LUN_ADDR_METHOD_PERIPHERAL : -case SCSI_LUN_ADDR_METHOD_FLAT : -case SCSI_LUN_ADDR_METHOD_LUN : - res = *(lun +1 ) | (((*lun) &0x3f ) <<8 ); -break ; - -case SCSI_LUN_ADDR_METHOD_EXTENDED_LUN : -default : -pr_err ("Unimplemented LUN addressing method %u\n" , - addressing_method); -break ; - } - -out: -return res; - -out_err: -pr_err ("Support for multi-level LUNs has not yet been implemented\n" ); - goto out; -} -static int srpt_check_stop_free (struct se_cmd *cmd) { struct srpt_send_ioctx *ioctx = container_of(cmd,
@@ -1585,7 +1511,6 @@ static int srpt_handle_cmd(struct srpt_rdma_ch *ch, {struct se_cmd *cmd;struct srp_cmd *srp_cmd; -uint64_t unpacked_lun;u64 data_len;enum dma_data_direction dir;sense_reason_t ret;
@@ -1620,11 +1545,10 @@ static int srpt_handle_cmd(struct srpt_rdma_ch *ch, goto send_sense; } - unpacked_lun =srpt_unpack_lun ((uint8_t *)&srp_cmd->lun, -sizeof (srp_cmd->lun)); rc =target_submit_cmd (cmd, ch->sess, srp_cmd->cdb, - &send_ioctx->sense_data[0 ], unpacked_lun, data_len, -TCM_SIMPLE_TAG , dir,TARGET_SCF_ACK_KREF ); + &send_ioctx->sense_data[0 ], +scsilun_to_int (&srp_cmd->lun), data_len, +TCM_SIMPLE_TAG , dir,TARGET_SCF_ACK_KREF );if (rc !=0 ) { ret =TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ; goto send_sense;
@@ -1710,7 +1634,6 @@ static void srpt_handle_tsk_mgmt(struct srpt_rdma_ch *ch,struct srp_tsk_mgmt *srp_tsk;struct se_cmd *cmd;struct se_session *sess = ch->sess; -uint64_t unpacked_lun;uint32_t tag =0 ;int tcm_tmr;int rc;
@@ -1732,9 +1655,6 @@ static void srpt_handle_tsk_mgmt(struct srpt_rdma_ch *ch,TMR_TASK_MGMT_FUNCTION_NOT_SUPPORTED ; goto fail; } - unpacked_lun =srpt_unpack_lun ((uint8_t *)&srp_tsk->lun, -sizeof (srp_tsk->lun)); -if (srp_tsk->tsk_mgmt_func ==SRP_TSK_ABORT_TASK ) { rc =srpt_rx_mgmt_fn_tag (send_ioctx, srp_tsk->task_tag);if (rc <0 ) {
@@ -1744,9 +1664,9 @@ static void srpt_handle_tsk_mgmt(struct srpt_rdma_ch *ch, } tag = srp_tsk->task_tag; } - rc =target_submit_tmr (&send_ioctx->cmd, sess,NULL , unpacked_lun, - srp_tsk, tcm_tmr,GFP_KERNEL , tag, -TARGET_SCF_ACK_KREF ); + rc =target_submit_tmr (&send_ioctx->cmd, sess,NULL , +scsilun_to_int (&srp_tsk->lun), srp_tsk, tcm_tmr, +GFP_KERNEL , tag,TARGET_SCF_ACK_KREF );if (rc !=0 ) { send_ioctx->cmd.se_tmr_req->response =TMR_FUNCTION_REJECTED ; goto fail;
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 7/22 IB/srpt: Simplify srpt_handle_tsk_mgmt()
In reply to a message not in the archiveLet the target core check task existence instead of the SRP target driver. Additionally, let the target core check the validity of the task management request instead of the ib_srpt driver.
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 61 ++--------------------------------- include/target/target_core_base.h | 1 + 2 files changed, 4 insertions(+), 58 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +3 -58
@@ -1560,47 +1560,6 @@ send_sense:return -1 ; } -/** -* srpt_rx_mgmt_fn_tag() - Process a task management function by tag. -* @ch: RDMA channel of the task management request. -* @fn: Task management function to perform. -* @req_tag: Tag of the SRP task management request. -* @mgmt_ioctx: I/O context of the task management request. -* -* Returns zero if the target core will process the task management -* request asynchronously. -* -* Note: It is assumed that the initiator serializes tag-based task management -* requests. -*/ -static int srpt_rx_mgmt_fn_tag (struct srpt_send_ioctx *ioctx,u64 tag) -{ -struct srpt_device *sdev; -struct srpt_rdma_ch *ch; -struct srpt_send_ioctx *target; -int ret, i; - - ret = -EINVAL ; - ch = ioctx->ch; -BUG_ON (!ch); -BUG_ON (!ch->sport); - sdev = ch->sport->sdev; -BUG_ON (!sdev); -spin_lock_irq (&sdev->spinlock); -for (i =0 ; i < ch->rq_size; ++i) { - target = ch->ioctx_ring[i]; -if (target->cmd.se_lun == ioctx->cmd.se_lun && - target->cmd.tag == tag && -srpt_get_cmd_state (target) !=SRPT_STATE_DONE ) { - ret =0 ; -/* now let the target core abort &target->cmd; */ -break ; - } - } -spin_unlock_irq (&sdev->spinlock); -return ret; -} -static int srp_tmr_to_tcm (int fn) {switch (fn) {
@@ -1615,7 +1574,7 @@ static int srp_tmr_to_tcm(int fn)case SRP_TSK_CLEAR_ACA :return TMR_CLEAR_ACA ;default : -return -1 ; +return UNKNOWN_TMR ; } }
@@ -1634,7 +1593,6 @@ static void srpt_handle_tsk_mgmt(struct srpt_rdma_ch *ch,struct srp_tsk_mgmt *srp_tsk;struct se_cmd *cmd;struct se_session *sess = ch->sess; -uint32_t tag =0 ;int tcm_tmr;int rc;
@@ -1650,23 +1608,10 @@ static void srpt_handle_tsk_mgmt(struct srpt_rdma_ch *ch,srpt_set_cmd_state (send_ioctx,SRPT_STATE_MGMT ); send_ioctx->cmd.tag = srp_tsk->tag; tcm_tmr =srp_tmr_to_tcm (srp_tsk->tsk_mgmt_func); -if (tcm_tmr <0 ) { - send_ioctx->cmd.se_tmr_req->response = -TMR_TASK_MGMT_FUNCTION_NOT_SUPPORTED ; - goto fail; - } -if (srp_tsk->tsk_mgmt_func ==SRP_TSK_ABORT_TASK ) { - rc =srpt_rx_mgmt_fn_tag (send_ioctx, srp_tsk->task_tag); -if (rc <0 ) { - send_ioctx->cmd.se_tmr_req->response = -TMR_TASK_DOES_NOT_EXIST ; - goto fail; - } - tag = srp_tsk->task_tag; - } rc =target_submit_tmr (&send_ioctx->cmd, sess,NULL ,scsilun_to_int (&srp_tsk->lun), srp_tsk, tcm_tmr, -GFP_KERNEL , tag,TARGET_SCF_ACK_KREF ); +GFP_KERNEL , srp_tsk->task_tag, +TARGET_SCF_ACK_KREF );if (rc !=0 ) { send_ioctx->cmd.se_tmr_req->response =TMR_FUNCTION_REJECTED ; goto fail;
include/target/target_core_base.h +1 -0
@@ -191,6 +191,7 @@ enum target_sc_flags_table {/* fabric independent task management function values */ enum tcm_tmreq_table { +UNKNOWN_TMR =0 ,TMR_ABORT_TASK =1 ,TMR_ABORT_TASK_SET =2 ,TMR_CLEAR_ACA =3 ,
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): [email protected]
Christoph Hellwig
Reviewed-byRe: [PATCH v2 07/22] IB/srpt: Simplify srpt_handle_tsk_mgmt()
Quoted 3 lines · Bart Van Assche
Let the target core check task existence instead of the SRP target driver. Additionally, let the target core check the validity of the task management request instead of the
ib_srptdriver.
Looks good,
But two comments:
- it would be nice to move this to the front of the series to ease stable backports as Alex seems to be hitting a bug this fixes.
- maybe defer adding the UNKNOWN_TMR constants to minimize conflicts with target core updates.
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 8/22 IB/srpt: Simplify channel state management
In reply to a message not in the archiveThe only allowed channel state changes are those that change the channel state into a state with a higher numerical value. This allows to merge the functions srpt_set_ch_state() and srpt_test_and_set_ch_state() into a single function.
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 44 +++++++++++------------------------ 1 file changed, 13 insertions(+), 31 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +13 -31
@@ -96,37 +96,25 @@ static int srpt_queue_status(struct se_cmd *cmd);static void srpt_recv_done (struct ib_cq *cq,struct ib_wc *wc);static void srpt_send_done (struct ib_cq *cq,struct ib_wc *wc); -static enum rdma_ch_state -srpt_set_ch_state (struct srpt_rdma_ch *ch,enum rdma_ch_state new_state) -{ -unsigned long flags; -enum rdma_ch_state prev; - -spin_lock_irqsave (&ch->spinlock, flags); - prev = ch->state; - ch->state = new_state; -spin_unlock_irqrestore (&ch->spinlock, flags); -return prev; -} - -/** -* srpt_test_and_set_ch_state() - Test and set the channel state. -* -* Returns true if and only if the channel state has been set to the new state. +/* +* The only allowed channel state changes are those that change the channel +* state into a state with a higher numerical value. Hence the new > prev test. */ -static bool -srpt_test_and_set_ch_state (struct srpt_rdma_ch *ch,enum rdma_ch_state old, -enum rdma_ch_state new) +static bool srpt_set_ch_state (struct srpt_rdma_ch *ch,enum rdma_ch_state new) {unsigned long flags;enum rdma_ch_state prev; +bool changed = false;spin_lock_irqsave (&ch->spinlock, flags); prev = ch->state; -if (prev == old) +if (new > prev) { ch->state = new; + changed = true; + }spin_unlock_irqrestore (&ch->spinlock, flags); -return prev == old; + +return changed; }/**
@@ -199,8 +187,7 @@ static void srpt_qp_event(struct ib_event *event, struct srpt_rdma_ch *ch)ib_cm_notify (ch->cm_id, event->event);break ;case IB_EVENT_QP_LAST_WQE_REACHED : -if (srpt_test_and_set_ch_state (ch,CH_DRAINING , -CH_RELEASING )) +if (srpt_set_ch_state (ch,CH_RELEASING ))srpt_release_channel (ch);else pr_debug("%s: state %d - ignored LAST_WQE.\n",
@@ -1947,12 +1934,7 @@ static void srpt_drain_channel(struct ib_cm_id *cm_id)spin_lock_irq (&sdev->spinlock);list_for_each_entry (ch, &sdev->rch_list, list) {if (ch->cm_id == cm_id) { - do_reset =srpt_test_and_set_ch_state (ch, -CH_CONNECTING ,CH_DRAINING ) || -srpt_test_and_set_ch_state (ch, -CH_LIVE ,CH_DRAINING ) || -srpt_test_and_set_ch_state (ch, -CH_DISCONNECTING ,CH_DRAINING ); + do_reset =srpt_set_ch_state (ch,CH_DRAINING );break ; } }
@@ -2353,7 +2335,7 @@ static void srpt_cm_rtu_recv(struct ib_cm_id *cm_id) ch =srpt_find_channel (cm_id->context, cm_id);BUG_ON (!ch); -if (srpt_test_and_set_ch_state (ch,CH_CONNECTING ,CH_LIVE )) { +if (srpt_set_ch_state (ch,CH_LIVE )) {struct srpt_recv_ioctx *ioctx, *ioctx_tmp; ret =srpt_ch_qp_rts (ch, ch->qp);
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 9/22 IB/srpt: Simplify srpt_shutdown_session()
In reply to a message not in the archiveThe target core guarantees that shutdown_session() is only invoked once per session. This means that the ib_srpt target driver doesn't have to track whether or not shutdown_session() has been called. Additionally, ensure that target_sess_cmd_list_set_waiting() is called before target_wait_for_sess_cmds() by moving it into srpt_release_channel_work().
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 16 ++-------------- drivers/infiniband/ulp/srpt/ib_srpt.h | 1 - 2 files changed, 2 insertions(+), 15 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +2 -14
@@ -1892,20 +1892,7 @@ static void srpt_close_ch(struct srpt_rdma_ch *ch)*/ static int srpt_shutdown_session (struct se_session *se_sess) { -struct srpt_rdma_ch *ch = se_sess->fabric_sess_ptr; -unsigned long flags; - -spin_lock_irqsave (&ch->spinlock, flags); -if (ch->in_shutdown) { -spin_unlock_irqrestore (&ch->spinlock, flags); -return true; - } - - ch->in_shutdown = true; -target_sess_cmd_list_set_waiting (se_sess); -spin_unlock_irqrestore (&ch->spinlock, flags); - -return true; +return 1 ; }/**
@@ -2008,6 +1995,7 @@ static void srpt_release_channel_work(struct work_struct *w) se_sess = ch->sess;BUG_ON (!se_sess); +target_sess_cmd_list_set_waiting (se_sess);target_wait_for_sess_cmds (se_sess);transport_deregister_session_configfs (se_sess);
drivers/infiniband/ulp/srpt/ib_srpt.h +0 -1
@@ -286,7 +286,6 @@ struct srpt_rdma_ch {u8 sess_name[36 ];struct work_struct release_work;struct completion *release_done; -bool in_shutdown; };/**
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 10/22 IB/srpt: Do not complain about initiator names without leading "0x"
In reply to a message not in the archiveOnly log an error message if neither the lookup with leading "0x" nor the lookup without leading "0x" succeeds.
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +6 -11
@@ -2042,7 +2042,6 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,struct se_node_acl *se_acl;u32 it_iu_len;int i, ret =0 ; -unsigned char *p;WARN_ON_ONCE (irqs_disabled ());
@@ -2200,7 +2199,6 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, be64_to_cpu(*(__be64 *)(ch->i_port_id + 8)));pr_debug ("registering session %s\n" , ch->sess_name); - p = &ch->sess_name[0 ]; ch->sess =transport_init_session (TARGET_PROT_NORMAL );if (IS_ERR (ch->sess)) {
@@ -2210,18 +2208,15 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, goto destroy_ib; } -try_again: - se_acl =core_tpg_get_initiator_node_acl (&sport->port_tpg_1, p); + se_acl =core_tpg_get_initiator_node_acl (&sport->port_tpg_1, + &ch->sess_name[0 ]); +/* If no match, retry without leading '0x'. */ +if (!se_acl) + se_acl =core_tpg_get_initiator_node_acl (&sport->port_tpg_1, + &ch->sess_name[2 ]);if (!se_acl) {pr_info ("Rejected login because no ACL has been" " configured yet for initiator %s.\n" , ch->sess_name); -/* -* XXX: Hack to retry of ch->i_port_id without leading '0x' -*/ -if (p == &ch->sess_name[0 ]) { - p +=2 ; - goto try_again; - } rej->reason =cpu_to_be32 (SRP_LOGIN_REJ_CHANNEL_LIMIT_REACHED );transport_free_session (ch->sess);
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): [email protected]
Re: [PATCH v2 10/22] IB/srpt: Do not complain about initiator names without leading "0x"
(added Nic to CC-list)
Quoted 48 lines · Bart Van Assche
Only log an error message if neither the lookup with leading "0x" nor the lookup without leading "0x" succeeds.
Signed-off-by Bart Van Assche <[email protected]>Fixes f246c941549c ("ib_srpt: Convert acl lookup to modern get_initiator_node_acl usage")Cc Christoph Hellwig <[email protected]>Cc Sagi Grimberg <sagig-VPRAkNaXOzVWk0Htik3J/[email protected]>Cc Nicholas Bellinger <[email protected]>--- drivers/infiniband/ulp/srpt/ib_srpt.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-)drivers/infiniband/ulp/srpt/ib_srpt.c +6
-4@@ -2042,7 +2042,6 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,struct se_node_acl *se_acl;u32 it_iu_len;int i, ret =0 ; -unsigned char *p;WARN_ON_ONCE (irqs_disabled ());@@ -2200,7 +2199,6 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, be64_to_cpu(*(__be64 *)(ch->i_port_id + 8)));pr_debug ("registering session %s\n" , ch->sess_name); - p = &ch->sess_name[0 ]; ch->sess =transport_init_session (TARGET_PROT_NORMAL );if (IS_ERR (ch->sess)) {@@ -2210,18 +2208,15 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, goto destroy_ib; } -try_again: - se_acl =core_tpg_get_initiator_node_acl (&sport->port_tpg_1, p); + se_acl =core_tpg_get_initiator_node_acl (&sport->port_tpg_1, + &ch->sess_name[0 ]); +/* If no match, retry without leading '0x'. */ +if (!se_acl) + se_acl =core_tpg_get_initiator_node_acl (&sport->port_tpg_1, + &ch->sess_name[2 ]);if (!se_acl) {pr_info ("Rejected login because no ACL has been" " configured yet for initiator %s.\n" , ch->sess_name);
drivers/infiniband/ulp/srpt/ib_srpt.c static int srpt_cm_req_recv(struct ib_cm_id *cm_id, · line 2222
Quoted 10 lines
drivers/infiniband/ulp/srpt/ib_srpt.c +0
-7-/* -* XXX: Hack to retry of ch->i_port_id without leading '0x' -*/ -if (p == &ch->sess_name[0 ]) { - p +=2 ; - goto try_again; - } rej->reason =cpu_to_be32 (SRP_LOGIN_REJ_CHANNEL_LIMIT_REACHED );transport_free_session (ch->sess);
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v2 10/22] IB/srpt: Do not complain about initiator names without leading "0x"
In reply to a message not in the archiveQuoted 2 lines · Bart Van Assche
Only log an error message if neither the lookup with leading "0x" nor the lookup without leading "0x" succeeds.
Looks fine to me, but this is going to conflict with some work in Nic's tree. Maybe it's better to ѕkip this one for now?
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH v2 10/22] IB/srpt: Do not complain about initiator names without leading "0x"
In reply to a message not in the archiveTG9va3MgZmluZSB0byBtZS4NCg0KUmV2aWV3ZWQtYnk6IEFsZXggRXN0cmluIDxhbGV4LmVzdHJp bkBpbnRlbC5jb20+DQoNCj4gT25seSBsb2cgYW4gZXJyb3IgbWVzc2FnZSBpZiBuZWl0aGVyIHRo ZSBsb29rdXAgd2l0aCBsZWFkaW5nICIweCINCj4gbm9yIHRoZSBsb29rdXAgd2l0aG91dCBsZWFk aW5nICIweCIgc3VjY2VlZHMuDQo+IA0KPiBTaWduZWQtb2ZmLWJ5OiBCYXJ0IFZhbiBBc3NjaGUg PGJhcnQudmFuYXNzY2hlQHNhbmRpc2suY29tPg0KPiBGaXhlczogZjI0NmM5NDE1NDljICgiaWJf c3JwdDogQ29udmVydCBhY2wgbG9va3VwIHRvIG1vZGVybiBnZXRfaW5pdGlhdG9yX25vZGVfYWNs DQo+IHVzYWdlIikNCj4gQ2M6IENocmlzdG9waCBIZWxsd2lnIDxoY2hAbHN0LmRlPg0KPiBDYzog U2FnaSBHcmltYmVyZyA8c2FnaWdAbWVsbGFub3guY29tPg0KPiBDYzogTmljaG9sYXMgQmVsbGlu Z2VyIDxuYWJAbGludXgtaXNjc2kub3JnPg0KPiAtLS0NCj4gIGRyaXZlcnMvaW5maW5pYmFuZC91 bHAvc3JwdC9pYl9zcnB0LmMgfCAxNyArKysrKystLS0tLS0tLS0tLQ0KPiAgMSBmaWxlIGNoYW5n ZWQsIDYgaW5zZXJ0aW9ucygrKSwgMTEgZGVsZXRpb25zKC0pDQo+IA0KPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnB0L2liX3NycHQuYw0KPiBiL2RyaXZlcnMvaW5maW5p YmFuZC91bHAvc3JwdC9pYl9zcnB0LmMNCj4gaW5kZXggYjQ2ZThkNy4uZDg5MjczNiAxMDA2NDQN Cj4gLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnB0L2liX3NycHQuYw0KPiArKysgYi9k cml2ZXJzL2luZmluaWJhbmQvdWxwL3NycHQvaWJfc3JwdC5jDQo+IEBAIC0yMDQyLDcgKzIwNDIs NiBAQCBzdGF0aWMgaW50IHNycHRfY21fcmVxX3JlY3Yoc3RydWN0IGliX2NtX2lkICpjbV9pZCwN Cj4gIAlzdHJ1Y3Qgc2Vfbm9kZV9hY2wgKnNlX2FjbDsNCj4gIAl1MzIgaXRfaXVfbGVuOw0KPiAg CWludCBpLCByZXQgPSAwOw0KPiAtCXVuc2lnbmVkIGNoYXIgKnA7DQo+IA0KPiAgCVdBUk5fT05f T05DRShpcnFzX2Rpc2FibGVkKCkpOw0KPiANCj4gQEAgLTIyMDAsNyArMjE5OSw2IEBAIHN0YXRp YyBpbnQgc3JwdF9jbV9yZXFfcmVjdihzdHJ1Y3QgaWJfY21faWQgKmNtX2lkLA0KPiAgCQkJYmU2 NF90b19jcHUoKihfX2JlNjQgKikoY2gtPmlfcG9ydF9pZCArIDgpKSk7DQo+IA0KPiAgCXByX2Rl YnVnKCJyZWdpc3RlcmluZyBzZXNzaW9uICVzXG4iLCBjaC0+c2Vzc19uYW1lKTsNCj4gLQlwID0g JmNoLT5zZXNzX25hbWVbMF07DQo+IA0KPiAgCWNoLT5zZXNzID0gdHJhbnNwb3J0X2luaXRfc2Vz c2lvbihUQVJHRVRfUFJPVF9OT1JNQUwpOw0KPiAgCWlmIChJU19FUlIoY2gtPnNlc3MpKSB7DQo+ IEBAIC0yMjEwLDE4ICsyMjA4LDE1IEBAIHN0YXRpYyBpbnQgc3JwdF9jbV9yZXFfcmVjdihzdHJ1 Y3QgaWJfY21faWQgKmNtX2lkLA0KPiAgCQlnb3RvIGRlc3Ryb3lfaWI7DQo+ICAJfQ0KPiANCj4g LXRyeV9hZ2FpbjoNCj4gLQlzZV9hY2wgPSBjb3JlX3RwZ19nZXRfaW5pdGlhdG9yX25vZGVfYWNs KCZzcG9ydC0+cG9ydF90cGdfMSwgcCk7DQo+ICsJc2VfYWNsID0gY29yZV90cGdfZ2V0X2luaXRp YXRvcl9ub2RlX2FjbCgmc3BvcnQtPnBvcnRfdHBnXzEsDQo+ICsJCQkJCQkgJmNoLT5zZXNzX25h bWVbMF0pOw0KPiArCS8qIElmIG5vIG1hdGNoLCByZXRyeSB3aXRob3V0IGxlYWRpbmcgJzB4Jy4g Ki8NCj4gKwlpZiAoIXNlX2FjbCkNCj4gKwkJc2VfYWNsID0gY29yZV90cGdfZ2V0X2luaXRpYXRv cl9ub2RlX2FjbCgmc3BvcnQtPnBvcnRfdHBnXzEsDQo+ICsJCQkJCQkJICZjaC0+c2Vzc19uYW1l WzJdKTsNCj4gIAlpZiAoIXNlX2FjbCkgew0KPiAgCQlwcl9pbmZvKCJSZWplY3RlZCBsb2dpbiBi ZWNhdXNlIG5vIEFDTCBoYXMgYmVlbiINCj4gIAkJCSIgY29uZmlndXJlZCB5ZXQgZm9yIGluaXRp YXRvciAlcy5cbiIsIGNoLT5zZXNzX25hbWUpOw0KPiAtCQkvKg0KPiAtCQkgKiBYWFg6IEhhY2sg dG8gcmV0cnkgb2YgY2gtPmlfcG9ydF9pZCB3aXRob3V0IGxlYWRpbmcgJzB4Jw0KPiAtCQkgKi8N Cj4gLQkJaWYgKHAgPT0gJmNoLT5zZXNzX25hbWVbMF0pIHsNCj4gLQkJCXAgKz0gMjsNCj4gLQkJ CWdvdG8gdHJ5X2FnYWluOw0KPiAtCQl9DQo+ICAJCXJlai0+cmVhc29uID0gY3B1X3RvX2JlMzIo DQo+ICAJCQkJU1JQX0xPR0lOX1JFSl9DSEFOTkVMX0xJTUlUX1JFQUNIRUQpOw0KPiAgCQl0cmFu c3BvcnRfZnJlZV9zZXNzaW9uKGNoLT5zZXNzKTsNCj4gLS0NCj4gMi43LjANCg0K --
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 11/22 IB/srpt: Fix srpt_close_session()
In reply to a message not in the archiveAvoid that srpt_close_session() waits if it doesn't have to wait. Additionally, increase the time during which srpt_close_session() waits until closing a session has finished. This makes it easier to detect session shutdown bugs.
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +16 -15
@@ -1986,8 +1986,8 @@ static void srpt_release_channel_work(struct work_struct *w)struct se_session *se_sess; ch = container_of(w, struct srpt_rdma_ch, release_work); -pr_debug ("ch = %p; ch->sess = %p; release_done = %p\n" , ch, ch->sess, - ch->release_done); +pr_debug ("%s: %s-%d; release_done = %p\n" , __func__, ch->sess_name, + ch->qp->qp_num, ch->release_done); sdev = ch->sport->sdev;BUG_ON (!sdev);
@@ -2011,11 +2011,10 @@ static void srpt_release_channel_work(struct work_struct *w) ch->rsp_size, DMA_TO_DEVICE);spin_lock_irq (&sdev->spinlock); -list_del (&ch->list); -spin_unlock_irq (&sdev->spinlock); - +list_del_init (&ch->list);if (ch->release_done)complete (ch->release_done); +spin_unlock_irq (&sdev->spinlock);wake_up (&sdev->ch_releaseQ);
@@ -3020,24 +3019,26 @@ static void srpt_release_cmd(struct se_cmd *se_cmd)static void srpt_close_session (struct se_session *se_sess) {DECLARE_COMPLETION_ONSTACK (release_done); -struct srpt_rdma_ch *ch; -struct srpt_device *sdev; -unsigned long res; - - ch = se_sess->fabric_sess_ptr; -WARN_ON (ch->sess != se_sess); +struct srpt_rdma_ch *ch = se_sess->fabric_sess_ptr; +struct srpt_device *sdev = ch->sport->sdev; +bool wait; -pr_debug ("ch %p state %d\n" , ch, ch->state); +pr_debug ("ch %s-%d state %d\n" , ch->sess_name, ch->qp->qp_num, + ch->state); - sdev = ch->sport->sdev;spin_lock_irq (&sdev->spinlock);BUG_ON (ch->release_done); ch->release_done = &release_done; + wait = !list_empty (&ch->list);__srpt_close_ch (ch);spin_unlock_irq (&sdev->spinlock); - res =wait_for_completion_timeout (&release_done,60 *HZ ); -WARN_ON (res ==0 ); +if (!wait) +return ; + +while (wait_for_completion_timeout (&release_done,180 *HZ ) ==0 ) +pr_info ("%s(%s-%d state %d): still waiting ...\n" , __func__, + ch->sess_name, ch->qp->qp_num, ch->state); }/**
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 12/22 IB/srpt: Fix srpt_handle_cmd() error paths
In reply to a message not in the archiveThe target core function that should be called if target_submit_cmd() fails is target_put_sess_cmd(). Additionally, change the return type of srpt_handle_cmd() from int into void.
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +12 -12
@@ -91,6 +91,7 @@ MODULE_PARM_DESC(srpt_service_guid, " instead of using the node_guid of the first HCA.");static struct ib_client srpt_client; +static void srpt_release_cmd (struct se_cmd *se_cmd);static void srpt_release_channel (struct srpt_rdma_ch *ch);static int srpt_queue_status (struct se_cmd *cmd);static void srpt_recv_done (struct ib_cq *cq,struct ib_wc *wc);
@@ -1492,15 +1493,14 @@ static int srpt_check_stop_free(struct se_cmd *cmd)/** * srpt_handle_cmd() - Process SRP_CMD. */ -static int srpt_handle_cmd (struct srpt_rdma_ch *ch, -struct srpt_recv_ioctx *recv_ioctx, -struct srpt_send_ioctx *send_ioctx) +static void srpt_handle_cmd (struct srpt_rdma_ch *ch, +struct srpt_recv_ioctx *recv_ioctx, +struct srpt_send_ioctx *send_ioctx) {struct se_cmd *cmd;struct srp_cmd *srp_cmd;u64 data_len;enum dma_data_direction dir; -sense_reason_t ret;int rc;BUG_ON (!send_ioctx);
@@ -1528,8 +1528,7 @@ static int srpt_handle_cmd(struct srpt_rdma_ch *ch,if (srpt_get_desc_tbl (send_ioctx, srp_cmd, &dir, &data_len)) {pr_err ("0x%llx: parsing SRP descriptor table failed.\n" , srp_cmd->tag); - ret =TCM_INVALID_CDB_FIELD ; - goto send_sense; + goto release_ioctx; } rc = target_submit_cmd(cmd, ch->sess, srp_cmd->cdb,
@@ -1537,14 +1536,15 @@ static int srpt_handle_cmd(struct srpt_rdma_ch *ch,scsilun_to_int (&srp_cmd->lun), data_len, TCM_SIMPLE_TAG, dir, TARGET_SCF_ACK_KREF);if (rc !=0 ) { - ret =TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ; - goto send_sense; +pr_debug ("target_submit_cmd() returned %d for tag %#llx\n" , rc, + srp_cmd->tag); + goto release_ioctx; } -return 0 ; +return ; -send_sense: -transport_send_check_condition_and_sense (cmd, ret,0 ); -return -1 ; +release_ioctx: + send_ioctx->state =SRPT_STATE_DONE ; +srpt_release_cmd (cmd); }static int srp_tmr_to_tcm (int fn)
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): [email protected]
Christoph Hellwig
Reviewed-byRe: [PATCH v2 12/22] IB/srpt: Fix srpt_handle_cmd() error paths
Looks good,
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH v2 12/22] IB/srpt: Fix srpt_handle_cmd() error paths
In reply to a message not in the archiveTG9va3MgZ29vZC4NCg0KUmV2aWV3ZWQtYnk6IEFsZXggRXN0cmluIDxhbGV4LmVzdHJpbkBpbnRl bC5jb20+DQoNCj4gVGhlIHRhcmdldCBjb3JlIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxl ZCBpZiB0YXJnZXRfc3VibWl0X2NtZCgpDQo+IGZhaWxzIGlzIHRhcmdldF9wdXRfc2Vzc19jbWQo KS4gQWRkaXRpb25hbGx5LCBjaGFuZ2UgdGhlIHJldHVybiB0eXBlDQo+IG9mIHNycHRfaGFuZGxl X2NtZCgpIGZyb20gaW50IGludG8gdm9pZC4NCj4gDQo+IFNpZ25lZC1vZmYtYnk6IEJhcnQgVmFu IEFzc2NoZSA8YmFydC52YW5hc3NjaGVAc2FuZGlzay5jb20+DQo+IENjOiBDaHJpc3RvcGggSGVs bHdpZyA8aGNoQGxzdC5kZT4NCj4gQ2M6IFNhZ2kgR3JpbWJlcmcgPHNhZ2lnQG1lbGxhbm94LmNv bT4NCj4gLS0tDQo+ICBkcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycHQvaWJfc3JwdC5jIHwgMjQg KysrKysrKysrKysrLS0tLS0tLS0tLS0tDQo+ICAxIGZpbGUgY2hhbmdlZCwgMTIgaW5zZXJ0aW9u cygrKSwgMTIgZGVsZXRpb25zKC0pDQo+IA0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmli YW5kL3VscC9zcnB0L2liX3NycHQuYw0KPiBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwdC9p Yl9zcnB0LmMNCj4gaW5kZXggZWI2ZjgxMi4uOGFiNDMxZiAxMDA2NDQNCj4gLS0tIGEvZHJpdmVy cy9pbmZpbmliYW5kL3VscC9zcnB0L2liX3NycHQuYw0KPiArKysgYi9kcml2ZXJzL2luZmluaWJh bmQvdWxwL3NycHQvaWJfc3JwdC5jDQo+IEBAIC05MSw2ICs5MSw3IEBAIE1PRFVMRV9QQVJNX0RF U0Moc3JwdF9zZXJ2aWNlX2d1aWQsDQo+ICAJCSAiIGluc3RlYWQgb2YgdXNpbmcgdGhlIG5vZGVf Z3VpZCBvZiB0aGUgZmlyc3QgSENBLiIpOw0KPiANCj4gIHN0YXRpYyBzdHJ1Y3QgaWJfY2xpZW50 IHNycHRfY2xpZW50Ow0KPiArc3RhdGljIHZvaWQgc3JwdF9yZWxlYXNlX2NtZChzdHJ1Y3Qgc2Vf Y21kICpzZV9jbWQpOw0KPiAgc3RhdGljIHZvaWQgc3JwdF9yZWxlYXNlX2NoYW5uZWwoc3RydWN0 IHNycHRfcmRtYV9jaCAqY2gpOw0KPiAgc3RhdGljIGludCBzcnB0X3F1ZXVlX3N0YXR1cyhzdHJ1 Y3Qgc2VfY21kICpjbWQpOw0KPiAgc3RhdGljIHZvaWQgc3JwdF9yZWN2X2RvbmUoc3RydWN0IGli X2NxICpjcSwgc3RydWN0IGliX3djICp3Yyk7DQo+IEBAIC0xNDkyLDE1ICsxNDkzLDE0IEBAIHN0 YXRpYyBpbnQgc3JwdF9jaGVja19zdG9wX2ZyZWUoc3RydWN0IHNlX2NtZCAqY21kKQ0KPiAgLyoq DQo+ICAgKiBzcnB0X2hhbmRsZV9jbWQoKSAtIFByb2Nlc3MgU1JQX0NNRC4NCj4gICAqLw0KPiAt c3RhdGljIGludCBzcnB0X2hhbmRsZV9jbWQoc3RydWN0IHNycHRfcmRtYV9jaCAqY2gsDQo+IC0J CQkgICBzdHJ1Y3Qgc3JwdF9yZWN2X2lvY3R4ICpyZWN2X2lvY3R4LA0KPiAtCQkJICAgc3RydWN0 IHNycHRfc2VuZF9pb2N0eCAqc2VuZF9pb2N0eCkNCj4gK3N0YXRpYyB2b2lkIHNycHRfaGFuZGxl X2NtZChzdHJ1Y3Qgc3JwdF9yZG1hX2NoICpjaCwNCj4gKwkJCSAgICBzdHJ1Y3Qgc3JwdF9yZWN2 X2lvY3R4ICpyZWN2X2lvY3R4LA0KPiArCQkJICAgIHN0cnVjdCBzcnB0X3NlbmRfaW9jdHggKnNl bmRfaW9jdHgpDQo+ICB7DQo+ICAJc3RydWN0IHNlX2NtZCAqY21kOw0KPiAgCXN0cnVjdCBzcnBf Y21kICpzcnBfY21kOw0KPiAgCXU2NCBkYXRhX2xlbjsNCj4gIAllbnVtIGRtYV9kYXRhX2RpcmVj dGlvbiBkaXI7DQo+IC0Jc2Vuc2VfcmVhc29uX3QgcmV0Ow0KPiAgCWludCByYzsNCj4gDQo+ICAJ QlVHX09OKCFzZW5kX2lvY3R4KTsNCj4gQEAgLTE1MjgsOCArMTUyOCw3IEBAIHN0YXRpYyBpbnQg c3JwdF9oYW5kbGVfY21kKHN0cnVjdCBzcnB0X3JkbWFfY2ggKmNoLA0KPiAgCWlmIChzcnB0X2dl dF9kZXNjX3RibChzZW5kX2lvY3R4LCBzcnBfY21kLCAmZGlyLCAmZGF0YV9sZW4pKSB7DQo+ICAJ CXByX2VycigiMHglbGx4OiBwYXJzaW5nIFNSUCBkZXNjcmlwdG9yIHRhYmxlIGZhaWxlZC5cbiIs DQo+ICAJCSAgICAgICBzcnBfY21kLT50YWcpOw0KPiAtCQlyZXQgPSBUQ01fSU5WQUxJRF9DREJf RklFTEQ7DQo+IC0JCWdvdG8gc2VuZF9zZW5zZTsNCj4gKwkJZ290byByZWxlYXNlX2lvY3R4Ow0K PiAgCX0NCj4gDQo+ICAJcmMgPSB0YXJnZXRfc3VibWl0X2NtZChjbWQsIGNoLT5zZXNzLCBzcnBf Y21kLT5jZGIsDQo+IEBAIC0xNTM3LDE0ICsxNTM2LDE1IEBAIHN0YXRpYyBpbnQgc3JwdF9oYW5k bGVfY21kKHN0cnVjdCBzcnB0X3JkbWFfY2ggKmNoLA0KPiAgCQkJICAgICAgIHNjc2lsdW5fdG9f aW50KCZzcnBfY21kLT5sdW4pLCBkYXRhX2xlbiwNCj4gIAkJCSAgICAgICBUQ01fU0lNUExFX1RB RywgZGlyLCBUQVJHRVRfU0NGX0FDS19LUkVGKTsNCj4gIAlpZiAocmMgIT0gMCkgew0KPiAtCQly ZXQgPSBUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRTsNCj4gLQkJZ290byBz ZW5kX3NlbnNlOw0KPiArCQlwcl9kZWJ1ZygidGFyZ2V0X3N1Ym1pdF9jbWQoKSByZXR1cm5lZCAl ZCBmb3IgdGFnICUjbGx4XG4iLCByYywNCj4gKwkJCSBzcnBfY21kLT50YWcpOw0KPiArCQlnb3Rv IHJlbGVhc2VfaW9jdHg7DQo+ICAJfQ0KPiAtCXJldHVybiAwOw0KPiArCXJldHVybjsNCj4gDQo+ IC1zZW5kX3NlbnNlOg0KPiAtCXRyYW5zcG9ydF9zZW5kX2NoZWNrX2NvbmRpdGlvbl9hbmRfc2Vu c2UoY21kLCByZXQsIDApOw0KPiAtCXJldHVybiAtMTsNCj4gK3JlbGVhc2VfaW9jdHg6DQo+ICsJ c2VuZF9pb2N0eC0+c3RhdGUgPSBTUlBUX1NUQVRFX0RPTkU7DQo+ICsJc3JwdF9yZWxlYXNlX2Nt ZChjbWQpOw0KPiAgfQ0KPiANCj4gIHN0YXRpYyBpbnQgc3JwX3Rtcl90b190Y20oaW50IGZuKQ0K PiAtLQ0KPiAyLjcuMA0KPiANCj4gLS0NCj4gVG8gdW5zdWJzY3JpYmUgZnJvbSB0aGlzIGxpc3Q6 IHNlbmQgdGhlIGxpbmUgInVuc3Vic2NyaWJlIGxpbnV4LXJkbWEiIGluDQo+IHRoZSBib2R5IG9m IGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnDQo+IE1vcmUgbWFqb3Jkb21v IGluZm8gYXQgIGh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvbWFqb3Jkb21vLWluZm8uaHRtbA0K --
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 13/22 IB/srpt: Fix how aborted commands are processed
In reply to a message not in the archivesrpt_abort_cmd() must not be called in state SRPT_STATE_DATA_IN. Issue a warning if this occurs.
srpt_abort_cmd() must not invoke target_put_sess_cmd() for commands in state SRPT_STATE_DONE because the srpt_abort_cmd() callers already do this when necessary. Hence remove this call.
If an RDMA read fails the corresponding SCSI command must fail. Hence add a transport_generic_request_failure() call.
Remove an incorrect srpt_abort_cmd() call from srpt_rdma_write_done().
Avoid that srpt_send_done() calls srpt_abort_cmd() for finished SCSI commands.
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 49 ++++++++++++----------------------- 1 file changed, 16 insertions(+), 33 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +16 -33
@@ -1267,10 +1267,7 @@ static int srpt_abort_cmd(struct srpt_send_ioctx *ioctx)/* * If the command is in a state where the target core is waiting for -* the ib_srpt driver, change the state to the next state. Changing -* the state of the command from SRPT_STATE_NEED_DATA to -* SRPT_STATE_DATA_IN ensures that srpt_xmit_response() will call this -* function a second time. +* the ib_srpt driver, change the state to the next state. */ spin_lock_irqsave (&ioctx->spinlock, flags);
@@ -1279,25 +1276,17 @@ static int srpt_abort_cmd(struct srpt_send_ioctx *ioctx)case SRPT_STATE_NEED_DATA : ioctx->state =SRPT_STATE_DATA_IN ;break ; -case SRPT_STATE_DATA_IN :case SRPT_STATE_CMD_RSP_SENT :case SRPT_STATE_MGMT_RSP_SENT : ioctx->state =SRPT_STATE_DONE ;break ;default : +WARN_ONCE (true,"%s: unexpected I/O context state %d\n" , + __func__, state);break ; }spin_unlock_irqrestore (&ioctx->spinlock, flags); -if (state ==SRPT_STATE_DONE ) { -struct srpt_rdma_ch *ch = ioctx->ch; - -BUG_ON (ch->sess ==NULL ); - -target_put_sess_cmd (&ioctx->cmd); - goto out; - } -pr_debug ("Aborting cmd with state %d and tag %lld\n" , state, ioctx->cmd.tag);
@@ -1305,19 +1294,16 @@ static int srpt_abort_cmd(struct srpt_send_ioctx *ioctx)case SRPT_STATE_NEW :case SRPT_STATE_DATA_IN :case SRPT_STATE_MGMT : +case SRPT_STATE_DONE :/* * Do nothing - defer abort processing until * srpt_queue_response() is invoked. */ -WARN_ON (!transport_check_aborted_status (&ioctx->cmd, false));break ;case SRPT_STATE_NEED_DATA : -/* DMA_TO_DEVICE (write) - RDMA read error. */ - -/* XXX(hch): this is a horrible layering violation.. */ -spin_lock_irqsave (&ioctx->cmd.t_state_lock, flags); - ioctx->cmd.transport_state &= ~CMD_T_ACTIVE ; -spin_unlock_irqrestore (&ioctx->cmd.t_state_lock, flags); +pr_debug ("tag %#llx: RDMA read error\n" , ioctx->cmd.tag); +transport_generic_request_failure (&ioctx->cmd, +TCM_CHECK_CONDITION_ABORT_CMD );break ;case SRPT_STATE_CMD_RSP_SENT :/*
@@ -1325,18 +1311,16 @@ static int srpt_abort_cmd(struct srpt_send_ioctx *ioctx)* not been received in time. */ srpt_unmap_sg_to_ib_sge (ioctx->ch, ioctx); -target_put_sess_cmd (&ioctx->cmd); +transport_generic_free_cmd (&ioctx->cmd,0 );break ;case SRPT_STATE_MGMT_RSP_SENT : -srpt_set_cmd_state (ioctx,SRPT_STATE_DONE ); -target_put_sess_cmd (&ioctx->cmd); +transport_generic_free_cmd (&ioctx->cmd,0 );break ;default :WARN (1 ,"Unexpected command state (%d)" , state);break ; } -out:return state; }
@@ -1376,9 +1360,14 @@ static void srpt_rdma_write_done(struct ib_cq *cq, struct ib_wc *wc) container_of(wc->wr_cqe, struct srpt_send_ioctx, rdma_cqe);if (unlikely (wc->status !=IB_WC_SUCCESS )) { +/* +* Note: if an RDMA write error completion is received that +* means that a SEND also has been posted. Defer further +* processing of the associated command until the send error +* completion has been received. +*/ pr_info ("RDMA_WRITE for ioctx 0x%p failed with status %d\n" , ioctx, wc->status); -srpt_abort_cmd (ioctx); } }
@@ -1721,15 +1710,10 @@ static void srpt_send_done(struct ib_cq *cq, struct ib_wc *wc)atomic_inc (&ch->sq_wr_avail); -if (wc->status !=IB_WC_SUCCESS ) { +if (wc->status !=IB_WC_SUCCESS )pr_info ("sending response for ioctx 0x%p failed" " with status %d\n" , ioctx, wc->status); -atomic_dec (&ch->req_lim); -srpt_abort_cmd (ioctx); - goto out; - } -if (state !=SRPT_STATE_DONE ) {srpt_unmap_sg_to_ib_sge (ch, ioctx);transport_generic_free_cmd (&ioctx->cmd,0 );
@@ -1738,7 +1722,6 @@ static void srpt_send_done(struct ib_cq *cq, struct ib_wc *wc) " wr_id = %u.\n", ioctx->ioctx.index); } -out:while (!list_empty (&ch->cmd_wait_list) && ch->state ==CH_LIVE && (ioctx =srpt_get_send_ioctx (ch)) !=NULL ) {
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): [email protected]
Christoph Hellwig
Reviewed-byRe: [PATCH v2 13/22] IB/srpt: Fix how aborted commands are processed
This looks good in general:
but I wonder if it srpt_abort_cmd wouldn't be easier to understand if there was just a sіngle switch on the ioctx state instead of two?
The only downside is that we might need helper variable to exectue the target core functions outside the spinlock
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH v2 13/22] IB/srpt: Fix how aborted commands are processed
In reply to a message not in the archiveTG9va3MgZ29vZC4NCg0KUmV2aWV3ZWQtYnk6IEFsZXggRXN0cmluIDxhbGV4LmVzdHJpbkBpbnRl bC5jb20+DQoNCj4gc3JwdF9hYm9ydF9jbWQoKSBtdXN0IG5vdCBiZSBjYWxsZWQgaW4gc3RhdGUg U1JQVF9TVEFURV9EQVRBX0lOLiBJc3N1ZQ0KPiBhIHdhcm5pbmcgaWYgdGhpcyBvY2N1cnMuDQo+ IA0KPiBzcnB0X2Fib3J0X2NtZCgpIG11c3Qgbm90IGludm9rZSB0YXJnZXRfcHV0X3Nlc3NfY21k KCkgZm9yIGNvbW1hbmRzDQo+IGluIHN0YXRlIFNSUFRfU1RBVEVfRE9ORSBiZWNhdXNlIHRoZSBz cnB0X2Fib3J0X2NtZCgpIGNhbGxlcnMgYWxyZWFkeQ0KPiBkbyB0aGlzIHdoZW4gbmVjZXNzYXJ5 LiBIZW5jZSByZW1vdmUgdGhpcyBjYWxsLg0KPiANCj4gSWYgYW4gUkRNQSByZWFkIGZhaWxzIHRo ZSBjb3JyZXNwb25kaW5nIFNDU0kgY29tbWFuZCBtdXN0IGZhaWwuIEhlbmNlDQo+IGFkZCBhIHRy YW5zcG9ydF9nZW5lcmljX3JlcXVlc3RfZmFpbHVyZSgpIGNhbGwuDQo+IA0KPiBSZW1vdmUgYW4g aW5jb3JyZWN0IHNycHRfYWJvcnRfY21kKCkgY2FsbCBmcm9tIHNycHRfcmRtYV93cml0ZV9kb25l KCkuDQo+IA0KPiBBdm9pZCB0aGF0IHNycHRfc2VuZF9kb25lKCkgY2FsbHMgc3JwdF9hYm9ydF9j bWQoKSBmb3IgZmluaXNoZWQgU0NTSQ0KPiBjb21tYW5kcy4NCj4gDQo+IFNpZ25lZC1vZmYtYnk6 IEJhcnQgVmFuIEFzc2NoZSA8YmFydC52YW5hc3NjaGVAc2FuZGlzay5jb20+DQo+IENjOiBDaHJp c3RvcGggSGVsbHdpZyA8aGNoQGxzdC5kZT4NCj4gQ2M6IFNhZ2kgR3JpbWJlcmcgPHNhZ2lnQG1l bGxhbm94LmNvbT4NCj4gLS0tDQo+ICBkcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycHQvaWJfc3Jw dC5jIHwgNDkgKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCj4gIDEgZmlsZSBj aGFuZ2VkLCAxNiBpbnNlcnRpb25zKCspLCAzMyBkZWxldGlvbnMoLSkNCj4gDQo+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycHQvaWJfc3JwdC5jDQo+IGIvZHJpdmVycy9p bmZpbmliYW5kL3VscC9zcnB0L2liX3NycHQuYw0KPiBpbmRleCA4YWI0MzFmLi42NTJlMWVmIDEw MDY0NA0KPiAtLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycHQvaWJfc3JwdC5jDQo+ICsr KyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwdC9pYl9zcnB0LmMNCj4gQEAgLTEyNjcsMTAg KzEyNjcsNyBAQCBzdGF0aWMgaW50IHNycHRfYWJvcnRfY21kKHN0cnVjdCBzcnB0X3NlbmRfaW9j dHggKmlvY3R4KQ0KPiANCj4gIAkvKg0KPiAgCSAqIElmIHRoZSBjb21tYW5kIGlzIGluIGEgc3Rh dGUgd2hlcmUgdGhlIHRhcmdldCBjb3JlIGlzIHdhaXRpbmcgZm9yDQo+IC0JICogdGhlIGliX3Ny cHQgZHJpdmVyLCBjaGFuZ2UgdGhlIHN0YXRlIHRvIHRoZSBuZXh0IHN0YXRlLiBDaGFuZ2luZw0K PiAtCSAqIHRoZSBzdGF0ZSBvZiB0aGUgY29tbWFuZCBmcm9tIFNSUFRfU1RBVEVfTkVFRF9EQVRB IHRvDQo+IC0JICogU1JQVF9TVEFURV9EQVRBX0lOIGVuc3VyZXMgdGhhdCBzcnB0X3htaXRfcmVz cG9uc2UoKSB3aWxsIGNhbGwgdGhpcw0KPiAtCSAqIGZ1bmN0aW9uIGEgc2Vjb25kIHRpbWUuDQo+ ICsJICogdGhlIGliX3NycHQgZHJpdmVyLCBjaGFuZ2UgdGhlIHN0YXRlIHRvIHRoZSBuZXh0IHN0 YXRlLg0KPiAgCSAqLw0KPiANCj4gIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jdHgtPnNwaW5sb2Nr LCBmbGFncyk7DQo+IEBAIC0xMjc5LDI1ICsxMjc2LDE3IEBAIHN0YXRpYyBpbnQgc3JwdF9hYm9y dF9jbWQoc3RydWN0IHNycHRfc2VuZF9pb2N0eCAqaW9jdHgpDQo+ICAJY2FzZSBTUlBUX1NUQVRF X05FRURfREFUQToNCj4gIAkJaW9jdHgtPnN0YXRlID0gU1JQVF9TVEFURV9EQVRBX0lOOw0KPiAg CQlicmVhazsNCj4gLQljYXNlIFNSUFRfU1RBVEVfREFUQV9JTjoNCj4gIAljYXNlIFNSUFRfU1RB VEVfQ01EX1JTUF9TRU5UOg0KPiAgCWNhc2UgU1JQVF9TVEFURV9NR01UX1JTUF9TRU5UOg0KPiAg CQlpb2N0eC0+c3RhdGUgPSBTUlBUX1NUQVRFX0RPTkU7DQo+ICAJCWJyZWFrOw0KPiAgCWRlZmF1 bHQ6DQo+ICsJCVdBUk5fT05DRSh0cnVlLCAiJXM6IHVuZXhwZWN0ZWQgSS9PIGNvbnRleHQgc3Rh dGUgJWRcbiIsDQo+ICsJCQkgIF9fZnVuY19fLCBzdGF0ZSk7DQo+ICAJCWJyZWFrOw0KPiAgCX0N Cj4gIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2N0eC0+c3BpbmxvY2ssIGZsYWdzKTsNCj4g DQo+IC0JaWYgKHN0YXRlID09IFNSUFRfU1RBVEVfRE9ORSkgew0KPiAtCQlzdHJ1Y3Qgc3JwdF9y ZG1hX2NoICpjaCA9IGlvY3R4LT5jaDsNCj4gLQ0KPiAtCQlCVUdfT04oY2gtPnNlc3MgPT0gTlVM TCk7DQo+IC0NCj4gLQkJdGFyZ2V0X3B1dF9zZXNzX2NtZCgmaW9jdHgtPmNtZCk7DQo+IC0JCWdv dG8gb3V0Ow0KPiAtCX0NCj4gLQ0KPiAgCXByX2RlYnVnKCJBYm9ydGluZyBjbWQgd2l0aCBzdGF0 ZSAlZCBhbmQgdGFnICVsbGRcbiIsIHN0YXRlLA0KPiAgCQkgaW9jdHgtPmNtZC50YWcpOw0KPiAN Cj4gQEAgLTEzMDUsMTkgKzEyOTQsMTYgQEAgc3RhdGljIGludCBzcnB0X2Fib3J0X2NtZChzdHJ1 Y3Qgc3JwdF9zZW5kX2lvY3R4ICppb2N0eCkNCj4gIAljYXNlIFNSUFRfU1RBVEVfTkVXOg0KPiAg CWNhc2UgU1JQVF9TVEFURV9EQVRBX0lOOg0KPiAgCWNhc2UgU1JQVF9TVEFURV9NR01UOg0KPiAr CWNhc2UgU1JQVF9TVEFURV9ET05FOg0KPiAgCQkvKg0KPiAgCQkgKiBEbyBub3RoaW5nIC0gZGVm ZXIgYWJvcnQgcHJvY2Vzc2luZyB1bnRpbA0KPiAgCQkgKiBzcnB0X3F1ZXVlX3Jlc3BvbnNlKCkg aXMgaW52b2tlZC4NCj4gIAkJICovDQo+IC0JCVdBUk5fT04oIXRyYW5zcG9ydF9jaGVja19hYm9y dGVkX3N0YXR1cygmaW9jdHgtPmNtZCwgZmFsc2UpKTsNCj4gIAkJYnJlYWs7DQo+ICAJY2FzZSBT UlBUX1NUQVRFX05FRURfREFUQToNCj4gLQkJLyogRE1BX1RPX0RFVklDRSAod3JpdGUpIC0gUkRN QSByZWFkIGVycm9yLiAqLw0KPiAtDQo+IC0JCS8qIFhYWChoY2gpOiB0aGlzIGlzIGEgaG9ycmli bGUgbGF5ZXJpbmcgdmlvbGF0aW9uLi4gKi8NCj4gLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvY3R4 LT5jbWQudF9zdGF0ZV9sb2NrLCBmbGFncyk7DQo+IC0JCWlvY3R4LT5jbWQudHJhbnNwb3J0X3N0 YXRlICY9IH5DTURfVF9BQ1RJVkU7DQo+IC0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvY3R4 LT5jbWQudF9zdGF0ZV9sb2NrLCBmbGFncyk7DQo+ICsJCXByX2RlYnVnKCJ0YWcgJSNsbHg6IFJE TUEgcmVhZCBlcnJvclxuIiwgaW9jdHgtPmNtZC50YWcpOw0KPiArCQl0cmFuc3BvcnRfZ2VuZXJp Y19yZXF1ZXN0X2ZhaWx1cmUoJmlvY3R4LT5jbWQsDQo+ICsJCQkJCVRDTV9DSEVDS19DT05ESVRJ T05fQUJPUlRfQ01EKTsNCj4gIAkJYnJlYWs7DQo+ICAJY2FzZSBTUlBUX1NUQVRFX0NNRF9SU1Bf U0VOVDoNCj4gIAkJLyoNCj4gQEAgLTEzMjUsMTggKzEzMTEsMTYgQEAgc3RhdGljIGludCBzcnB0 X2Fib3J0X2NtZChzdHJ1Y3Qgc3JwdF9zZW5kX2lvY3R4ICppb2N0eCkNCj4gIAkJICogbm90IGJl ZW4gcmVjZWl2ZWQgaW4gdGltZS4NCj4gIAkJICovDQo+ICAJCXNycHRfdW5tYXBfc2dfdG9faWJf c2dlKGlvY3R4LT5jaCwgaW9jdHgpOw0KPiAtCQl0YXJnZXRfcHV0X3Nlc3NfY21kKCZpb2N0eC0+ Y21kKTsNCj4gKwkJdHJhbnNwb3J0X2dlbmVyaWNfZnJlZV9jbWQoJmlvY3R4LT5jbWQsIDApOw0K PiAgCQlicmVhazsNCj4gIAljYXNlIFNSUFRfU1RBVEVfTUdNVF9SU1BfU0VOVDoNCj4gLQkJc3Jw dF9zZXRfY21kX3N0YXRlKGlvY3R4LCBTUlBUX1NUQVRFX0RPTkUpOw0KPiAtCQl0YXJnZXRfcHV0 X3Nlc3NfY21kKCZpb2N0eC0+Y21kKTsNCj4gKwkJdHJhbnNwb3J0X2dlbmVyaWNfZnJlZV9jbWQo JmlvY3R4LT5jbWQsIDApOw0KPiAgCQlicmVhazsNCj4gIAlkZWZhdWx0Og0KPiAgCQlXQVJOKDEs ICJVbmV4cGVjdGVkIGNvbW1hbmQgc3RhdGUgKCVkKSIsIHN0YXRlKTsNCj4gIAkJYnJlYWs7DQo+ ICAJfQ0KPiANCj4gLW91dDoNCj4gIAlyZXR1cm4gc3RhdGU7DQo+ICB9DQo+IA0KPiBAQCAtMTM3 Niw5ICsxMzYwLDE0IEBAIHN0YXRpYyB2b2lkIHNycHRfcmRtYV93cml0ZV9kb25lKHN0cnVjdCBp Yl9jcSAqY3EsIHN0cnVjdA0KPiBpYl93YyAqd2MpDQo+ICAJCWNvbnRhaW5lcl9vZih3Yy0+d3Jf Y3FlLCBzdHJ1Y3Qgc3JwdF9zZW5kX2lvY3R4LCByZG1hX2NxZSk7DQo+IA0KPiAgCWlmICh1bmxp a2VseSh3Yy0+c3RhdHVzICE9IElCX1dDX1NVQ0NFU1MpKSB7DQo+ICsJCS8qDQo+ICsJCSAqIE5v dGU6IGlmIGFuIFJETUEgd3JpdGUgZXJyb3IgY29tcGxldGlvbiBpcyByZWNlaXZlZCB0aGF0DQo+ ICsJCSAqIG1lYW5zIHRoYXQgYSBTRU5EIGFsc28gaGFzIGJlZW4gcG9zdGVkLiBEZWZlciBmdXJ0 aGVyDQo+ICsJCSAqIHByb2Nlc3Npbmcgb2YgdGhlIGFzc29jaWF0ZWQgY29tbWFuZCB1bnRpbCB0 aGUgc2VuZCBlcnJvcg0KPiArCQkgKiBjb21wbGV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkLg0KPiAr CQkgKi8NCj4gIAkJcHJfaW5mbygiUkRNQV9XUklURSBmb3IgaW9jdHggMHglcCBmYWlsZWQgd2l0 aCBzdGF0dXMgJWRcbiIsDQo+ICAJCQlpb2N0eCwgd2MtPnN0YXR1cyk7DQo+IC0JCXNycHRfYWJv cnRfY21kKGlvY3R4KTsNCj4gIAl9DQo+ICB9DQo+IA0KPiBAQCAtMTcyMSwxNSArMTcxMCwxMCBA QCBzdGF0aWMgdm9pZCBzcnB0X3NlbmRfZG9uZShzdHJ1Y3QgaWJfY3EgKmNxLCBzdHJ1Y3QgaWJf d2MNCj4gKndjKQ0KPiANCj4gIAlhdG9taWNfaW5jKCZjaC0+c3Ffd3JfYXZhaWwpOw0KPiANCj4g LQlpZiAod2MtPnN0YXR1cyAhPSBJQl9XQ19TVUNDRVNTKSB7DQo+ICsJaWYgKHdjLT5zdGF0dXMg IT0gSUJfV0NfU1VDQ0VTUykNCj4gIAkJcHJfaW5mbygic2VuZGluZyByZXNwb25zZSBmb3IgaW9j dHggMHglcCBmYWlsZWQiDQo+ICAJCQkiIHdpdGggc3RhdHVzICVkXG4iLCBpb2N0eCwgd2MtPnN0 YXR1cyk7DQo+IA0KPiAtCQlhdG9taWNfZGVjKCZjaC0+cmVxX2xpbSk7DQo+IC0JCXNycHRfYWJv cnRfY21kKGlvY3R4KTsNCj4gLQkJZ290byBvdXQ7DQo+IC0JfQ0KPiAtDQo+ICAJaWYgKHN0YXRl ICE9IFNSUFRfU1RBVEVfRE9ORSkgew0KPiAgCQlzcnB0X3VubWFwX3NnX3RvX2liX3NnZShjaCwg aW9jdHgpOw0KPiAgCQl0cmFuc3BvcnRfZ2VuZXJpY19mcmVlX2NtZCgmaW9jdHgtPmNtZCwgMCk7 DQo+IEBAIC0xNzM4LDcgKzE3MjIsNiBAQCBzdGF0aWMgdm9pZCBzcnB0X3NlbmRfZG9uZShzdHJ1 Y3QgaWJfY3EgKmNxLCBzdHJ1Y3QgaWJfd2MNCj4gKndjKQ0KPiAgCQkgICAgICAgIiB3cl9pZCA9 ICV1LlxuIiwgaW9jdHgtPmlvY3R4LmluZGV4KTsNCj4gIAl9DQo+IA0KPiAtb3V0Og0KPiAgCXdo aWxlICghbGlzdF9lbXB0eSgmY2gtPmNtZF93YWl0X2xpc3QpICYmDQo+ICAJICAgICAgIGNoLT5z dGF0ZSA9PSBDSF9MSVZFICYmDQo+ICAJICAgICAgIChpb2N0eCA9IHNycHRfZ2V0X3NlbmRfaW9j dHgoY2gpKSAhPSBOVUxMKSB7DQo+IC0tDQo+IDIuNy4wDQoNCg==
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 14/22 IB/srpt: Inline trivial CM callback functions
In reply to a message not in the archiveInline those CM callback functions that are only two lines long.
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 31 +++++++------------------------ 1 file changed, 7 insertions(+), 24 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +7 -24
@@ -2315,18 +2315,6 @@ static void srpt_cm_rtu_recv(struct ib_cm_id *cm_id) } } -static void srpt_cm_timewait_exit (struct ib_cm_id *cm_id) -{ -pr_info ("Received IB TimeWait exit for cm_id %p.\n" , cm_id); -srpt_drain_channel (cm_id); -} - -static void srpt_cm_rep_error (struct ib_cm_id *cm_id) -{ -pr_info ("Received IB REP error for cm_id %p.\n" , cm_id); -srpt_drain_channel (cm_id); -} -/** * srpt_cm_dreq_recv() - Process reception of a DREQ message. */
@@ -2365,15 +2353,6 @@ static void srpt_cm_dreq_recv(struct ib_cm_id *cm_id) }/** -* srpt_cm_drep_recv() - Process reception of a DREP message. -*/ -static void srpt_cm_drep_recv (struct ib_cm_id *cm_id) -{ -pr_info ("Received InfiniBand DREP message for cm_id %p.\n" , cm_id); -srpt_drain_channel (cm_id); -} - -/** * srpt_cm_handler() - IB connection manager callback function. * * A non-zero return value will cause the caller destroy the CM ID.
@@ -2404,13 +2383,17 @@ static int srpt_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event)srpt_cm_dreq_recv (cm_id);break ;case IB_CM_DREP_RECEIVED : -srpt_cm_drep_recv (cm_id); +pr_info ("Received InfiniBand DREP message for cm_id %p.\n" , + cm_id); +srpt_drain_channel (cm_id);break ;case IB_CM_TIMEWAIT_EXIT : -srpt_cm_timewait_exit (cm_id); +pr_info ("Received IB TimeWait exit for cm_id %p.\n" , cm_id); +srpt_drain_channel (cm_id);break ;case IB_CM_REP_ERROR : -srpt_cm_rep_error (cm_id); +pr_info ("Received IB REP error for cm_id %p.\n" , cm_id); +srpt_drain_channel (cm_id);break ;case IB_CM_DREQ_ERROR :pr_info ("Received IB DREQ ERROR event.\n" );
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): [email protected]
Christoph Hellwig
Reviewed-byRe: [PATCH v2 14/22] IB/srpt: Inline trivial CM callback functions
Looks fine,
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH v2 14/22] IB/srpt: Inline trivial CM callback functions
In reply to a message not in the archiveTG9va3MgZ29vZC4NClJldmlld2VkLWJ5OiBBbGV4IEVzdHJpbiA8YWxleC5lc3RyaW5AaW50ZWwu Y29tPg0KDQo+IElubGluZSB0aG9zZSBDTSBjYWxsYmFjayBmdW5jdGlvbnMgdGhhdCBhcmUgb25s eSB0d28gbGluZXMgbG9uZy4NCj4gDQo+IFNpZ25lZC1vZmYtYnk6IEJhcnQgVmFuIEFzc2NoZSA8 YmFydC52YW5hc3NjaGVAc2FuZGlzay5jb20+DQo+IENjOiBDaHJpc3RvcGggSGVsbHdpZyA8aGNo QGxzdC5kZT4NCj4gQ2M6IFNhZ2kgR3JpbWJlcmcgPHNhZ2lnQG1lbGxhbm94LmNvbT4NCj4gLS0t DQo+ICBkcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycHQvaWJfc3JwdC5jIHwgMzEgKysrKysrKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KPiAgMSBmaWxlIGNoYW5nZWQsIDcgaW5zZXJ0aW9ucygr KSwgMjQgZGVsZXRpb25zKC0pDQo+IA0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5k L3VscC9zcnB0L2liX3NycHQuYw0KPiBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwdC9pYl9z cnB0LmMNCj4gaW5kZXggNjUyZTFlZi4uNWU0ZmVlNyAxMDA2NDQNCj4gLS0tIGEvZHJpdmVycy9p bmZpbmliYW5kL3VscC9zcnB0L2liX3NycHQuYw0KPiArKysgYi9kcml2ZXJzL2luZmluaWJhbmQv dWxwL3NycHQvaWJfc3JwdC5jDQo+IEBAIC0yMzE1LDE4ICsyMzE1LDYgQEAgc3RhdGljIHZvaWQg c3JwdF9jbV9ydHVfcmVjdihzdHJ1Y3QgaWJfY21faWQgKmNtX2lkKQ0KPiAgCX0NCj4gIH0NCj4g DQo+IC1zdGF0aWMgdm9pZCBzcnB0X2NtX3RpbWV3YWl0X2V4aXQoc3RydWN0IGliX2NtX2lkICpj bV9pZCkNCj4gLXsNCj4gLQlwcl9pbmZvKCJSZWNlaXZlZCBJQiBUaW1lV2FpdCBleGl0IGZvciBj bV9pZCAlcC5cbiIsIGNtX2lkKTsNCj4gLQlzcnB0X2RyYWluX2NoYW5uZWwoY21faWQpOw0KPiAt fQ0KPiAtDQo+IC1zdGF0aWMgdm9pZCBzcnB0X2NtX3JlcF9lcnJvcihzdHJ1Y3QgaWJfY21faWQg KmNtX2lkKQ0KPiAtew0KPiAtCXByX2luZm8oIlJlY2VpdmVkIElCIFJFUCBlcnJvciBmb3IgY21f aWQgJXAuXG4iLCBjbV9pZCk7DQo+IC0Jc3JwdF9kcmFpbl9jaGFubmVsKGNtX2lkKTsNCj4gLX0N Cj4gLQ0KPiAgLyoqDQo+ICAgKiBzcnB0X2NtX2RyZXFfcmVjdigpIC0gUHJvY2VzcyByZWNlcHRp b24gb2YgYSBEUkVRIG1lc3NhZ2UuDQo+ICAgKi8NCj4gQEAgLTIzNjUsMTUgKzIzNTMsNiBAQCBz dGF0aWMgdm9pZCBzcnB0X2NtX2RyZXFfcmVjdihzdHJ1Y3QgaWJfY21faWQgKmNtX2lkKQ0KPiAg fQ0KPiANCj4gIC8qKg0KPiAtICogc3JwdF9jbV9kcmVwX3JlY3YoKSAtIFByb2Nlc3MgcmVjZXB0 aW9uIG9mIGEgRFJFUCBtZXNzYWdlLg0KPiAtICovDQo+IC1zdGF0aWMgdm9pZCBzcnB0X2NtX2Ry ZXBfcmVjdihzdHJ1Y3QgaWJfY21faWQgKmNtX2lkKQ0KPiAtew0KPiAtCXByX2luZm8oIlJlY2Vp dmVkIEluZmluaUJhbmQgRFJFUCBtZXNzYWdlIGZvciBjbV9pZCAlcC5cbiIsIGNtX2lkKTsNCj4g LQlzcnB0X2RyYWluX2NoYW5uZWwoY21faWQpOw0KPiAtfQ0KPiAtDQo+IC0vKioNCj4gICAqIHNy cHRfY21faGFuZGxlcigpIC0gSUIgY29ubmVjdGlvbiBtYW5hZ2VyIGNhbGxiYWNrIGZ1bmN0aW9u Lg0KPiAgICoNCj4gICAqIEEgbm9uLXplcm8gcmV0dXJuIHZhbHVlIHdpbGwgY2F1c2UgdGhlIGNh bGxlciBkZXN0cm95IHRoZSBDTSBJRC4NCj4gQEAgLTI0MDQsMTMgKzIzODMsMTcgQEAgc3RhdGlj IGludCBzcnB0X2NtX2hhbmRsZXIoc3RydWN0IGliX2NtX2lkICpjbV9pZCwgc3RydWN0DQo+IGli X2NtX2V2ZW50ICpldmVudCkNCj4gIAkJc3JwdF9jbV9kcmVxX3JlY3YoY21faWQpOw0KPiAgCQli cmVhazsNCj4gIAljYXNlIElCX0NNX0RSRVBfUkVDRUlWRUQ6DQo+IC0JCXNycHRfY21fZHJlcF9y ZWN2KGNtX2lkKTsNCj4gKwkJcHJfaW5mbygiUmVjZWl2ZWQgSW5maW5pQmFuZCBEUkVQIG1lc3Nh Z2UgZm9yIGNtX2lkICVwLlxuIiwNCj4gKwkJCWNtX2lkKTsNCj4gKwkJc3JwdF9kcmFpbl9jaGFu bmVsKGNtX2lkKTsNCj4gIAkJYnJlYWs7DQo+ICAJY2FzZSBJQl9DTV9USU1FV0FJVF9FWElUOg0K PiAtCQlzcnB0X2NtX3RpbWV3YWl0X2V4aXQoY21faWQpOw0KPiArCQlwcl9pbmZvKCJSZWNlaXZl ZCBJQiBUaW1lV2FpdCBleGl0IGZvciBjbV9pZCAlcC5cbiIsIGNtX2lkKTsNCj4gKwkJc3JwdF9k cmFpbl9jaGFubmVsKGNtX2lkKTsNCj4gIAkJYnJlYWs7DQo+ICAJY2FzZSBJQl9DTV9SRVBfRVJS T1I6DQo+IC0JCXNycHRfY21fcmVwX2Vycm9yKGNtX2lkKTsNCj4gKwkJcHJfaW5mbygiUmVjZWl2 ZWQgSUIgUkVQIGVycm9yIGZvciBjbV9pZCAlcC5cbiIsIGNtX2lkKTsNCj4gKwkJc3JwdF9kcmFp bl9jaGFubmVsKGNtX2lkKTsNCj4gIAkJYnJlYWs7DQo+ICAJY2FzZSBJQl9DTV9EUkVRX0VSUk9S Og0KPiAgCQlwcl9pbmZvKCJSZWNlaXZlZCBJQiBEUkVRIEVSUk9SIGV2ZW50LlxuIik7DQo+IC0t DQo+IDIuNy4wDQoNCg==
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 15/22 IB/srpt: Eliminate srpt_find_channel()
In reply to a message not in the archiveIn the CM REQ message handler, store the channel pointer in cm_id->context such that the function srpt_find_channel() is no longer needed. Additionally, make the CM event messages more informative.
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 94 +++++++++++------------------------ 1 file changed, 29 insertions(+), 65 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +29 -65
@@ -1890,25 +1890,14 @@ static int srpt_shutdown_session(struct se_session *se_sess)* ib_destroy_cm_id(), which locks the cm_id spinlock and hence waits until * this function has finished). */ -static void srpt_drain_channel (struct ib_cm_id *cm_id) +static void srpt_drain_channel (struct srpt_rdma_ch *ch) { -struct srpt_device *sdev; -struct srpt_rdma_ch *ch;int ret;bool do_reset = false;WARN_ON_ONCE (irqs_disabled ()); - sdev = cm_id->context; -BUG_ON (!sdev); -spin_lock_irq (&sdev->spinlock); -list_for_each_entry (ch, &sdev->rch_list, list) { -if (ch->cm_id == cm_id) { - do_reset =srpt_set_ch_state (ch,CH_DRAINING ); -break ; - } - } -spin_unlock_irq (&sdev->spinlock); + do_reset =srpt_set_ch_state (ch,CH_DRAINING );if (do_reset) {if (ch->sess)
@@ -1922,34 +1911,6 @@ static void srpt_drain_channel(struct ib_cm_id *cm_id) }/** -* srpt_find_channel() - Look up an RDMA channel. -* @cm_id: Pointer to the CM ID of the channel to be looked up. -* -* Return NULL if no matching RDMA channel has been found. -*/ -static struct srpt_rdma_ch *srpt_find_channel (struct srpt_device *sdev, -struct ib_cm_id *cm_id) -{ -struct srpt_rdma_ch *ch; -bool found; - -WARN_ON_ONCE (irqs_disabled ()); -BUG_ON (!sdev); - - found = false; -spin_lock_irq (&sdev->spinlock); -list_for_each_entry (ch, &sdev->rch_list, list) { -if (ch->cm_id == cm_id) { - found = true; -break ; - } - } -spin_unlock_irq (&sdev->spinlock); - -return found ? ch :NULL ; -} - -/** * srpt_release_channel() - Release channel resources. * * Schedules the actual release because:
@@ -2131,6 +2092,7 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,memcpy (ch->t_port_id, req->target_port_id,16 ); ch->sport = &sdev->port[param->port -1 ]; ch->cm_id = cm_id; + cm_id->context = ch;/* * Avoid QUEUE_FULL conditions by limiting the number of buffers used * for the SRP protocol to the command queue size.
@@ -2280,10 +2242,14 @@ out:return ret; } -static void srpt_cm_rej_recv (struct ib_cm_id *cm_id) +static void srpt_cm_rej_recv (struct srpt_rdma_ch *ch, +enum ib_cm_rej_reason reason, +const u8 *private_data, +u8 private_data_len) { -pr_info ("Received IB REJ for cm_id %p.\n" , cm_id); -srpt_drain_channel (cm_id); +pr_info ("Received CM REJ for ch %s-%d; reason %d.\n" , + ch->sess_name, ch->qp->qp_num, reason); +srpt_drain_channel (ch); }/**
@@ -2292,14 +2258,10 @@ static void srpt_cm_rej_recv(struct ib_cm_id *cm_id)* An IB_CM_RTU_RECEIVED message indicates that the connection is established * and that the recipient may begin transmitting (RTU = ready to use). */ -static void srpt_cm_rtu_recv (struct ib_cm_id *cm_id) +static void srpt_cm_rtu_recv (struct srpt_rdma_ch *ch) { -struct srpt_rdma_ch *ch;int ret; - ch =srpt_find_channel (cm_id->context, cm_id); -BUG_ON (!ch); -if (srpt_set_ch_state (ch,CH_LIVE )) {struct srpt_recv_ioctx *ioctx, *ioctx_tmp;
@@ -2318,16 +2280,13 @@ static void srpt_cm_rtu_recv(struct ib_cm_id *cm_id)/** * srpt_cm_dreq_recv() - Process reception of a DREQ message. */ -static void srpt_cm_dreq_recv (struct ib_cm_id *cm_id) +static void srpt_cm_dreq_recv (struct srpt_rdma_ch *ch) { -struct srpt_rdma_ch *ch;unsigned long flags;bool send_drep = false; - ch =srpt_find_channel (cm_id->context, cm_id); -BUG_ON (!ch); - -pr_debug ("cm_id= %p ch->state= %d\n" , cm_id, ch->state); +pr_debug ("ch %s-%d state %d\n" , ch->sess_name, ch->qp->qp_num, + ch->state);spin_lock_irqsave (&ch->spinlock, flags);switch (ch->state) {
@@ -2364,6 +2323,7 @@ static void srpt_cm_dreq_recv(struct ib_cm_id *cm_id)*/ static int srpt_cm_handler (struct ib_cm_id *cm_id,struct ib_cm_event *event) { +struct srpt_rdma_ch *ch = cm_id->context;int ret; ret =0 ;
@@ -2373,27 +2333,31 @@ static int srpt_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event) event->private_data);break ;case IB_CM_REJ_RECEIVED : -srpt_cm_rej_recv (cm_id); +srpt_cm_rej_recv (ch, event->param.rej_rcvd.reason, + event->private_data, +IB_CM_REJ_PRIVATE_DATA_SIZE );break ;case IB_CM_RTU_RECEIVED :case IB_CM_USER_ESTABLISHED : -srpt_cm_rtu_recv (cm_id); +srpt_cm_rtu_recv (ch);break ;case IB_CM_DREQ_RECEIVED : -srpt_cm_dreq_recv (cm_id); +srpt_cm_dreq_recv (ch);break ;case IB_CM_DREP_RECEIVED : -pr_info ("Received InfiniBand DREP message for cm_id %p.\n" , - cm_id); -srpt_drain_channel (cm_id); +pr_info ("Received InfiniBand DREP message for ch %s-%d.\n" , + ch->sess_name, ch->qp->qp_num); +srpt_drain_channel (ch);break ;case IB_CM_TIMEWAIT_EXIT : -pr_info ("Received IB TimeWait exit for cm_id %p.\n" , cm_id); -srpt_drain_channel (cm_id); +pr_info ("Received CM TimeWait exit for ch %s-%d.\n" , + ch->sess_name, ch->qp->qp_num); +srpt_drain_channel (ch);break ;case IB_CM_REP_ERROR : -pr_info ("Received IB REP error for cm_id %p.\n" , cm_id); -srpt_drain_channel (cm_id); +pr_info ("Received CM REP error for ch %s-%d.\n" , ch->sess_name, + ch->qp->qp_num); +srpt_drain_channel (ch);break ;case IB_CM_DREQ_ERROR :pr_info ("Received IB DREQ ERROR event.\n" );
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): [email protected]
Christoph Hellwig
Reviewed-byRe: [PATCH v2 15/22] IB/srpt: Eliminate srpt_find_channel()
Looks good,
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 16/22 IB/srpt: Log private data associated with REJ
In reply to a message not in the archiveTo make it possible to determine why an initiator sent a REJ, log the private data associated with the received REJ packet.
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +11 -2
@@ -2247,8 +2247,17 @@ static void srpt_cm_rej_recv(struct srpt_rdma_ch *ch,const u8 *private_data, u8 private_data_len) { - pr_info("Received CM REJ for ch %s-%d; reason %d.\n", - ch->sess_name, ch->qp->qp_num, reason); + char *priv = kmalloc(private_data_len * 3 + 1, GFP_KERNEL); +int i; + +if (priv) { + priv[0 ] ='\0' ; +for (i =0 ; i < private_data_len; i++) +sprintf (priv +3 * i,"%02x " , private_data[i]); + } +pr_info ("Received CM REJ for ch %s-%d; reason %d; private data %s.\n" , + ch->sess_name, ch->qp->qp_num, reason, priv ? :"(?)" ); +kfree (priv);srpt_drain_channel (ch); }
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): [email protected]
Christoph Hellwig
Reviewed-byRe: [PATCH v2 16/22] IB/srpt: Log private data associated with REJ
Looks fine,
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 17/22 IB/srpt: Convert rch_list to RCU
In reply to a message not in the archiveIn a later patch a function that can block will be called while iterating over the rch_list. Hence protect that list with a mutex instead of a spinlock. And since it is not allowed to sleep while the task state != TASK_RUNNING, protect the list access in srpt_ch_list_empty() with rcu_read_lock() / rcu_read_unlock().
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 37 ++++++++++++++++++----------------- drivers/infiniband/ulp/srpt/ib_srpt.h | 5 +++-- 2 files changed, 22 insertions(+), 20 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +19 -18
@@ -1862,12 +1862,11 @@ static void __srpt_close_ch(struct srpt_rdma_ch *ch)*/ static void srpt_close_ch (struct srpt_rdma_ch *ch) { -struct srpt_device *sdev; +struct srpt_device *sdev = ch->sport->sdev; - sdev = ch->sport->sdev; -spin_lock_irq (&sdev->spinlock); +mutex_lock (&sdev->mutex);__srpt_close_ch (ch); -spin_unlock_irq (&sdev->spinlock); +mutex_unlock (&sdev->mutex); }/**
@@ -1954,15 +1953,15 @@ static void srpt_release_channel_work(struct work_struct *w) ch->sport->sdev, ch->rq_size, ch->rsp_size, DMA_TO_DEVICE); -spin_lock_irq (&sdev->spinlock); +mutex_lock (&sdev->mutex);list_del_init (&ch->list);if (ch->release_done)complete (ch->release_done); -spin_unlock_irq (&sdev->spinlock); +mutex_unlock (&sdev->mutex);wake_up (&sdev->ch_releaseQ); -kfree (ch); +kfree_rcu (ch, rcu); }/**
@@ -2038,7 +2037,7 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,if ((req->req_flags &SRP_MTCH_ACTION ) ==SRP_MULTICHAN_SINGLE ) { rsp->rsp_flags =SRP_LOGIN_RSP_MULTICHAN_NO_CHAN ; -spin_lock_irq (&sdev->spinlock); +mutex_lock (&sdev->mutex);list_for_each_entry_safe (ch, tmp_ch, &sdev->rch_list, list) { if (!memcmp(ch->i_port_id, req->initiator_port_id, 16)
@@ -2062,7 +2061,7 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, } } -spin_unlock_irq (&sdev->spinlock); +mutex_unlock (&sdev->mutex); }else rsp->rsp_flags =SRP_LOGIN_RSP_MULTICHAN_MAINTAINED ;
@@ -2203,9 +2202,9 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, goto release_channel; } -spin_lock_irq (&sdev->spinlock); +mutex_lock (&sdev->mutex);list_add_tail (&ch->list, &sdev->rch_list); -spin_unlock_irq (&sdev->spinlock); +mutex_unlock (&sdev->mutex); goto out;
@@ -2651,9 +2650,9 @@ static int srpt_ch_list_empty(struct srpt_device *sdev) {int res; -spin_lock_irq (&sdev->spinlock); +rcu_read_lock (); res =list_empty (&sdev->rch_list); -spin_unlock_irq (&sdev->spinlock); +rcu_read_unlock ();return res; }
@@ -2670,10 +2669,10 @@ static int srpt_release_sdev(struct srpt_device *sdev)BUG_ON (!sdev); -spin_lock_irq (&sdev->spinlock); +mutex_lock (&sdev->mutex);list_for_each_entry_safe (ch, tmp_ch, &sdev->rch_list, list)__srpt_close_ch (ch); -spin_unlock_irq (&sdev->spinlock); +mutex_unlock (&sdev->mutex); res =wait_event_interruptible (sdev->ch_releaseQ,srpt_ch_list_empty (sdev));
@@ -2737,7 +2736,7 @@ static void srpt_add_one(struct ib_device *device) sdev->device = device;INIT_LIST_HEAD (&sdev->rch_list);init_waitqueue_head (&sdev->ch_releaseQ); -spin_lock_init (&sdev->spinlock); +mutex_init (&sdev->mutex); sdev->pd =ib_alloc_pd (device);if (IS_ERR (sdev->pd))
@@ -2965,12 +2964,12 @@ static void srpt_close_session(struct se_session *se_sess)pr_debug ("ch %s-%d state %d\n" , ch->sess_name, ch->qp->qp_num, ch->state); -spin_lock_irq (&sdev->spinlock); +mutex_lock (&sdev->mutex);BUG_ON (ch->release_done); ch->release_done = &release_done; wait = !list_empty (&ch->list);__srpt_close_ch (ch); -spin_unlock_irq (&sdev->spinlock); +mutex_unlock (&sdev->mutex);if (!wait)return ;
@@ -3380,6 +3379,8 @@ out: static void __exit srpt_cleanup_module(void) { +rcu_barrier (); +ib_unregister_client (&srpt_client);target_unregister_template (&srpt_template); }
drivers/infiniband/ulp/srpt/ib_srpt.h +3 -2
@@ -267,6 +267,7 @@ struct srpt_rdma_ch {struct ib_cm_id *cm_id;struct ib_qp *qp;struct ib_cq *cq; +struct rcu_head rcu;int rq_size;u32 rsp_size;atomic_t sq_wr_avail;
@@ -342,7 +343,7 @@ struct srpt_port {* @ioctx_ring: Per-HCA SRQ. * @rch_list: Per-device channel list -- see also srpt_rdma_ch.list. * @ch_releaseQ: Enables waiting for removal from rch_list. -* @spinlock: Protects rch_list and tpg. +* @mutex: Protects rch_list. * @port: Information about the ports owned by this HCA. * @event_handler: Per-HCA asynchronous IB event handler. * @list: Node in srpt_dev_list.
@@ -356,7 +357,7 @@ struct srpt_device {struct srpt_recv_ioctx **ioctx_ring;struct list_head rch_list;wait_queue_head_t ch_releaseQ; -spinlock_t spinlock; +struct mutex mutex;struct srpt_port port[2 ];struct ib_event_handler event_handler;struct list_head list;
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): [email protected]
Re: [PATCH v2 17/22] IB/srpt: Convert rch_list to RCU
drivers/infiniband/ulp/srpt/ib_srpt.c static int srpt_ch_list_empty(struct srpt_device *sdev) · line 2655
Quoted 5 lines
drivers/infiniband/ulp/srpt/ib_srpt.c +2
-2-spin_lock_irq (&sdev->spinlock); +rcu_read_lock (); res =list_empty (&sdev->rch_list); -spin_unlock_irq (&sdev->spinlock); +rcu_read_unlock ();
It seems like this is the only RCU criticical session. How about just using list_del_init to delete from rch_list and calling list_empty_careful here to avoid the need for RCU here?
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 18/22 IB/srpt: Detect session shutdown reliably
In reply to a message not in the archiveThe Last WQE Reached event is only generated after one or more work requests have been queued on the QP associated with a session. Since session shutdown can start before any work requests have been queued, use a zero-length RDMA write to wait until a QP has been drained.
Additionally, rework the code for closing and disconnecting a session.
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 282 +++++++++++++++++----------------- drivers/infiniband/ulp/srpt/ib_srpt.h | 18 ++- 2 files changed, 150 insertions(+), 150 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +140 -142
@@ -92,10 +92,11 @@ MODULE_PARM_DESC(srpt_service_guid,static struct ib_client srpt_client;static void srpt_release_cmd (struct se_cmd *se_cmd); -static void srpt_release_channel (struct srpt_rdma_ch *ch); +static void srpt_free_ch (struct kref *kref);static int srpt_queue_status (struct se_cmd *cmd);static void srpt_recv_done (struct ib_cq *cq,struct ib_wc *wc);static void srpt_send_done (struct ib_cq *cq,struct ib_wc *wc); +static void srpt_zerolength_write_done (struct ib_cq *cq,struct ib_wc *wc);/* * The only allowed channel state changes are those that change the channel
@@ -175,6 +176,23 @@ static void srpt_srq_event(struct ib_event *event, void *ctx)pr_info ("SRQ event %d\n" , event->event); } +static const char *get_ch_state_name (enum rdma_ch_state s) +{ +switch (s) { +case CH_CONNECTING : +return "connecting" ; +case CH_LIVE : +return "live" ; +case CH_DISCONNECTING : +return "disconnecting" ; +case CH_DRAINING : +return "draining" ; +case CH_DISCONNECTED : +return "disconnected" ; + } +return "???" ; +} +/** * srpt_qp_event() - QP event callback function. */
@@ -188,11 +206,9 @@ static void srpt_qp_event(struct ib_event *event, struct srpt_rdma_ch *ch)ib_cm_notify (ch->cm_id, event->event);break ;case IB_EVENT_QP_LAST_WQE_REACHED : -if (srpt_set_ch_state (ch,CH_RELEASING )) -srpt_release_channel (ch); -else -pr_debug ("%s: state %d - ignored LAST_WQE.\n" , - ch->sess_name, ch->state); +pr_debug ("%s-%d, state %s: received Last WQE event.\n" , + ch->sess_name, ch->qp->qp_num, +get_ch_state_name (ch->state));break ;default :pr_err ("received unrecognized IB QP event %d\n" , event->event);
@@ -795,6 +811,37 @@ out: }/** +* srpt_zerolength_write() - Perform a zero-length RDMA write. +* +* A quote from the InfiniBand specification: C9-88: For an HCA responder +* using Reliable Connection service, for each zero-length RDMA READ or WRITE +* request, the R_Key shall not be validated, even if the request includes +* Immediate data. +*/ +static int srpt_zerolength_write (struct srpt_rdma_ch *ch) +{ +struct ib_send_wr wr, *bad_wr; + +memset (&wr,0 ,sizeof (wr)); + wr.opcode =IB_WR_RDMA_WRITE ; + wr.wr_cqe = &ch->zw_cqe; + wr.send_flags =IB_SEND_SIGNALED ; +return ib_post_send (ch->qp, &wr, &bad_wr); +} + +static void srpt_zerolength_write_done (struct ib_cq *cq,struct ib_wc *wc) +{ +struct srpt_rdma_ch *ch = cq->cq_context; + +WARN (wc->status ==IB_WC_SUCCESS ,"%s-%d: QP not in error state\n" , + ch->sess_name, ch->qp->qp_num); +if (srpt_set_ch_state (ch,CH_DISCONNECTED )) +schedule_work (&ch->release_work); +else +WARN_ONCE ("%s-%d\n" , ch->sess_name, ch->qp->qp_num); +} + +/** * srpt_get_desc_tbl() - Parse the data descriptors of an SRP_CMD request. * @ioctx: Pointer to the I/O context associated with the request. * @srp_cmd: Pointer to the SRP_CMD request data.
@@ -1816,110 +1863,102 @@ static void srpt_destroy_ch_ib(struct srpt_rdma_ch *ch) }/** -* __srpt_close_ch() - Close an RDMA channel by setting the QP error state. +* srpt_close_ch() - Close an RDMA channel. * -* Reset the QP and make sure all resources associated with the channel will -* be deallocated at an appropriate time. +* Make sure all resources associated with the channel will be deallocated at +* an appropriate time. * -* Note: The caller must hold ch->sport->sdev->spinlock. +* Returns true if and only if the channel state has been modified into +* CH_DRAINING. */ -static void __srpt_close_ch (struct srpt_rdma_ch *ch) +static bool srpt_close_ch (struct srpt_rdma_ch *ch) { -enum rdma_ch_state prev_state; -unsigned long flags; +int ret; -spin_lock_irqsave (&ch->spinlock, flags); - prev_state = ch->state; -switch (prev_state) { -case CH_CONNECTING : -case CH_LIVE : - ch->state =CH_DISCONNECTING ; -break ; -default : -break ; +if (!srpt_set_ch_state (ch,CH_DRAINING )) { +pr_debug ("%s-%d: already closed\n" , ch->sess_name, + ch->qp->qp_num); +return false; } -spin_unlock_irqrestore (&ch->spinlock, flags); -switch (prev_state) { -case CH_CONNECTING : -ib_send_cm_rej (ch->cm_id,IB_CM_REJ_NO_RESOURCES ,NULL ,0 , -NULL ,0 ); -/* fall through */ -case CH_LIVE : -if (ib_send_cm_dreq (ch->cm_id,NULL ,0 ) <0 ) -pr_err ("sending CM DREQ failed.\n" ); -break ; -case CH_DISCONNECTING : -break ; -case CH_DRAINING : -case CH_RELEASING : -break ; - } -} +kref_get (&ch->kref); -/** -* srpt_close_ch() - Close an RDMA channel. -*/ -static void srpt_close_ch (struct srpt_rdma_ch *ch) -{ -struct srpt_device *sdev = ch->sport->sdev; + ret =srpt_ch_qp_err (ch); +if (ret <0 ) +pr_err ("%s-%d: changing queue pair into error state failed: %d\n" , + ch->sess_name, ch->qp->qp_num, ret); -mutex_lock (&sdev->mutex); -__srpt_close_ch (ch); -mutex_unlock (&sdev->mutex); -} +pr_debug ("%s-%d: queued zerolength write\n" , ch->sess_name, + ch->qp->qp_num); + ret =srpt_zerolength_write (ch); +if (ret <0 ) { +pr_err ("%s-%d: queuing zero-length write failed: %d\n" , + ch->sess_name, ch->qp->qp_num, ret); +if (srpt_set_ch_state (ch,CH_DISCONNECTED )) +schedule_work (&ch->release_work); +else +WARN_ON_ONCE (true); + } -/** -* srpt_shutdown_session() - Whether or not a session may be shut down. -*/ -static int srpt_shutdown_session (struct se_session *se_sess) -{ -return 1 ; +kref_put (&ch->kref, srpt_free_ch); + +return true; } -/** -* srpt_drain_channel() - Drain a channel by resetting the IB queue pair. -* @cm_id: Pointer to the CM ID of the channel to be drained. -* -* Note: Must be called from inside srpt_cm_handler to avoid a race between -* accessing sdev->spinlock and the call to kfree(sdev) in srpt_remove_one() -* (the caller of srpt_cm_handler holds the cm_id spinlock; srpt_remove_one() -* waits until all target sessions for the associated IB device have been -* unregistered and target session registration involves a call to -* ib_destroy_cm_id(), which locks the cm_id spinlock and hence waits until -* this function has finished). +/* +* Change the channel state into CH_DISCONNECTING. If a channel has not yet +* reached the connected state, close it. If a channel is in the connected +* state, send a DREQ. If a DREQ has been received, send a DREP. Note: it is +* the responsibility of the caller to ensure that this function is not +* invoked concurrently with the code that accepts a connection. This means +* that this function must either be invoked from inside a CM callback +* function or that it must be invoked with the srpt_port.mutex held. */ -static void srpt_drain_channel (struct srpt_rdma_ch *ch) +static int srpt_disconnect_ch (struct srpt_rdma_ch *ch) {int ret; -bool do_reset = false; -WARN_ON_ONCE (irqs_disabled ()); +if (!srpt_set_ch_state (ch,CH_DISCONNECTING )) +return -ENOTCONN ; + + ret =ib_send_cm_dreq (ch->cm_id,NULL ,0 ); +if (ret <0 ) + ret =ib_send_cm_drep (ch->cm_id,NULL ,0 ); + +if (ret <0 &&srpt_close_ch (ch)) + ret =0 ; + +return ret; +} - do_reset =srpt_set_ch_state (ch,CH_DRAINING ); +static void __srpt_close_all_ch (struct srpt_device *sdev) +{ +struct srpt_rdma_ch *ch; -if (do_reset) { -if (ch->sess) -srpt_shutdown_session (ch->sess); +lockdep_assert_held (&sdev->mutex); - ret =srpt_ch_qp_err (ch); -if (ret <0 ) -pr_err ("Setting queue pair in error state" -" failed: %d\n" , ret); +list_for_each_entry (ch, &sdev->rch_list, list) { +if (srpt_disconnect_ch (ch) >=0 ) +pr_info ("Closing channel %s-%d because target %s has been disabled\n" , + ch->sess_name, ch->qp->qp_num, + sdev->device->name); +srpt_close_ch (ch); } }/** -* srpt_release_channel() - Release channel resources. -* -* Schedules the actual release because: -* - Calling the ib_destroy_cm_id() call from inside an IB CM callback would -* trigger a deadlock. -* - It is not safe to call TCM transport_* functions from interrupt context. +* srpt_shutdown_session() - Whether or not a session may be shut down. */ -static void srpt_release_channel (struct srpt_rdma_ch *ch) +static int srpt_shutdown_session (struct se_session *se_sess) +{ +return 1 ; +} + +static void srpt_free_ch (struct kref *kref) { -schedule_work (&ch->release_work); + struct srpt_rdma_ch *ch = container_of(kref, struct srpt_rdma_ch, kref); + +kfree_rcu (ch, rcu); }static void srpt_release_channel_work (struct work_struct *w)
@@ -1961,7 +2000,7 @@ static void srpt_release_channel_work(struct work_struct *w)wake_up (&sdev->ch_releaseQ); -kfree_rcu (ch, rcu); +kref_put (&ch->kref, srpt_free_ch); }/**
@@ -2045,17 +2084,10 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, && param->port == ch->sport->port && param->listen_id == ch->sport->sdev->cm_id && ch->cm_id) { -if (ch->state !=CH_CONNECTING - && ch->state !=CH_LIVE ) +if (srpt_disconnect_ch (ch) <0 )continue ; - -/* found an existing channel */ -pr_debug ("Found existing channel %s" -" cm_id= %p state= %d\n" , - ch->sess_name, ch->cm_id, ch->state); - -__srpt_close_ch (ch); - +pr_info ("Relogin - closed existing channel %s\n" , + ch->sess_name); rsp->rsp_flags =SRP_LOGIN_RSP_MULTICHAN_TERMINATED ; }
@@ -2086,6 +2118,8 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, goto reject; } +kref_init (&ch->kref); + ch->zw_cqe.done = srpt_zerolength_write_done;INIT_WORK (&ch->release_work, srpt_release_channel_work);memcpy (ch->i_port_id, req->initiator_port_id,16 );memcpy (ch->t_port_id, req->target_port_id,16 );
@@ -2209,7 +2243,7 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id, goto out; release_channel: -srpt_set_ch_state (ch,CH_RELEASING ); +srpt_disconnect_ch (ch);transport_deregister_session_configfs (ch->sess);transport_deregister_session (ch->sess); ch->sess =NULL ;
@@ -2257,7 +2291,6 @@ static void srpt_cm_rej_recv(struct srpt_rdma_ch *ch,pr_info ("Received CM REJ for ch %s-%d; reason %d; private data %s.\n" , ch->sess_name, ch->qp->qp_num, reason, priv ? :"(?)" );kfree (priv); -srpt_drain_channel (ch); }/**
@@ -2286,40 +2319,6 @@ static void srpt_cm_rtu_recv(struct srpt_rdma_ch *ch) }/** -* srpt_cm_dreq_recv() - Process reception of a DREQ message. -*/ -static void srpt_cm_dreq_recv (struct srpt_rdma_ch *ch) -{ -unsigned long flags; -bool send_drep = false; - -pr_debug ("ch %s-%d state %d\n" , ch->sess_name, ch->qp->qp_num, - ch->state); - -spin_lock_irqsave (&ch->spinlock, flags); -switch (ch->state) { -case CH_CONNECTING : -case CH_LIVE : - send_drep = true; - ch->state =CH_DISCONNECTING ; -break ; -case CH_DISCONNECTING : -case CH_DRAINING : -case CH_RELEASING : -WARN (true,"unexpected channel state %d\n" , ch->state); -break ; - } -spin_unlock_irqrestore (&ch->spinlock, flags); - -if (send_drep) { -if (ib_send_cm_drep (ch->cm_id,NULL ,0 ) <0 ) -pr_err ("Sending IB DREP failed.\n" ); -pr_info ("Received DREQ and sent DREP for session %s.\n" , - ch->sess_name); - } -} - -/** * srpt_cm_handler() - IB connection manager callback function. * * A non-zero return value will cause the caller destroy the CM ID.
@@ -2350,22 +2349,21 @@ static int srpt_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event)srpt_cm_rtu_recv (ch);break ;case IB_CM_DREQ_RECEIVED : -srpt_cm_dreq_recv (ch); +srpt_disconnect_ch (ch);break ;case IB_CM_DREP_RECEIVED :pr_info ("Received InfiniBand DREP message for ch %s-%d.\n" , ch->sess_name, ch->qp->qp_num); -srpt_drain_channel (ch); +srpt_close_ch (ch);break ;case IB_CM_TIMEWAIT_EXIT :pr_info ("Received CM TimeWait exit for ch %s-%d.\n" , ch->sess_name, ch->qp->qp_num); -srpt_drain_channel (ch); +srpt_close_ch (ch);break ;case IB_CM_REP_ERROR :pr_info ("Received CM REP error for ch %s-%d.\n" , ch->sess_name, ch->qp->qp_num); -srpt_drain_channel (ch);break ;case IB_CM_DREQ_ERROR :pr_info ("Received IB DREQ ERROR event.\n" );
@@ -2505,7 +2503,7 @@ static int srpt_write_pending(struct se_cmd *se_cmd)break ;case CH_DISCONNECTING :case CH_DRAINING : -case CH_RELEASING : +case CH_DISCONNECTED :pr_debug ("cmd with tag %lld: channel disconnecting\n" , ioctx->cmd.tag);srpt_set_cmd_state (ioctx,SRPT_STATE_DATA_IN );
@@ -2662,16 +2660,16 @@ static int srpt_ch_list_empty(struct srpt_device *sdev)*/ static int srpt_release_sdev (struct srpt_device *sdev) { -struct srpt_rdma_ch *ch, *tmp_ch; -int res; +int i, res;WARN_ON_ONCE (irqs_disabled ());BUG_ON (!sdev);mutex_lock (&sdev->mutex); -list_for_each_entry_safe (ch, tmp_ch, &sdev->rch_list, list) -__srpt_close_ch (ch); +for (i =0 ; i <ARRAY_SIZE (sdev->port); i++) + sdev->port[i].enabled = false; +__srpt_close_all_ch (sdev);mutex_unlock (&sdev->mutex); res = wait_event_interruptible(sdev->ch_releaseQ,
@@ -2968,7 +2966,7 @@ static void srpt_close_session(struct se_session *se_sess)BUG_ON (ch->release_done); ch->release_done = &release_done; wait = !list_empty (&ch->list); -__srpt_close_ch (ch); +srpt_disconnect_ch (ch);mutex_unlock (&sdev->mutex);if (!wait)
drivers/infiniband/ulp/srpt/ib_srpt.h +10 -8
@@ -218,20 +218,20 @@ struct srpt_send_ioctx {/** * enum rdma_ch_state - SRP channel state. -* @CH_CONNECTING: QP is in RTR state; waiting for RTU. -* @CH_LIVE: QP is in RTS state. -* @CH_DISCONNECTING: DREQ has been received; waiting for DREP -* or DREQ has been send and waiting for DREP -* or . -* @CH_DRAINING: QP is in ERR state; waiting for last WQE event. -* @CH_RELEASING: Last WQE event has been received; releasing resources. +* @CH_CONNECTING: QP is in RTR state; waiting for RTU. +* @CH_LIVE: QP is in RTS state. +* @CH_DISCONNECTING: DREQ has been sent and waiting for DREP or DREQ has +* been received. +* @CH_DRAINING: DREP has been received or waiting for DREP timed out +* and last work request has been queued. +* @CH_DISCONNECTED: Last completion has been received. */ enum rdma_ch_state {CH_CONNECTING ,CH_LIVE ,CH_DISCONNECTING ,CH_DRAINING , -CH_RELEASING +CH_DISCONNECTED , };/**
@@ -267,6 +267,8 @@ struct srpt_rdma_ch {struct ib_cm_id *cm_id;struct ib_qp *qp;struct ib_cq *cq; +struct ib_cqe zw_cqe; +struct kref kref;struct rcu_head rcu;int rq_size;u32 rsp_size;
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 19/22 IB/srpt: Fix srpt_write_pending()
In reply to a message not in the archiveThe only allowed return values for the write_pending() callback function are 0, -EAGAIN and -ENOMEM. Since attempting to perform RDMA over a disconnecting channel will result in an IB error completion anyway, remove the code that checks the channel state from srpt_write_pending().
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 33 ++++----------------------------- 1 file changed, 4 insertions(+), 29 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +4 -29
@@ -2481,39 +2481,14 @@ static int srpt_write_pending_status(struct se_cmd *se_cmd)*/ static int srpt_write_pending (struct se_cmd *se_cmd) { -struct srpt_rdma_ch *ch; -struct srpt_send_ioctx *ioctx; +struct srpt_send_ioctx *ioctx = + container_of(se_cmd, struct srpt_send_ioctx, cmd); +struct srpt_rdma_ch *ch = ioctx->ch;enum srpt_command_state new_state; -int ret; - - ioctx = container_of(se_cmd, struct srpt_send_ioctx, cmd); new_state =srpt_set_cmd_state (ioctx,SRPT_STATE_NEED_DATA );WARN_ON (new_state ==SRPT_STATE_DONE ); - - ch = ioctx->ch; -BUG_ON (!ch); - -switch (ch->state) { -case CH_CONNECTING : -WARN (true,"unexpected channel state %d\n" , ch->state); - ret = -EINVAL ; - goto out; -case CH_LIVE : -break ; -case CH_DISCONNECTING : -case CH_DRAINING : -case CH_DISCONNECTED : -pr_debug ("cmd with tag %lld: channel disconnecting\n" , - ioctx->cmd.tag); -srpt_set_cmd_state (ioctx,SRPT_STATE_DATA_IN ); - ret = -EINVAL ; - goto out; - } - ret =srpt_xfer_data (ch, ioctx); - -out: -return ret; +return srpt_xfer_data (ch, ioctx); }static u8 tcm_to_srp_tsk_mgmt_status (const int tcm_mgmt_status)
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 20/22 IB/srpt: Log out all initiators if a port is disabled
In reply to a message not in the archiveIf an initiator observes LUN deletion during shutdown of the target stack then that will trigger an I/O error even when using multipathd. Users need a way to avoid that shutting down the target stack causes I/O errors, e.g. by providing a way to force initiator logout. Hence close all sessions if a target port is disabled.
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +19 -4
@@ -3157,6 +3157,8 @@ static ssize_t srpt_tpg_enable_store(struct config_item *item, {struct se_portal_group *se_tpg =to_tpg (item); struct srpt_port *sport = container_of(se_tpg, struct srpt_port, port_tpg_1); +struct srpt_device *sdev = sport->sdev; +struct srpt_rdma_ch *ch;unsigned long tmp;int ret;
@@ -3170,11 +3172,24 @@ static ssize_t srpt_tpg_enable_store(struct config_item *item,pr_err ("Illegal value for srpt_tpg_store_enable: %lu\n" , tmp);return -EINVAL ; } -if (tmp ==1 ) - sport->enabled = true; -else - sport->enabled = false; +if (sport->enabled == tmp) + goto out; + sport->enabled = tmp; +if (sport->enabled) + goto out; +mutex_lock (&sdev->mutex); +list_for_each_entry (ch, &sdev->rch_list, list) { +if (ch->sport == sport) { +pr_debug ("%s: ch %p %s-%d\n" , __func__, ch, + ch->sess_name, ch->qp->qp_num); +srpt_disconnect_ch (ch); +srpt_close_ch (ch); + } + } +mutex_unlock (&sdev->mutex); + +out:return count; }
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): [email protected]
Christoph Hellwig
Reviewed-byRe: [PATCH v2 20/22] IB/srpt: Log out all initiators if a port is disabled
Looks good,
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH v2 20/22] IB/srpt: Log out all initiators if a port is disabled
In reply to a message not in the archiveTG9va3MgZ29vZC4NClJldmlld2VkLWJ5OiBBbGV4IEVzdHJpbiA8YWxleC5lc3RyaW5AaW50ZWwu Y29tPg0KDQo+IElmIGFuIGluaXRpYXRvciBvYnNlcnZlcyBMVU4gZGVsZXRpb24gZHVyaW5nIHNo dXRkb3duIG9mIHRoZQ0KPiB0YXJnZXQgc3RhY2sgdGhlbiB0aGF0IHdpbGwgdHJpZ2dlciBhbiBJ L08gZXJyb3IgZXZlbiB3aGVuIHVzaW5nDQo+IG11bHRpcGF0aGQuIFVzZXJzIG5lZWQgYSB3YXkg dG8gYXZvaWQgdGhhdCBzaHV0dGluZyBkb3duIHRoZQ0KPiB0YXJnZXQgc3RhY2sgY2F1c2VzIEkv TyBlcnJvcnMsIGUuZy4gYnkgcHJvdmlkaW5nIGEgd2F5IHRvIGZvcmNlDQo+IGluaXRpYXRvciBs b2dvdXQuIEhlbmNlIGNsb3NlIGFsbCBzZXNzaW9ucyBpZiBhIHRhcmdldCBwb3J0IGlzDQo+IGRp c2FibGVkLg0KPiANCj4gU2lnbmVkLW9mZi1ieTogQmFydCBWYW4gQXNzY2hlIDxiYXJ0LnZhbmFz c2NoZUBzYW5kaXNrLmNvbT4NCj4gQ2M6IENocmlzdG9waCBIZWxsd2lnIDxoY2hAbHN0LmRlPg0K PiBDYzogU2FnaSBHcmltYmVyZyA8c2FnaWdAbWVsbGFub3guY29tPg0KPiAtLS0NCj4gIGRyaXZl cnMvaW5maW5pYmFuZC91bHAvc3JwdC9pYl9zcnB0LmMgfCAyMyArKysrKysrKysrKysrKysrKysr LS0tLQ0KPiAgMSBmaWxlIGNoYW5nZWQsIDE5IGluc2VydGlvbnMoKyksIDQgZGVsZXRpb25zKC0p DQo+IA0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnB0L2liX3NycHQu Yw0KPiBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwdC9pYl9zcnB0LmMNCj4gaW5kZXggYTdj OTY2Zi4uZDViOTMyYyAxMDA2NDQNCj4gLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnB0 L2liX3NycHQuYw0KPiArKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycHQvaWJfc3JwdC5j DQo+IEBAIC0zMTU3LDYgKzMxNTcsOCBAQCBzdGF0aWMgc3NpemVfdCBzcnB0X3RwZ19lbmFibGVf c3RvcmUoc3RydWN0IGNvbmZpZ19pdGVtDQo+ICppdGVtLA0KPiAgew0KPiAgCXN0cnVjdCBzZV9w b3J0YWxfZ3JvdXAgKnNlX3RwZyA9IHRvX3RwZyhpdGVtKTsNCj4gIAlzdHJ1Y3Qgc3JwdF9wb3J0 ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihzZV90cGcsIHN0cnVjdCBzcnB0X3BvcnQsDQo+IHBvcnRf dHBnXzEpOw0KPiArCXN0cnVjdCBzcnB0X2RldmljZSAqc2RldiA9IHNwb3J0LT5zZGV2Ow0KPiAr CXN0cnVjdCBzcnB0X3JkbWFfY2ggKmNoOw0KPiAgCXVuc2lnbmVkIGxvbmcgdG1wOw0KPiAgICAg ICAgICBpbnQgcmV0Ow0KPiANCj4gQEAgLTMxNzAsMTEgKzMxNzIsMjQgQEAgc3RhdGljIHNzaXpl X3Qgc3JwdF90cGdfZW5hYmxlX3N0b3JlKHN0cnVjdCBjb25maWdfaXRlbQ0KPiAqaXRlbSwNCj4g IAkJcHJfZXJyKCJJbGxlZ2FsIHZhbHVlIGZvciBzcnB0X3RwZ19zdG9yZV9lbmFibGU6ICVsdVxu IiwgdG1wKTsNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+ICAJfQ0KPiAtCWlmICh0bXAgPT0gMSkN Cj4gLQkJc3BvcnQtPmVuYWJsZWQgPSB0cnVlOw0KPiAtCWVsc2UNCj4gLQkJc3BvcnQtPmVuYWJs ZWQgPSBmYWxzZTsNCj4gKwlpZiAoc3BvcnQtPmVuYWJsZWQgPT0gdG1wKQ0KPiArCQlnb3RvIG91 dDsNCj4gKwlzcG9ydC0+ZW5hYmxlZCA9IHRtcDsNCj4gKwlpZiAoc3BvcnQtPmVuYWJsZWQpDQo+ ICsJCWdvdG8gb3V0Ow0KPiANCj4gKwltdXRleF9sb2NrKCZzZGV2LT5tdXRleCk7DQo+ICsJbGlz dF9mb3JfZWFjaF9lbnRyeShjaCwgJnNkZXYtPnJjaF9saXN0LCBsaXN0KSB7DQo+ICsJCWlmIChj aC0+c3BvcnQgPT0gc3BvcnQpIHsNCj4gKwkJCXByX2RlYnVnKCIlczogY2ggJXAgJXMtJWRcbiIs IF9fZnVuY19fLCBjaCwNCj4gKwkJCQkgY2gtPnNlc3NfbmFtZSwgY2gtPnFwLT5xcF9udW0pOw0K PiArCQkJc3JwdF9kaXNjb25uZWN0X2NoKGNoKTsNCj4gKwkJCXNycHRfY2xvc2VfY2goY2gpOw0K PiArCQl9DQo+ICsJfQ0KPiArCW11dGV4X3VubG9jaygmc2Rldi0+bXV0ZXgpOw0KPiArDQo+ICtv dXQ6DQo+ICAJcmV0dXJuIGNvdW50Ow0KPiAgfQ0KPiANCj4gLS0NCj4gMi43LjANCg0K --
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 21/22 IB/srpt: Introduce srpt_process_wait_list()
In reply to a message not in the archiveThis patch does not change any functionality.
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 42 ++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 18 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +24 -18
@@ -1730,6 +1730,28 @@ static void srpt_recv_done(struct ib_cq *cq, struct ib_wc *wc) } } +/* +* This function must be called from the context in which RDMA completions are +* processed because it accesses the wait list without protection against +* access from other threads. +*/ +static void srpt_process_wait_list (struct srpt_rdma_ch *ch) +{ +struct srpt_send_ioctx *ioctx; + +while (!list_empty (&ch->cmd_wait_list) && + ch->state >=CH_LIVE && + (ioctx =srpt_get_send_ioctx (ch)) !=NULL ) { +struct srpt_recv_ioctx *recv_ioctx; + + recv_ioctx =list_first_entry (&ch->cmd_wait_list, + struct srpt_recv_ioctx, + wait_list); +list_del (&recv_ioctx->wait_list); +srpt_handle_new_iu (ch, recv_ioctx, ioctx); + } +} +/** * Note: Although this has not yet been observed during tests, at least in * theory it is possible that the srpt_get_send_ioctx() call invoked by
@@ -1769,17 +1791,7 @@ static void srpt_send_done(struct ib_cq *cq, struct ib_wc *wc) " wr_id = %u.\n", ioctx->ioctx.index); } -while (!list_empty (&ch->cmd_wait_list) && - ch->state ==CH_LIVE && - (ioctx =srpt_get_send_ioctx (ch)) !=NULL ) { -struct srpt_recv_ioctx *recv_ioctx; - - recv_ioctx =list_first_entry (&ch->cmd_wait_list, - struct srpt_recv_ioctx, - wait_list); -list_del (&recv_ioctx->wait_list); -srpt_handle_new_iu (ch, recv_ioctx, ioctx); - } +srpt_process_wait_list (ch); }/**
@@ -2304,15 +2316,9 @@ static void srpt_cm_rtu_recv(struct srpt_rdma_ch *ch)int ret;if (srpt_set_ch_state (ch,CH_LIVE )) { -struct srpt_recv_ioctx *ioctx, *ioctx_tmp; - ret =srpt_ch_qp_rts (ch, ch->qp); -list_for_each_entry_safe (ioctx, ioctx_tmp, &ch->cmd_wait_list, - wait_list) { -list_del (&ioctx->wait_list); -srpt_handle_new_iu (ch, ioctx,NULL ); - } +srpt_process_wait_list (ch);if (ret)srpt_close_ch (ch); }
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): [email protected]
Christoph Hellwig
Reviewed-byRe: [PATCH v2 21/22] IB/srpt: Introduce srpt_process_wait_list()
Looks fine,
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH v2 21/22] IB/srpt: Introduce srpt_process_wait_list()
In reply to a message not in the archiveTG9va3MgZ29vZC4NClJldmlld2VkLWJ5OiBBbGV4IEVzdHJpbiA8YWxleC5lc3RyaW5AaW50ZWwu Y29tPg0KDQo+IFRoaXMgcGF0Y2ggZG9lcyBub3QgY2hhbmdlIGFueSBmdW5jdGlvbmFsaXR5Lg0K PiANCj4gU2lnbmVkLW9mZi1ieTogQmFydCBWYW4gQXNzY2hlIDxiYXJ0LnZhbmFzc2NoZUBzYW5k aXNrLmNvbT4NCj4gQ2M6IENocmlzdG9waCBIZWxsd2lnIDxoY2hAbHN0LmRlPg0KPiBDYzogU2Fn aSBHcmltYmVyZyA8c2FnaWdAbWVsbGFub3guY29tPg0KPiAtLS0NCj4gIGRyaXZlcnMvaW5maW5p YmFuZC91bHAvc3JwdC9pYl9zcnB0LmMgfCA0MiArKysrKysrKysrKysrKysrKysrKy0tLS0tLS0t LS0tLS0tLQ0KPiAgMSBmaWxlIGNoYW5nZWQsIDI0IGluc2VydGlvbnMoKyksIDE4IGRlbGV0aW9u cygtKQ0KPiANCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwdC9pYl9z cnB0LmMNCj4gYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycHQvaWJfc3JwdC5jDQo+IGluZGV4 IGQ1YjkzMmMuLjUxODVlY2EgMTAwNjQ0DQo+IC0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAv c3JwdC9pYl9zcnB0LmMNCj4gKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnB0L2liX3Ny cHQuYw0KPiBAQCAtMTczMCw2ICsxNzMwLDI4IEBAIHN0YXRpYyB2b2lkIHNycHRfcmVjdl9kb25l KHN0cnVjdCBpYl9jcSAqY3EsIHN0cnVjdCBpYl93Yw0KPiAqd2MpDQo+ICAJfQ0KPiAgfQ0KPiAN Cj4gKy8qDQo+ICsgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGNvbnRl eHQgaW4gd2hpY2ggUkRNQSBjb21wbGV0aW9ucyBhcmUNCj4gKyAqIHByb2Nlc3NlZCBiZWNhdXNl IGl0IGFjY2Vzc2VzIHRoZSB3YWl0IGxpc3Qgd2l0aG91dCBwcm90ZWN0aW9uIGFnYWluc3QNCj4g KyAqIGFjY2VzcyBmcm9tIG90aGVyIHRocmVhZHMuDQo+ICsgKi8NCj4gK3N0YXRpYyB2b2lkIHNy cHRfcHJvY2Vzc193YWl0X2xpc3Qoc3RydWN0IHNycHRfcmRtYV9jaCAqY2gpDQo+ICt7DQo+ICsJ c3RydWN0IHNycHRfc2VuZF9pb2N0eCAqaW9jdHg7DQo+ICsNCj4gKwl3aGlsZSAoIWxpc3RfZW1w dHkoJmNoLT5jbWRfd2FpdF9saXN0KSAmJg0KPiArCSAgICAgICBjaC0+c3RhdGUgPj0gQ0hfTElW RSAmJg0KPiArCSAgICAgICAoaW9jdHggPSBzcnB0X2dldF9zZW5kX2lvY3R4KGNoKSkgIT0gTlVM TCkgew0KPiArCQlzdHJ1Y3Qgc3JwdF9yZWN2X2lvY3R4ICpyZWN2X2lvY3R4Ow0KPiArDQo+ICsJ CXJlY3ZfaW9jdHggPSBsaXN0X2ZpcnN0X2VudHJ5KCZjaC0+Y21kX3dhaXRfbGlzdCwNCj4gKwkJ CQkJICAgICAgc3RydWN0IHNycHRfcmVjdl9pb2N0eCwNCj4gKwkJCQkJICAgICAgd2FpdF9saXN0 KTsNCj4gKwkJbGlzdF9kZWwoJnJlY3ZfaW9jdHgtPndhaXRfbGlzdCk7DQo+ICsJCXNycHRfaGFu ZGxlX25ld19pdShjaCwgcmVjdl9pb2N0eCwgaW9jdHgpOw0KPiArCX0NCj4gK30NCj4gKw0KPiAg LyoqDQo+ICAgKiBOb3RlOiBBbHRob3VnaCB0aGlzIGhhcyBub3QgeWV0IGJlZW4gb2JzZXJ2ZWQg ZHVyaW5nIHRlc3RzLCBhdCBsZWFzdCBpbg0KPiAgICogdGhlb3J5IGl0IGlzIHBvc3NpYmxlIHRo YXQgdGhlIHNycHRfZ2V0X3NlbmRfaW9jdHgoKSBjYWxsIGludm9rZWQgYnkNCj4gQEAgLTE3Njks MTcgKzE3OTEsNyBAQCBzdGF0aWMgdm9pZCBzcnB0X3NlbmRfZG9uZShzdHJ1Y3QgaWJfY3EgKmNx LCBzdHJ1Y3QgaWJfd2MNCj4gKndjKQ0KPiAgCQkgICAgICAgIiB3cl9pZCA9ICV1LlxuIiwgaW9j dHgtPmlvY3R4LmluZGV4KTsNCj4gIAl9DQo+IA0KPiAtCXdoaWxlICghbGlzdF9lbXB0eSgmY2gt PmNtZF93YWl0X2xpc3QpICYmDQo+IC0JICAgICAgIGNoLT5zdGF0ZSA9PSBDSF9MSVZFICYmDQo+ IC0JICAgICAgIChpb2N0eCA9IHNycHRfZ2V0X3NlbmRfaW9jdHgoY2gpKSAhPSBOVUxMKSB7DQo+ IC0JCXN0cnVjdCBzcnB0X3JlY3ZfaW9jdHggKnJlY3ZfaW9jdHg7DQo+IC0NCj4gLQkJcmVjdl9p b2N0eCA9IGxpc3RfZmlyc3RfZW50cnkoJmNoLT5jbWRfd2FpdF9saXN0LA0KPiAtCQkJCQkgICAg ICBzdHJ1Y3Qgc3JwdF9yZWN2X2lvY3R4LA0KPiAtCQkJCQkgICAgICB3YWl0X2xpc3QpOw0KPiAt CQlsaXN0X2RlbCgmcmVjdl9pb2N0eC0+d2FpdF9saXN0KTsNCj4gLQkJc3JwdF9oYW5kbGVfbmV3 X2l1KGNoLCByZWN2X2lvY3R4LCBpb2N0eCk7DQo+IC0JfQ0KPiArCXNycHRfcHJvY2Vzc193YWl0 X2xpc3QoY2gpOw0KPiAgfQ0KPiANCj4gIC8qKg0KPiBAQCAtMjMwNCwxNSArMjMxNiw5IEBAIHN0 YXRpYyB2b2lkIHNycHRfY21fcnR1X3JlY3Yoc3RydWN0IHNycHRfcmRtYV9jaCAqY2gpDQo+ICAJ aW50IHJldDsNCj4gDQo+ICAJaWYgKHNycHRfc2V0X2NoX3N0YXRlKGNoLCBDSF9MSVZFKSkgew0K PiAtCQlzdHJ1Y3Qgc3JwdF9yZWN2X2lvY3R4ICppb2N0eCwgKmlvY3R4X3RtcDsNCj4gLQ0KPiAg CQlyZXQgPSBzcnB0X2NoX3FwX3J0cyhjaCwgY2gtPnFwKTsNCj4gDQo+IC0JCWxpc3RfZm9yX2Vh Y2hfZW50cnlfc2FmZShpb2N0eCwgaW9jdHhfdG1wLCAmY2gtPmNtZF93YWl0X2xpc3QsDQo+IC0J CQkJCSB3YWl0X2xpc3QpIHsNCj4gLQkJCWxpc3RfZGVsKCZpb2N0eC0+d2FpdF9saXN0KTsNCj4g LQkJCXNycHRfaGFuZGxlX25ld19pdShjaCwgaW9jdHgsIE5VTEwpOw0KPiAtCQl9DQo+ICsJCXNy cHRfcHJvY2Vzc193YWl0X2xpc3QoY2gpOw0KPiAgCQlpZiAocmV0KQ0KPiAgCQkJc3JwdF9jbG9z ZV9jaChjaCk7DQo+ICAJfQ0KPiAtLQ0KPiAyLjcuMA0KDQo=
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 22/22 IB/srpt: Fix wait list processing
In reply to a message not in the archiveSince the wait list is not protected against concurrent access it must be processed from the context of the completion handler. Replace the wait list processing code in the IB CM RTU callback handler by code that triggers a completion handler. This patch fixes the following rare crash:
WARNING: CPU: 2 PID: 78656 at lib/list_debug.c:53 __list_del_entry+0x67/0xd0() list_del corruption, ffff88041ae404b8->next is LIST_POISON1 (dead000000000100) Call Trace: [<ffffffff81251c6b>] dump_stack+0x4f/0x74 [<ffffffff810574ab>] warn_slowpath_common+0x8b/0xd0 [<ffffffff81057591>] warn_slowpath_fmt+0x41/0x70 [<ffffffff8126f007>] __list_del_entry+0x67/0xd0 [<ffffffff8126f081>] list_del+0x11/0x40 [<ffffffffa0265242>] srpt_cm_handler+0x172/0x1a4 [ib_srpt] [<ffffffffa0370370>] cm_process_work+0x20/0xf0 [ib_cm] [<ffffffffa0370dae>] cm_establish_handler+0xbe/0x110 [ib_cm] [<ffffffffa03733e7>] cm_work_handler+0x67/0xd0 [ib_cm] [<ffffffff8107184d>] process_one_work+0x1bd/0x460 [<ffffffff81073148>] worker_thread+0x118/0x420 [<ffffffff81078444>] kthread+0xe4/0x100 [<ffffffff8151caff>] ret_from_fork+0x3f/0x70
--- drivers/infiniband/ulp/srpt/ib_srpt.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-)
drivers/infiniband/ulp/srpt/ib_srpt.c +15 -9
@@ -96,7 +96,7 @@ static void srpt_free_ch(struct kref *kref);static int srpt_queue_status (struct se_cmd *cmd);static void srpt_recv_done (struct ib_cq *cq,struct ib_wc *wc);static void srpt_send_done (struct ib_cq *cq,struct ib_wc *wc); -static void srpt_zerolength_write_done (struct ib_cq *cq,struct ib_wc *wc); +static void srpt_process_wait_list (struct srpt_rdma_ch *ch);/* * The only allowed channel state changes are those that change the channel
@@ -833,12 +833,14 @@ static void srpt_zerolength_write_done(struct ib_cq *cq, struct ib_wc *wc) {struct srpt_rdma_ch *ch = cq->cq_context; -WARN (wc->status ==IB_WC_SUCCESS ,"%s-%d: QP not in error state\n" , - ch->sess_name, ch->qp->qp_num); -if (srpt_set_ch_state (ch,CH_DISCONNECTED )) -schedule_work (&ch->release_work); -else -WARN_ONCE ("%s-%d\n" , ch->sess_name, ch->qp->qp_num); +if (wc->status ==IB_WC_SUCCESS ) { +srpt_process_wait_list (ch); + }else { +if (srpt_set_ch_state (ch,CH_DISCONNECTED )) +schedule_work (&ch->release_work); +else +WARN_ONCE ("%s-%d\n" , ch->sess_name, ch->qp->qp_num); + } }/**
@@ -2318,9 +2320,13 @@ static void srpt_cm_rtu_recv(struct srpt_rdma_ch *ch)if (srpt_set_ch_state (ch,CH_LIVE )) { ret =srpt_ch_qp_rts (ch, ch->qp); -srpt_process_wait_list (ch); -if (ret) +if (ret ==0 ) { +/* Trigger wait list processing. */ + ret =srpt_zerolength_write (ch); +WARN_ONCE (ret <0 ,"%d\n" , ret); + }else {srpt_close_ch (ch); + } } }
Signature · 6 lines
2.7.0 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): [email protected]
Christoph Hellwig
Reviewed-byRe: [PATCH v2 22/22] IB/srpt: Fix wait list processing
Heh, that's an interesting trick. But this looks reasonable to me:
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH v2 22/22] IB/srpt: Fix wait list processing
In reply to a message not in the archiveTmljZS4NClJldmlld2VkLWJ5OiBBbGV4IEVzdHJpbiA8YWxleC5lc3RyaW5AaW50ZWwuY29tPg0K DQo+IFNpbmNlIHRoZSB3YWl0IGxpc3QgaXMgbm90IHByb3RlY3RlZCBhZ2FpbnN0IGNvbmN1cnJl bnQgYWNjZXNzDQo+IGl0IG11c3QgYmUgcHJvY2Vzc2VkIGZyb20gdGhlIGNvbnRleHQgb2YgdGhl IGNvbXBsZXRpb24gaGFuZGxlci4NCj4gUmVwbGFjZSB0aGUgd2FpdCBsaXN0IHByb2Nlc3Npbmcg Y29kZSBpbiB0aGUgSUIgQ00gUlRVIGNhbGxiYWNrDQo+IGhhbmRsZXIgYnkgY29kZSB0aGF0IHRy aWdnZXJzIGEgY29tcGxldGlvbiBoYW5kbGVyLiBUaGlzIHBhdGNoDQo+IGZpeGVzIHRoZSBmb2xs b3dpbmcgcmFyZSBjcmFzaDoNCj4gDQo+IFdBUk5JTkc6IENQVTogMiBQSUQ6IDc4NjU2IGF0IGxp Yi9saXN0X2RlYnVnLmM6NTMgX19saXN0X2RlbF9lbnRyeSsweDY3LzB4ZDAoKQ0KPiBsaXN0X2Rl bCBjb3JydXB0aW9uLCBmZmZmODgwNDFhZTQwNGI4LT5uZXh0IGlzIExJU1RfUE9JU09OMSAoZGVh ZDAwMDAwMDAwMDEwMCkNCj4gQ2FsbCBUcmFjZToNCj4gIFs8ZmZmZmZmZmY4MTI1MWM2Yj5dIGR1 bXBfc3RhY2srMHg0Zi8weDc0DQo+ICBbPGZmZmZmZmZmODEwNTc0YWI+XSB3YXJuX3Nsb3dwYXRo X2NvbW1vbisweDhiLzB4ZDANCj4gIFs8ZmZmZmZmZmY4MTA1NzU5MT5dIHdhcm5fc2xvd3BhdGhf Zm10KzB4NDEvMHg3MA0KPiAgWzxmZmZmZmZmZjgxMjZmMDA3Pl0gX19saXN0X2RlbF9lbnRyeSsw eDY3LzB4ZDANCj4gIFs8ZmZmZmZmZmY4MTI2ZjA4MT5dIGxpc3RfZGVsKzB4MTEvMHg0MA0KPiAg WzxmZmZmZmZmZmEwMjY1MjQyPl0gc3JwdF9jbV9oYW5kbGVyKzB4MTcyLzB4MWE0IFtpYl9zcnB0 XQ0KPiAgWzxmZmZmZmZmZmEwMzcwMzcwPl0gY21fcHJvY2Vzc193b3JrKzB4MjAvMHhmMCBbaWJf Y21dDQo+ICBbPGZmZmZmZmZmYTAzNzBkYWU+XSBjbV9lc3RhYmxpc2hfaGFuZGxlcisweGJlLzB4 MTEwIFtpYl9jbV0NCj4gIFs8ZmZmZmZmZmZhMDM3MzNlNz5dIGNtX3dvcmtfaGFuZGxlcisweDY3 LzB4ZDAgW2liX2NtXQ0KPiAgWzxmZmZmZmZmZjgxMDcxODRkPl0gcHJvY2Vzc19vbmVfd29yaysw eDFiZC8weDQ2MA0KPiAgWzxmZmZmZmZmZjgxMDczMTQ4Pl0gd29ya2VyX3RocmVhZCsweDExOC8w eDQyMA0KPiAgWzxmZmZmZmZmZjgxMDc4NDQ0Pl0ga3RocmVhZCsweGU0LzB4MTAwDQo+ICBbPGZm ZmZmZmZmODE1MWNhZmY+XSByZXRfZnJvbV9mb3JrKzB4M2YvMHg3MA0KPiANCj4gU2lnbmVkLW9m Zi1ieTogQmFydCBWYW4gQXNzY2hlIDxiYXJ0LnZhbmFzc2NoZUBzYW5kaXNrLmNvbT4NCj4gQ2M6 IENocmlzdG9waCBIZWxsd2lnIDxoY2hAbHN0LmRlPg0KPiBDYzogU2FnaSBHcmltYmVyZyA8c2Fn aWdAbWVsbGFub3guY29tPg0KPiAtLS0NCj4gIGRyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwdC9p Yl9zcnB0LmMgfCAyNCArKysrKysrKysrKysrKystLS0tLS0tLS0NCj4gIDEgZmlsZSBjaGFuZ2Vk LCAxNSBpbnNlcnRpb25zKCspLCA5IGRlbGV0aW9ucygtKQ0KPiANCj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvaW5maW5pYmFuZC91bHAvc3JwdC9pYl9zcnB0LmMNCj4gYi9kcml2ZXJzL2luZmluaWJh bmQvdWxwL3NycHQvaWJfc3JwdC5jDQo+IGluZGV4IDUxODVlY2EuLjA4YTMwYzYgMTAwNjQ0DQo+ IC0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwdC9pYl9zcnB0LmMNCj4gKysrIGIvZHJp dmVycy9pbmZpbmliYW5kL3VscC9zcnB0L2liX3NycHQuYw0KPiBAQCAtOTYsNyArOTYsNyBAQCBz dGF0aWMgdm9pZCBzcnB0X2ZyZWVfY2goc3RydWN0IGtyZWYgKmtyZWYpOw0KPiAgc3RhdGljIGlu dCBzcnB0X3F1ZXVlX3N0YXR1cyhzdHJ1Y3Qgc2VfY21kICpjbWQpOw0KPiAgc3RhdGljIHZvaWQg c3JwdF9yZWN2X2RvbmUoc3RydWN0IGliX2NxICpjcSwgc3RydWN0IGliX3djICp3Yyk7DQo+ICBz dGF0aWMgdm9pZCBzcnB0X3NlbmRfZG9uZShzdHJ1Y3QgaWJfY3EgKmNxLCBzdHJ1Y3QgaWJfd2Mg KndjKTsNCj4gLXN0YXRpYyB2b2lkIHNycHRfemVyb2xlbmd0aF93cml0ZV9kb25lKHN0cnVjdCBp Yl9jcSAqY3EsIHN0cnVjdCBpYl93YyAqd2MpOw0KPiArc3RhdGljIHZvaWQgc3JwdF9wcm9jZXNz X3dhaXRfbGlzdChzdHJ1Y3Qgc3JwdF9yZG1hX2NoICpjaCk7DQo+IA0KPiAgLyoNCj4gICAqIFRo ZSBvbmx5IGFsbG93ZWQgY2hhbm5lbCBzdGF0ZSBjaGFuZ2VzIGFyZSB0aG9zZSB0aGF0IGNoYW5n ZSB0aGUgY2hhbm5lbA0KPiBAQCAtODMzLDEyICs4MzMsMTQgQEAgc3RhdGljIHZvaWQgc3JwdF96 ZXJvbGVuZ3RoX3dyaXRlX2RvbmUoc3RydWN0IGliX2NxICpjcSwNCj4gc3RydWN0IGliX3djICp3 YykNCj4gIHsNCj4gIAlzdHJ1Y3Qgc3JwdF9yZG1hX2NoICpjaCA9IGNxLT5jcV9jb250ZXh0Ow0K PiANCj4gLQlXQVJOKHdjLT5zdGF0dXMgPT0gSUJfV0NfU1VDQ0VTUywgIiVzLSVkOiBRUCBub3Qg aW4gZXJyb3Igc3RhdGVcbiIsDQo+IC0JICAgICBjaC0+c2Vzc19uYW1lLCBjaC0+cXAtPnFwX251 bSk7DQo+IC0JaWYgKHNycHRfc2V0X2NoX3N0YXRlKGNoLCBDSF9ESVNDT05ORUNURUQpKQ0KPiAt CQlzY2hlZHVsZV93b3JrKCZjaC0+cmVsZWFzZV93b3JrKTsNCj4gLQllbHNlDQo+IC0JCVdBUk5f T05DRSgiJXMtJWRcbiIsIGNoLT5zZXNzX25hbWUsIGNoLT5xcC0+cXBfbnVtKTsNCj4gKwlpZiAo d2MtPnN0YXR1cyA9PSBJQl9XQ19TVUNDRVNTKSB7DQo+ICsJCXNycHRfcHJvY2Vzc193YWl0X2xp c3QoY2gpOw0KPiArCX0gZWxzZSB7DQo+ICsJCWlmIChzcnB0X3NldF9jaF9zdGF0ZShjaCwgQ0hf RElTQ09OTkVDVEVEKSkNCj4gKwkJCXNjaGVkdWxlX3dvcmsoJmNoLT5yZWxlYXNlX3dvcmspOw0K PiArCQllbHNlDQo+ICsJCQlXQVJOX09OQ0UoIiVzLSVkXG4iLCBjaC0+c2Vzc19uYW1lLCBjaC0+ cXAtPnFwX251bSk7DQo+ICsJfQ0KPiAgfQ0KPiANCj4gIC8qKg0KPiBAQCAtMjMxOCw5ICsyMzIw LDEzIEBAIHN0YXRpYyB2b2lkIHNycHRfY21fcnR1X3JlY3Yoc3RydWN0IHNycHRfcmRtYV9jaCAq Y2gpDQo+ICAJaWYgKHNycHRfc2V0X2NoX3N0YXRlKGNoLCBDSF9MSVZFKSkgew0KPiAgCQlyZXQg PSBzcnB0X2NoX3FwX3J0cyhjaCwgY2gtPnFwKTsNCj4gDQo+IC0JCXNycHRfcHJvY2Vzc193YWl0 X2xpc3QoY2gpOw0KPiAtCQlpZiAocmV0KQ0KPiArCQlpZiAocmV0ID09IDApIHsNCj4gKwkJCS8q IFRyaWdnZXIgd2FpdCBsaXN0IHByb2Nlc3NpbmcuICovDQo+ICsJCQlyZXQgPSBzcnB0X3plcm9s ZW5ndGhfd3JpdGUoY2gpOw0KPiArCQkJV0FSTl9PTkNFKHJldCA8IDAsICIlZFxuIiwgcmV0KTsN Cj4gKwkJfSBlbHNlIHsNCj4gIAkJCXNycHRfY2xvc2VfY2goY2gpOw0KPiArCQl9DQo+ICAJfQ0K PiAgfQ0KPiANCj4gLS0NCj4gMi43LjANCj4gDQo+IC0tDQo+IFRvIHVuc3Vic2NyaWJlIGZyb20g dGhpcyBsaXN0OiBzZW5kIHRoZSBsaW5lICJ1bnN1YnNjcmliZSBsaW51eC1yZG1hIiBpbg0KPiB0 aGUgYm9keSBvZiBhIG1lc3NhZ2UgdG8gbWFqb3Jkb21vQHZnZXIua2VybmVsLm9yZw0KPiBNb3Jl IG1ham9yZG9tbyBpbmZvIGF0ICBodHRwOi8vdmdlci5rZXJuZWwub3JnL21ham9yZG9tby1pbmZv Lmh0bWwNCg==
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html