@@ -1958,14 +1958,10 @@ static struct cm_id_private * cm_match_req(struct cm_work *work,
1958
1958
cm_issue_rej (work -> port , work -> mad_recv_wc ,
1959
1959
IB_CM_REJ_INVALID_SERVICE_ID , CM_MSG_RESPONSE_REQ ,
1960
1960
NULL , 0 );
1961
- goto out ;
1961
+ return NULL ;
1962
1962
}
1963
1963
refcount_inc (& listen_cm_id_priv -> refcount );
1964
- refcount_inc (& cm_id_priv -> refcount );
1965
- cm_id_priv -> id .state = IB_CM_REQ_RCVD ;
1966
- atomic_inc (& cm_id_priv -> work_count );
1967
1964
spin_unlock_irq (& cm .lock );
1968
- out :
1969
1965
return listen_cm_id_priv ;
1970
1966
}
1971
1967
@@ -2007,7 +2003,6 @@ static void cm_process_routed_req(struct cm_req_msg *req_msg, struct ib_wc *wc)
2007
2003
2008
2004
static int cm_req_handler (struct cm_work * work )
2009
2005
{
2010
- struct ib_cm_id * cm_id ;
2011
2006
struct cm_id_private * cm_id_priv , * listen_cm_id_priv ;
2012
2007
struct cm_req_msg * req_msg ;
2013
2008
const struct ib_global_route * grh ;
@@ -2016,13 +2011,33 @@ static int cm_req_handler(struct cm_work *work)
2016
2011
2017
2012
req_msg = (struct cm_req_msg * )work -> mad_recv_wc -> recv_buf .mad ;
2018
2013
2019
- cm_id = ib_create_cm_id (work -> port -> cm_dev -> ib_device , NULL , NULL );
2020
- if (IS_ERR (cm_id ))
2021
- return PTR_ERR (cm_id );
2014
+ cm_id_priv =
2015
+ cm_alloc_id_priv (work -> port -> cm_dev -> ib_device , NULL , NULL );
2016
+ if (IS_ERR (cm_id_priv ))
2017
+ return PTR_ERR (cm_id_priv );
2022
2018
2023
- cm_id_priv = container_of (cm_id , struct cm_id_private , id );
2024
2019
cm_id_priv -> id .remote_id =
2025
2020
cpu_to_be32 (IBA_GET (CM_REQ_LOCAL_COMM_ID , req_msg ));
2021
+ cm_id_priv -> id .service_id =
2022
+ cpu_to_be64 (IBA_GET (CM_REQ_SERVICE_ID , req_msg ));
2023
+ cm_id_priv -> id .service_mask = ~cpu_to_be64 (0 );
2024
+ cm_id_priv -> tid = req_msg -> hdr .tid ;
2025
+ cm_id_priv -> timeout_ms = cm_convert_to_ms (
2026
+ IBA_GET (CM_REQ_LOCAL_CM_RESPONSE_TIMEOUT , req_msg ));
2027
+ cm_id_priv -> max_cm_retries = IBA_GET (CM_REQ_MAX_CM_RETRIES , req_msg );
2028
+ cm_id_priv -> remote_qpn =
2029
+ cpu_to_be32 (IBA_GET (CM_REQ_LOCAL_QPN , req_msg ));
2030
+ cm_id_priv -> initiator_depth =
2031
+ IBA_GET (CM_REQ_RESPONDER_RESOURCES , req_msg );
2032
+ cm_id_priv -> responder_resources =
2033
+ IBA_GET (CM_REQ_INITIATOR_DEPTH , req_msg );
2034
+ cm_id_priv -> path_mtu = IBA_GET (CM_REQ_PATH_PACKET_PAYLOAD_MTU , req_msg );
2035
+ cm_id_priv -> pkey = cpu_to_be16 (IBA_GET (CM_REQ_PARTITION_KEY , req_msg ));
2036
+ cm_id_priv -> sq_psn = cpu_to_be32 (IBA_GET (CM_REQ_STARTING_PSN , req_msg ));
2037
+ cm_id_priv -> retry_count = IBA_GET (CM_REQ_RETRY_COUNT , req_msg );
2038
+ cm_id_priv -> rnr_retry_count = IBA_GET (CM_REQ_RNR_RETRY_COUNT , req_msg );
2039
+ cm_id_priv -> qp_type = cm_req_get_qp_type (req_msg );
2040
+
2026
2041
ret = cm_init_av_for_response (work -> port , work -> mad_recv_wc -> wc ,
2027
2042
work -> mad_recv_wc -> recv_buf .grh ,
2028
2043
& cm_id_priv -> av );
@@ -2034,27 +2049,26 @@ static int cm_req_handler(struct cm_work *work)
2034
2049
ret = PTR_ERR (cm_id_priv -> timewait_info );
2035
2050
goto destroy ;
2036
2051
}
2037
- cm_id_priv -> timewait_info -> work .remote_id =
2038
- cpu_to_be32 (IBA_GET (CM_REQ_LOCAL_COMM_ID , req_msg ));
2052
+ cm_id_priv -> timewait_info -> work .remote_id = cm_id_priv -> id .remote_id ;
2039
2053
cm_id_priv -> timewait_info -> remote_ca_guid =
2040
2054
cpu_to_be64 (IBA_GET (CM_REQ_LOCAL_CA_GUID , req_msg ));
2041
- cm_id_priv -> timewait_info -> remote_qpn =
2042
- cpu_to_be32 (IBA_GET (CM_REQ_LOCAL_QPN , req_msg ));
2055
+ cm_id_priv -> timewait_info -> remote_qpn = cm_id_priv -> remote_qpn ;
2056
+
2057
+ /*
2058
+ * Note that the ID pointer is not in the xarray at this point,
2059
+ * so this set is only visible to the local thread.
2060
+ */
2061
+ cm_id_priv -> id .state = IB_CM_REQ_RCVD ;
2043
2062
2044
2063
listen_cm_id_priv = cm_match_req (work , cm_id_priv );
2045
2064
if (!listen_cm_id_priv ) {
2046
2065
pr_debug ("%s: local_id %d, no listen_cm_id_priv\n" , __func__ ,
2047
- be32_to_cpu (cm_id -> local_id ));
2066
+ be32_to_cpu (cm_id_priv -> id .local_id ));
2067
+ cm_id_priv -> id .state = IB_CM_IDLE ;
2048
2068
ret = - EINVAL ;
2049
2069
goto destroy ;
2050
2070
}
2051
2071
2052
- cm_id_priv -> id .cm_handler = listen_cm_id_priv -> id .cm_handler ;
2053
- cm_id_priv -> id .context = listen_cm_id_priv -> id .context ;
2054
- cm_id_priv -> id .service_id =
2055
- cpu_to_be64 (IBA_GET (CM_REQ_SERVICE_ID , req_msg ));
2056
- cm_id_priv -> id .service_mask = ~cpu_to_be64 (0 );
2057
-
2058
2072
cm_process_routed_req (req_msg , work -> mad_recv_wc -> wc );
2059
2073
2060
2074
memset (& work -> path [0 ], 0 , sizeof (work -> path [0 ]));
@@ -2092,10 +2106,10 @@ static int cm_req_handler(struct cm_work *work)
2092
2106
work -> port -> port_num , 0 ,
2093
2107
& work -> path [0 ].sgid );
2094
2108
if (err )
2095
- ib_send_cm_rej (cm_id , IB_CM_REJ_INVALID_GID ,
2109
+ ib_send_cm_rej (& cm_id_priv -> id , IB_CM_REJ_INVALID_GID ,
2096
2110
NULL , 0 , NULL , 0 );
2097
2111
else
2098
- ib_send_cm_rej (cm_id , IB_CM_REJ_INVALID_GID ,
2112
+ ib_send_cm_rej (& cm_id_priv -> id , IB_CM_REJ_INVALID_GID ,
2099
2113
& work -> path [0 ].sgid ,
2100
2114
sizeof (work -> path [0 ].sgid ),
2101
2115
NULL , 0 );
@@ -2105,39 +2119,40 @@ static int cm_req_handler(struct cm_work *work)
2105
2119
ret = cm_init_av_by_path (& work -> path [1 ], NULL ,
2106
2120
& cm_id_priv -> alt_av , cm_id_priv );
2107
2121
if (ret ) {
2108
- ib_send_cm_rej (cm_id , IB_CM_REJ_INVALID_ALT_GID ,
2122
+ ib_send_cm_rej (& cm_id_priv -> id ,
2123
+ IB_CM_REJ_INVALID_ALT_GID ,
2109
2124
& work -> path [0 ].sgid ,
2110
2125
sizeof (work -> path [0 ].sgid ), NULL , 0 );
2111
2126
goto rejected ;
2112
2127
}
2113
2128
}
2114
- cm_id_priv -> tid = req_msg -> hdr .tid ;
2115
- cm_id_priv -> timeout_ms = cm_convert_to_ms (
2116
- IBA_GET (CM_REQ_LOCAL_CM_RESPONSE_TIMEOUT , req_msg ));
2117
- cm_id_priv -> max_cm_retries = IBA_GET (CM_REQ_MAX_CM_RETRIES , req_msg );
2118
- cm_id_priv -> remote_qpn =
2119
- cpu_to_be32 (IBA_GET (CM_REQ_LOCAL_QPN , req_msg ));
2120
- cm_id_priv -> initiator_depth =
2121
- IBA_GET (CM_REQ_RESPONDER_RESOURCES , req_msg );
2122
- cm_id_priv -> responder_resources =
2123
- IBA_GET (CM_REQ_INITIATOR_DEPTH , req_msg );
2124
- cm_id_priv -> path_mtu = IBA_GET (CM_REQ_PATH_PACKET_PAYLOAD_MTU , req_msg );
2125
- cm_id_priv -> pkey = cpu_to_be16 (IBA_GET (CM_REQ_PARTITION_KEY , req_msg ));
2126
- cm_id_priv -> sq_psn = cpu_to_be32 (IBA_GET (CM_REQ_STARTING_PSN , req_msg ));
2127
- cm_id_priv -> retry_count = IBA_GET (CM_REQ_RETRY_COUNT , req_msg );
2128
- cm_id_priv -> rnr_retry_count = IBA_GET (CM_REQ_RNR_RETRY_COUNT , req_msg );
2129
- cm_id_priv -> qp_type = cm_req_get_qp_type (req_msg );
2130
2129
2130
+ cm_id_priv -> id .cm_handler = listen_cm_id_priv -> id .cm_handler ;
2131
+ cm_id_priv -> id .context = listen_cm_id_priv -> id .context ;
2131
2132
cm_format_req_event (work , cm_id_priv , & listen_cm_id_priv -> id );
2133
+
2134
+ /* Now MAD handlers can see the new ID */
2135
+ spin_lock_irq (& cm_id_priv -> lock );
2136
+ cm_finalize_id (cm_id_priv );
2137
+
2138
+ /* Refcount belongs to the event, pairs with cm_process_work() */
2139
+ refcount_inc (& cm_id_priv -> refcount );
2140
+ atomic_inc (& cm_id_priv -> work_count );
2141
+ spin_unlock_irq (& cm_id_priv -> lock );
2132
2142
cm_process_work (cm_id_priv , work );
2143
+ /*
2144
+ * Since this ID was just created and was not made visible to other MAD
2145
+ * handlers until the cm_finalize_id() above we know that the
2146
+ * cm_process_work() will deliver the event and the listen_cm_id
2147
+ * embedded in the event can be derefed here.
2148
+ */
2133
2149
cm_deref_id (listen_cm_id_priv );
2134
2150
return 0 ;
2135
2151
2136
2152
rejected :
2137
- refcount_dec (& cm_id_priv -> refcount );
2138
2153
cm_deref_id (listen_cm_id_priv );
2139
2154
destroy :
2140
- ib_destroy_cm_id (cm_id );
2155
+ ib_destroy_cm_id (& cm_id_priv -> id );
2141
2156
return ret ;
2142
2157
}
2143
2158
0 commit comments