From: Bart Van Assche <bart.vanassche-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
To: Doug Ledford <dledford-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: Christoph Hellwig <hch-jcswGhMUV9g@public.gmane.org>,
"linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
<linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
Subject: [PATCH 12/15] IB/srpt: Eliminate srpt_find_channel()
Date: Tue, 5 Jan 2016 15:26:22 +0100 [thread overview]
Message-ID: <568BD28E.40302@sandisk.com> (raw)
In-Reply-To: <568BD0FC.70207-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
In 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.
Signed-off-by: Bart Van Assche <bart.vanassche-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
Cc: Christoph Hellwig <hch-jcswGhMUV9g@public.gmane.org>
---
drivers/infiniband/ulp/srpt/ib_srpt.c | 113 +++++++++++++---------------------
1 file changed, 43 insertions(+), 70 deletions(-)
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c
index 2ae3c1b..6ec130d 100644
--- a/drivers/infiniband/ulp/srpt/ib_srpt.c
+++ b/drivers/infiniband/ulp/srpt/ib_srpt.c
@@ -1893,25 +1893,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)
@@ -1925,34 +1914,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:
@@ -2160,6 +2121,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.
@@ -2304,10 +2266,23 @@ 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);
+ 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);
}
/**
@@ -2316,14 +2291,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;
@@ -2339,31 +2310,30 @@ static void srpt_cm_rtu_recv(struct ib_cm_id *cm_id)
}
}
-static void srpt_cm_timewait_exit(struct ib_cm_id *cm_id)
+static void srpt_cm_timewait_exit(struct srpt_rdma_ch *ch)
{
- 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);
}
-static void srpt_cm_rep_error(struct ib_cm_id *cm_id)
+static void srpt_cm_rep_error(struct srpt_rdma_ch *ch)
{
- 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);
}
/**
* 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) {
@@ -2391,10 +2361,10 @@ 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)
+static void srpt_cm_drep_recv(struct srpt_rdma_ch *ch)
{
- 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 cm_id %p.\n", ch->cm_id);
+ srpt_drain_channel(ch);
}
/**
@@ -2409,6 +2379,7 @@ static void srpt_cm_drep_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;
@@ -2418,23 +2389,25 @@ 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:
- srpt_cm_drep_recv(cm_id);
+ srpt_cm_drep_recv(ch);
break;
case IB_CM_TIMEWAIT_EXIT:
- srpt_cm_timewait_exit(cm_id);
+ srpt_cm_timewait_exit(ch);
break;
case IB_CM_REP_ERROR:
- srpt_cm_rep_error(cm_id);
+ srpt_cm_rep_error(ch);
break;
case IB_CM_DREQ_ERROR:
pr_info("Received IB DREQ ERROR event.\n");
--
2.1.4
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2016-01-05 14:26 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-05 14:19 [PATCH 00/15] Various ib_srpt patches Bart Van Assche
[not found] ` <568BD0FC.70207-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-05 14:20 ` [PATCH 01/15] IB/srpt: Add parentheses around sizeof argument Bart Van Assche
[not found] ` <568BD142.3070900-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-06 4:58 ` Christoph Hellwig
2016-01-06 13:58 ` Sagi Grimberg
2016-01-05 14:21 ` [PATCH 02/15] IB/srpt: Inline srpt_sdev_name() Bart Van Assche
[not found] ` <568BD15F.6010909-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-06 4:58 ` Christoph Hellwig
2016-01-06 13:58 ` Sagi Grimberg
2016-01-05 14:21 ` [PATCH 03/15] IB/srpt: Inline srpt_get_ch_state() Bart Van Assche
[not found] ` <568BD181.5040009-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-06 4:58 ` Christoph Hellwig
2016-01-06 13:59 ` Sagi Grimberg
2016-01-05 14:22 ` [PATCH 04/15] IB/srpt: Introduce target_reverse_dma_direction() Bart Van Assche
[not found] ` <568BD19C.6060404-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-06 4:59 ` Christoph Hellwig
2016-01-06 14:00 ` Sagi Grimberg
2016-01-05 14:22 ` [PATCH 05/15] IB/srpt: Use scsilun_to_int() Bart Van Assche
[not found] ` <568BD1B6.4090308-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-06 4:59 ` Christoph Hellwig
2016-01-06 14:01 ` Sagi Grimberg
2016-01-05 14:23 ` [PATCH 06/15] IB/srpt: Simplify srpt_handle_tsk_mgmt() Bart Van Assche
[not found] ` <568BD1D2.1030609-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-06 5:00 ` Christoph Hellwig
2016-01-06 14:02 ` Sagi Grimberg
2016-01-26 16:57 ` Estrin, Alex
[not found] ` <F3529576D8E232409F431C309E29399328F6B06A-8k97q/ur5Z1cIJlls4ac1rfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2016-01-26 17:32 ` Bart Van Assche
[not found] ` <56A7ADA3.5080507-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-26 18:35 ` Estrin, Alex
[not found] ` <F3529576D8E232409F431C309E29399328F6B0C3-8k97q/ur5Z1cIJlls4ac1rfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2016-01-26 18:46 ` Bart Van Assche
[not found] ` <56A7BF23.1060306-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-26 18:52 ` Estrin, Alex
2016-01-05 14:23 ` [PATCH 07/15] IB/srpt: Simplify channel state management Bart Van Assche
[not found] ` <568BD1F1.5050107-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-06 5:01 ` Christoph Hellwig
2016-01-06 14:08 ` Sagi Grimberg
2016-01-05 14:24 ` [PATCH 08/15] IB/srpt: Simplify srpt_shutdown_session() Bart Van Assche
[not found] ` <568BD20F.7020101-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-06 5:07 ` Christoph Hellwig
2016-01-06 14:13 ` Sagi Grimberg
2016-01-05 14:24 ` [PATCH 09/15] IB/srpt: Fix srpt_close_session() Bart Van Assche
[not found] ` <568BD231.10205-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-06 5:08 ` Christoph Hellwig
2016-01-06 14:21 ` Sagi Grimberg
[not found] ` <568D22F6.4050803-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
2016-01-06 14:34 ` Bart Van Assche
[not found] ` <568D25D9.3050809-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-06 14:46 ` Sagi Grimberg
2016-01-05 14:25 ` [PATCH 10/15] IB/srpt: Fix srpt_handle_cmd() error paths Bart Van Assche
[not found] ` <568BD249.1000100-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-06 5:09 ` Christoph Hellwig
2016-01-06 14:31 ` Sagi Grimberg
[not found] ` <568D2553.8050302-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
2016-01-06 14:36 ` Bart Van Assche
2016-01-05 14:25 ` [PATCH 11/15] IB/srpt: Fix how aborted commands are processed Bart Van Assche
[not found] ` <568BD26D.9080003-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-06 5:13 ` Christoph Hellwig
[not found] ` <20160106051305.GK15574-jcswGhMUV9g@public.gmane.org>
2016-01-06 13:30 ` Bart Van Assche
2016-01-05 14:26 ` Bart Van Assche [this message]
[not found] ` <568BD28E.40302-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-06 5:15 ` [PATCH 12/15] IB/srpt: Eliminate srpt_find_channel() Christoph Hellwig
2016-01-06 14:33 ` Sagi Grimberg
2016-01-05 14:26 ` [PATCH 13/15] IB/srpt: Detect session shutdown reliably Bart Van Assche
[not found] ` <568BD2A9.6070600-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-06 5:21 ` Christoph Hellwig
[not found] ` <20160106052138.GM15574-jcswGhMUV9g@public.gmane.org>
2016-01-06 13:34 ` Bart Van Assche
2016-01-06 14:39 ` Sagi Grimberg
[not found] ` <568D2707.9020309-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
2016-01-06 14:46 ` Bart Van Assche
[not found] ` <568D28CA.8010804-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-06 17:04 ` Christoph Hellwig
2016-01-05 14:27 ` [PATCH 14/15] IB/srpt: Fix srpt_write_pending() Bart Van Assche
[not found] ` <568BD2C2.6090808-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-06 5:22 ` Christoph Hellwig
2016-01-06 14:41 ` Sagi Grimberg
2016-01-05 14:27 ` [PATCH 15/15] IB/srpt: Fix a rare crash in srpt_close_session() Bart Van Assche
[not found] ` <568BD2E1.1060701-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2016-01-06 5:23 ` Christoph Hellwig
2016-01-06 14:47 ` Sagi Grimberg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=568BD28E.40302@sandisk.com \
--to=bart.vanassche-xdaiopvojttbdgjk7y7tuq@public.gmane.org \
--cc=dledford-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=hch-jcswGhMUV9g@public.gmane.org \
--cc=linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.