Commit 9767a27e authored by Jason Gunthorpe's avatar Jason Gunthorpe

RDMA/cm: Pass the cm_id_private into cm_cleanup_timewait

Also rename it to cm_remove_remote(). This function now removes the
tracking of the remote ID/QPN in the redblack trees from a cm_id_private.

Replace a open-coded version with a call. The open coded version was
deleting only the remote_id, however at this call site the qpn can not
have been in the RB tree either, so the cm_remove_remote() will do the
same.

Link: https://lore.kernel.org/r/20200506074701.9775-6-leon@kernel.orgSigned-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent e83f195a
...@@ -964,8 +964,10 @@ static u8 cm_ack_timeout(u8 ca_ack_delay, u8 packet_life_time) ...@@ -964,8 +964,10 @@ static u8 cm_ack_timeout(u8 ca_ack_delay, u8 packet_life_time)
return min(31, ack_timeout); return min(31, ack_timeout);
} }
static void cm_cleanup_timewait(struct cm_timewait_info *timewait_info) static void cm_remove_remote(struct cm_id_private *cm_id_priv)
{ {
struct cm_timewait_info *timewait_info = cm_id_priv->timewait_info;
if (timewait_info->inserted_remote_id) { if (timewait_info->inserted_remote_id) {
rb_erase(&timewait_info->remote_id_node, &cm.remote_id_table); rb_erase(&timewait_info->remote_id_node, &cm.remote_id_table);
timewait_info->inserted_remote_id = 0; timewait_info->inserted_remote_id = 0;
...@@ -1004,7 +1006,7 @@ static void cm_enter_timewait(struct cm_id_private *cm_id_priv) ...@@ -1004,7 +1006,7 @@ static void cm_enter_timewait(struct cm_id_private *cm_id_priv)
return; return;
spin_lock_irqsave(&cm.lock, flags); spin_lock_irqsave(&cm.lock, flags);
cm_cleanup_timewait(cm_id_priv->timewait_info); cm_remove_remote(cm_id_priv);
list_add_tail(&cm_id_priv->timewait_info->list, &cm.timewait_list); list_add_tail(&cm_id_priv->timewait_info->list, &cm.timewait_list);
spin_unlock_irqrestore(&cm.lock, flags); spin_unlock_irqrestore(&cm.lock, flags);
...@@ -1035,7 +1037,7 @@ static void cm_reset_to_idle(struct cm_id_private *cm_id_priv) ...@@ -1035,7 +1037,7 @@ static void cm_reset_to_idle(struct cm_id_private *cm_id_priv)
cm_id_priv->id.state = IB_CM_IDLE; cm_id_priv->id.state = IB_CM_IDLE;
if (cm_id_priv->timewait_info) { if (cm_id_priv->timewait_info) {
spin_lock_irqsave(&cm.lock, flags); spin_lock_irqsave(&cm.lock, flags);
cm_cleanup_timewait(cm_id_priv->timewait_info); cm_remove_remote(cm_id_priv);
spin_unlock_irqrestore(&cm.lock, flags); spin_unlock_irqrestore(&cm.lock, flags);
kfree(cm_id_priv->timewait_info); kfree(cm_id_priv->timewait_info);
cm_id_priv->timewait_info = NULL; cm_id_priv->timewait_info = NULL;
...@@ -1136,7 +1138,7 @@ static void cm_destroy_id(struct ib_cm_id *cm_id, int err) ...@@ -1136,7 +1138,7 @@ static void cm_destroy_id(struct ib_cm_id *cm_id, int err)
spin_lock(&cm.lock); spin_lock(&cm.lock);
/* Required for cleanup paths related cm_req_handler() */ /* Required for cleanup paths related cm_req_handler() */
if (cm_id_priv->timewait_info) { if (cm_id_priv->timewait_info) {
cm_cleanup_timewait(cm_id_priv->timewait_info); cm_remove_remote(cm_id_priv);
kfree(cm_id_priv->timewait_info); kfree(cm_id_priv->timewait_info);
cm_id_priv->timewait_info = NULL; cm_id_priv->timewait_info = NULL;
} }
...@@ -1971,7 +1973,7 @@ static struct cm_id_private * cm_match_req(struct cm_work *work, ...@@ -1971,7 +1973,7 @@ static struct cm_id_private * cm_match_req(struct cm_work *work,
/* Check for stale connections. */ /* Check for stale connections. */
timewait_info = cm_insert_remote_qpn(cm_id_priv->timewait_info); timewait_info = cm_insert_remote_qpn(cm_id_priv->timewait_info);
if (timewait_info) { if (timewait_info) {
cm_cleanup_timewait(cm_id_priv->timewait_info); cm_remove_remote(cm_id_priv);
cur_cm_id_priv = cm_acquire_id(timewait_info->work.local_id, cur_cm_id_priv = cm_acquire_id(timewait_info->work.local_id,
timewait_info->work.remote_id); timewait_info->work.remote_id);
...@@ -1992,7 +1994,7 @@ static struct cm_id_private * cm_match_req(struct cm_work *work, ...@@ -1992,7 +1994,7 @@ static struct cm_id_private * cm_match_req(struct cm_work *work,
cm_id_priv->id.device, cm_id_priv->id.device,
cpu_to_be64(IBA_GET(CM_REQ_SERVICE_ID, req_msg))); cpu_to_be64(IBA_GET(CM_REQ_SERVICE_ID, req_msg)));
if (!listen_cm_id_priv) { if (!listen_cm_id_priv) {
cm_cleanup_timewait(cm_id_priv->timewait_info); cm_remove_remote(cm_id_priv);
spin_unlock_irq(&cm.lock); spin_unlock_irq(&cm.lock);
cm_issue_rej(work->port, work->mad_recv_wc, cm_issue_rej(work->port, work->mad_recv_wc,
IB_CM_REJ_INVALID_SERVICE_ID, CM_MSG_RESPONSE_REQ, IB_CM_REJ_INVALID_SERVICE_ID, CM_MSG_RESPONSE_REQ,
...@@ -2475,9 +2477,7 @@ static int cm_rep_handler(struct cm_work *work) ...@@ -2475,9 +2477,7 @@ static int cm_rep_handler(struct cm_work *work)
/* Check for a stale connection. */ /* Check for a stale connection. */
timewait_info = cm_insert_remote_qpn(cm_id_priv->timewait_info); timewait_info = cm_insert_remote_qpn(cm_id_priv->timewait_info);
if (timewait_info) { if (timewait_info) {
rb_erase(&cm_id_priv->timewait_info->remote_id_node, cm_remove_remote(cm_id_priv);
&cm.remote_id_table);
cm_id_priv->timewait_info->inserted_remote_id = 0;
cur_cm_id_priv = cm_acquire_id(timewait_info->work.local_id, cur_cm_id_priv = cm_acquire_id(timewait_info->work.local_id,
timewait_info->work.remote_id); timewait_info->work.remote_id);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment