aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/infiniband/core/mad.c14
-rw-r--r--drivers/infiniband/core/mad_priv.h1
2 files changed, 13 insertions, 2 deletions
diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c
index d1898b30c345..7af8f7f87849 100644
--- a/drivers/infiniband/core/mad.c
+++ b/drivers/infiniband/core/mad.c
@@ -341,6 +341,7 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
341 spin_lock_init(&mad_agent_priv->lock); 341 spin_lock_init(&mad_agent_priv->lock);
342 INIT_LIST_HEAD(&mad_agent_priv->send_list); 342 INIT_LIST_HEAD(&mad_agent_priv->send_list);
343 INIT_LIST_HEAD(&mad_agent_priv->wait_list); 343 INIT_LIST_HEAD(&mad_agent_priv->wait_list);
344 INIT_LIST_HEAD(&mad_agent_priv->done_list);
344 INIT_WORK(&mad_agent_priv->timed_work, timeout_sends, mad_agent_priv); 345 INIT_WORK(&mad_agent_priv->timed_work, timeout_sends, mad_agent_priv);
345 INIT_LIST_HEAD(&mad_agent_priv->local_list); 346 INIT_LIST_HEAD(&mad_agent_priv->local_list);
346 INIT_WORK(&mad_agent_priv->local_work, local_completions, 347 INIT_WORK(&mad_agent_priv->local_work, local_completions,
@@ -1559,6 +1560,16 @@ find_send_req(struct ib_mad_agent_private *mad_agent_priv,
1559 return NULL; 1560 return NULL;
1560} 1561}
1561 1562
1563static void ib_mark_req_done(struct ib_mad_send_wr_private *mad_send_wr)
1564{
1565 mad_send_wr->timeout = 0;
1566 if (mad_send_wr->refcount == 1) {
1567 list_del(&mad_send_wr->agent_list);
1568 list_add_tail(&mad_send_wr->agent_list,
1569 &mad_send_wr->mad_agent_priv->done_list);
1570 }
1571}
1572
1562static void ib_mad_complete_recv(struct ib_mad_agent_private *mad_agent_priv, 1573static void ib_mad_complete_recv(struct ib_mad_agent_private *mad_agent_priv,
1563 struct ib_mad_recv_wc *mad_recv_wc) 1574 struct ib_mad_recv_wc *mad_recv_wc)
1564{ 1575{
@@ -1580,8 +1591,7 @@ static void ib_mad_complete_recv(struct ib_mad_agent_private *mad_agent_priv,
1580 wake_up(&mad_agent_priv->wait); 1591 wake_up(&mad_agent_priv->wait);
1581 return; 1592 return;
1582 } 1593 }
1583 /* Timeout = 0 means that we won't wait for a response */ 1594 ib_mark_req_done(mad_send_wr);
1584 mad_send_wr->timeout = 0;
1585 spin_unlock_irqrestore(&mad_agent_priv->lock, flags); 1595 spin_unlock_irqrestore(&mad_agent_priv->lock, flags);
1586 1596
1587 /* Defined behavior is to complete response before request */ 1597 /* Defined behavior is to complete response before request */
diff --git a/drivers/infiniband/core/mad_priv.h b/drivers/infiniband/core/mad_priv.h
index 96f1b5b610c2..6fcab0009bb9 100644
--- a/drivers/infiniband/core/mad_priv.h
+++ b/drivers/infiniband/core/mad_priv.h
@@ -92,6 +92,7 @@ struct ib_mad_agent_private {
92 spinlock_t lock; 92 spinlock_t lock;
93 struct list_head send_list; 93 struct list_head send_list;
94 struct list_head wait_list; 94 struct list_head wait_list;
95 struct list_head done_list;
95 struct work_struct timed_work; 96 struct work_struct timed_work;
96 unsigned long timeout; 97 unsigned long timeout;
97 struct list_head local_list; 98 struct list_head local_list;