Skip to content

Commit dd91b5e

Browse files
committed
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
Pull rdma updates from Jason Gunthorpe: "Usual collection of driver fixes: - Small bug fixes and cleansup in hfi, hns, rxe, mlx5, mana siw - Further ODP functionality in rxe - Remote access MRs in mana, along with more page sizes - Improve CM scalability with a rwlock around the agent - More trace points for hns - ODP hmm conversion to the new two step dma API - Support the ethernet HW device in mana as well as the RNIC - Cleanups: - Use secs_to_jiffies() when appropriate - Use ERR_CAST() instead of naked casts - Don't use %pK in printk - Unusued functions removed - Allocation type matching" * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma: (57 commits) RDMA/cma: Fix hang when cma_netevent_callback fails to queue_work RDMA/bnxt_re: Support extended stats for Thor2 VF RDMA/hns: Fix endian issue in trace events RDMA/mlx5: Avoid flexible array warning IB/cm: Remove dead code and adjust naming RDMA/core: Avoid hmm_dma_map_alloc() for virtual DMA devices RDMA/rxe: Break endless pagefault loop for RO pages RDMA/bnxt_re: Fix return code of bnxt_re_configure_cc RDMA/bnxt_re: Fix missing error handling for tx_queue RDMA/bnxt_re: Fix incorrect display of inactivity_cp in debugfs output RDMA/mlx5: Add support for 200Gbps per lane speeds RDMA/mlx5: Remove the redundant MLX5_IB_STAGE_UAR stage RDMA/iwcm: Fix use-after-free of work objects after cm_id destruction net: mana: Add support for auxiliary device servicing events RDMA/mana_ib: unify mana_ib functions to support any gdma device RDMA/mana_ib: Add support of mana_ib for RNIC and ETH nic net: mana: Probe rdma device in mana driver RDMA/siw: replace redundant ternary operator with just rv RDMA/umem: Separate implicit ODP initialization from explicit ODP RDMA/core: Convert UMEM ODP DMA mapping to caching IOVA and page linkage ...
2 parents 883e3c9 + 92a251c commit dd91b5e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+1484
-772
lines changed

drivers/infiniband/core/cm.c

Lines changed: 20 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ MODULE_LICENSE("Dual BSD/GPL");
3636

3737
#define CM_DESTROY_ID_WAIT_TIMEOUT 10000 /* msecs */
3838
#define CM_DIRECT_RETRY_CTX ((void *) 1UL)
39+
#define CM_MRA_SETTING 24 /* 4.096us * 2^24 = ~68.7 seconds */
3940

4041
static const char * const ibcm_rej_reason_strs[] = {
4142
[IB_CM_REJ_NO_QP] = "no QP",
@@ -167,7 +168,7 @@ struct cm_port {
167168
struct cm_device {
168169
struct kref kref;
169170
struct list_head list;
170-
spinlock_t mad_agent_lock;
171+
rwlock_t mad_agent_lock;
171172
struct ib_device *ib_device;
172173
u8 ack_delay;
173174
int going_down;
@@ -241,7 +242,6 @@ struct cm_id_private {
241242
u8 initiator_depth;
242243
u8 retry_count;
243244
u8 rnr_retry_count;
244-
u8 service_timeout;
245245
u8 target_ack_delay;
246246

247247
struct list_head work_list;
@@ -285,7 +285,7 @@ static struct ib_mad_send_buf *cm_alloc_msg(struct cm_id_private *cm_id_priv)
285285
if (!cm_id_priv->av.port)
286286
return ERR_PTR(-EINVAL);
287287

288-
spin_lock(&cm_id_priv->av.port->cm_dev->mad_agent_lock);
288+
read_lock(&cm_id_priv->av.port->cm_dev->mad_agent_lock);
289289
mad_agent = cm_id_priv->av.port->mad_agent;
290290
if (!mad_agent) {
291291
m = ERR_PTR(-EINVAL);
@@ -311,7 +311,7 @@ static struct ib_mad_send_buf *cm_alloc_msg(struct cm_id_private *cm_id_priv)
311311
m->ah = ah;
312312

313313
out:
314-
spin_unlock(&cm_id_priv->av.port->cm_dev->mad_agent_lock);
314+
read_unlock(&cm_id_priv->av.port->cm_dev->mad_agent_lock);
315315
return m;
316316
}
317317

@@ -1297,10 +1297,10 @@ static __be64 cm_form_tid(struct cm_id_private *cm_id_priv)
12971297
if (!cm_id_priv->av.port)
12981298
return cpu_to_be64(low_tid);
12991299

1300-
spin_lock(&cm_id_priv->av.port->cm_dev->mad_agent_lock);
1300+
read_lock(&cm_id_priv->av.port->cm_dev->mad_agent_lock);
13011301
if (cm_id_priv->av.port->mad_agent)
13021302
hi_tid = ((u64)cm_id_priv->av.port->mad_agent->hi_tid) << 32;
1303-
spin_unlock(&cm_id_priv->av.port->cm_dev->mad_agent_lock);
1303+
read_unlock(&cm_id_priv->av.port->cm_dev->mad_agent_lock);
13041304
return cpu_to_be64(hi_tid | low_tid);
13051305
}
13061306

@@ -1872,7 +1872,7 @@ static void cm_process_work(struct cm_id_private *cm_id_priv,
18721872

18731873
static void cm_format_mra(struct cm_mra_msg *mra_msg,
18741874
struct cm_id_private *cm_id_priv,
1875-
enum cm_msg_response msg_mraed, u8 service_timeout,
1875+
enum cm_msg_response msg_mraed,
18761876
const void *private_data, u8 private_data_len)
18771877
{
18781878
cm_format_mad_hdr(&mra_msg->hdr, CM_MRA_ATTR_ID, cm_id_priv->tid);
@@ -1881,7 +1881,7 @@ static void cm_format_mra(struct cm_mra_msg *mra_msg,
18811881
be32_to_cpu(cm_id_priv->id.local_id));
18821882
IBA_SET(CM_MRA_REMOTE_COMM_ID, mra_msg,
18831883
be32_to_cpu(cm_id_priv->id.remote_id));
1884-
IBA_SET(CM_MRA_SERVICE_TIMEOUT, mra_msg, service_timeout);
1884+
IBA_SET(CM_MRA_SERVICE_TIMEOUT, mra_msg, CM_MRA_SETTING);
18851885

18861886
if (private_data && private_data_len)
18871887
IBA_SET_MEM(CM_MRA_PRIVATE_DATA, mra_msg, private_data,
@@ -1960,7 +1960,7 @@ static void cm_dup_req_handler(struct cm_work *work,
19601960
switch (cm_id_priv->id.state) {
19611961
case IB_CM_MRA_REQ_SENT:
19621962
cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv,
1963-
CM_MSG_RESPONSE_REQ, cm_id_priv->service_timeout,
1963+
CM_MSG_RESPONSE_REQ,
19641964
cm_id_priv->private_data,
19651965
cm_id_priv->private_data_len);
19661966
break;
@@ -2454,7 +2454,7 @@ static void cm_dup_rep_handler(struct cm_work *work)
24542454
cm_id_priv->private_data_len);
24552455
else if (cm_id_priv->id.state == IB_CM_MRA_REP_SENT)
24562456
cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv,
2457-
CM_MSG_RESPONSE_REP, cm_id_priv->service_timeout,
2457+
CM_MSG_RESPONSE_REP,
24582458
cm_id_priv->private_data,
24592459
cm_id_priv->private_data_len);
24602460
else
@@ -3094,26 +3094,13 @@ static int cm_rej_handler(struct cm_work *work)
30943094
return -EINVAL;
30953095
}
30963096

3097-
int ib_send_cm_mra(struct ib_cm_id *cm_id,
3098-
u8 service_timeout,
3099-
const void *private_data,
3100-
u8 private_data_len)
3097+
int ib_prepare_cm_mra(struct ib_cm_id *cm_id)
31013098
{
31023099
struct cm_id_private *cm_id_priv;
3103-
struct ib_mad_send_buf *msg;
31043100
enum ib_cm_state cm_state;
31053101
enum ib_cm_lap_state lap_state;
3106-
enum cm_msg_response msg_response;
3107-
void *data;
31083102
unsigned long flags;
3109-
int ret;
3110-
3111-
if (private_data && private_data_len > IB_CM_MRA_PRIVATE_DATA_SIZE)
3112-
return -EINVAL;
3113-
3114-
data = cm_copy_private_data(private_data, private_data_len);
3115-
if (IS_ERR(data))
3116-
return PTR_ERR(data);
3103+
int ret = 0;
31173104

31183105
cm_id_priv = container_of(cm_id, struct cm_id_private, id);
31193106

@@ -3122,58 +3109,33 @@ int ib_send_cm_mra(struct ib_cm_id *cm_id,
31223109
case IB_CM_REQ_RCVD:
31233110
cm_state = IB_CM_MRA_REQ_SENT;
31243111
lap_state = cm_id->lap_state;
3125-
msg_response = CM_MSG_RESPONSE_REQ;
31263112
break;
31273113
case IB_CM_REP_RCVD:
31283114
cm_state = IB_CM_MRA_REP_SENT;
31293115
lap_state = cm_id->lap_state;
3130-
msg_response = CM_MSG_RESPONSE_REP;
31313116
break;
31323117
case IB_CM_ESTABLISHED:
31333118
if (cm_id->lap_state == IB_CM_LAP_RCVD) {
31343119
cm_state = cm_id->state;
31353120
lap_state = IB_CM_MRA_LAP_SENT;
3136-
msg_response = CM_MSG_RESPONSE_OTHER;
31373121
break;
31383122
}
31393123
fallthrough;
31403124
default:
3141-
trace_icm_send_mra_unknown_err(&cm_id_priv->id);
3125+
trace_icm_prepare_mra_unknown_err(&cm_id_priv->id);
31423126
ret = -EINVAL;
31433127
goto error_unlock;
31443128
}
31453129

3146-
if (!(service_timeout & IB_CM_MRA_FLAG_DELAY)) {
3147-
msg = cm_alloc_msg(cm_id_priv);
3148-
if (IS_ERR(msg)) {
3149-
ret = PTR_ERR(msg);
3150-
goto error_unlock;
3151-
}
3152-
3153-
cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv,
3154-
msg_response, service_timeout,
3155-
private_data, private_data_len);
3156-
trace_icm_send_mra(cm_id);
3157-
ret = ib_post_send_mad(msg, NULL);
3158-
if (ret)
3159-
goto error_free_msg;
3160-
}
3161-
31623130
cm_id->state = cm_state;
31633131
cm_id->lap_state = lap_state;
3164-
cm_id_priv->service_timeout = service_timeout;
3165-
cm_set_private_data(cm_id_priv, data, private_data_len);
3166-
spin_unlock_irqrestore(&cm_id_priv->lock, flags);
3167-
return 0;
3132+
cm_set_private_data(cm_id_priv, NULL, 0);
31683133

3169-
error_free_msg:
3170-
cm_free_msg(msg);
31713134
error_unlock:
31723135
spin_unlock_irqrestore(&cm_id_priv->lock, flags);
3173-
kfree(data);
31743136
return ret;
31753137
}
3176-
EXPORT_SYMBOL(ib_send_cm_mra);
3138+
EXPORT_SYMBOL(ib_prepare_cm_mra);
31773139

31783140
static struct cm_id_private *cm_acquire_mraed_id(struct cm_mra_msg *mra_msg)
31793141
{
@@ -3377,7 +3339,6 @@ static int cm_lap_handler(struct cm_work *work)
33773339

33783340
cm_format_mra((struct cm_mra_msg *) msg->mad, cm_id_priv,
33793341
CM_MSG_RESPONSE_OTHER,
3380-
cm_id_priv->service_timeout,
33813342
cm_id_priv->private_data,
33823343
cm_id_priv->private_data_len);
33833344
spin_unlock_irq(&cm_id_priv->lock);
@@ -3786,7 +3747,8 @@ static void cm_process_send_error(struct cm_id_private *cm_id_priv,
37863747
spin_lock_irq(&cm_id_priv->lock);
37873748
if (msg != cm_id_priv->msg) {
37883749
spin_unlock_irq(&cm_id_priv->lock);
3789-
cm_free_priv_msg(msg);
3750+
cm_free_msg(msg);
3751+
cm_deref_id(cm_id_priv);
37903752
return;
37913753
}
37923754
cm_free_priv_msg(msg);
@@ -4378,7 +4340,7 @@ static int cm_add_one(struct ib_device *ib_device)
43784340
return -ENOMEM;
43794341

43804342
kref_init(&cm_dev->kref);
4381-
spin_lock_init(&cm_dev->mad_agent_lock);
4343+
rwlock_init(&cm_dev->mad_agent_lock);
43824344
cm_dev->ib_device = ib_device;
43834345
cm_dev->ack_delay = ib_device->attrs.local_ca_ack_delay;
43844346
cm_dev->going_down = 0;
@@ -4494,9 +4456,9 @@ static void cm_remove_one(struct ib_device *ib_device, void *client_data)
44944456
* The above ensures no call paths from the work are running,
44954457
* the remaining paths all take the mad_agent_lock.
44964458
*/
4497-
spin_lock(&cm_dev->mad_agent_lock);
4459+
write_lock(&cm_dev->mad_agent_lock);
44984460
port->mad_agent = NULL;
4499-
spin_unlock(&cm_dev->mad_agent_lock);
4461+
write_unlock(&cm_dev->mad_agent_lock);
45004462
ib_unregister_mad_agent(mad_agent);
45014463
ib_port_unregister_client_groups(ib_device, i,
45024464
cm_counter_groups);

drivers/infiniband/core/cm_trace.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ DEFINE_CM_ERR_EVENT(send_drep);
229229
DEFINE_CM_ERR_EVENT(dreq_unknown);
230230
DEFINE_CM_ERR_EVENT(send_unknown_rej);
231231
DEFINE_CM_ERR_EVENT(rej_unknown);
232-
DEFINE_CM_ERR_EVENT(send_mra_unknown);
232+
DEFINE_CM_ERR_EVENT(prepare_mra_unknown);
233233
DEFINE_CM_ERR_EVENT(mra_unknown);
234234
DEFINE_CM_ERR_EVENT(qp_init);
235235
DEFINE_CM_ERR_EVENT(qp_rtr);

drivers/infiniband/core/cma.c

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ MODULE_LICENSE("Dual BSD/GPL");
4646

4747
#define CMA_CM_RESPONSE_TIMEOUT 20
4848
#define CMA_MAX_CM_RETRIES 15
49-
#define CMA_CM_MRA_SETTING (IB_CM_MRA_FLAG_DELAY | 24)
5049
#define CMA_IBOE_PACKET_LIFETIME 16
5150
#define CMA_PREFERRED_ROCE_GID_TYPE IB_GID_TYPE_ROCE_UDP_ENCAP
5251

@@ -146,19 +145,6 @@ struct iw_cm_id *rdma_iw_cm_id(struct rdma_cm_id *id)
146145
}
147146
EXPORT_SYMBOL(rdma_iw_cm_id);
148147

149-
/**
150-
* rdma_res_to_id() - return the rdma_cm_id pointer for this restrack.
151-
* @res: rdma resource tracking entry pointer
152-
*/
153-
struct rdma_cm_id *rdma_res_to_id(struct rdma_restrack_entry *res)
154-
{
155-
struct rdma_id_private *id_priv =
156-
container_of(res, struct rdma_id_private, res);
157-
158-
return &id_priv->id;
159-
}
160-
EXPORT_SYMBOL(rdma_res_to_id);
161-
162148
static int cma_add_one(struct ib_device *device);
163149
static void cma_remove_one(struct ib_device *device, void *client_data);
164150

@@ -2214,8 +2200,8 @@ static int cma_ib_handler(struct ib_cm_id *cm_id,
22142200
case IB_CM_REP_RECEIVED:
22152201
if (state == RDMA_CM_CONNECT &&
22162202
(id_priv->id.qp_type != IB_QPT_UD)) {
2217-
trace_cm_send_mra(id_priv);
2218-
ib_send_cm_mra(cm_id, CMA_CM_MRA_SETTING, NULL, 0);
2203+
trace_cm_prepare_mra(id_priv);
2204+
ib_prepare_cm_mra(cm_id);
22192205
}
22202206
if (id_priv->id.qp) {
22212207
event.status = cma_rep_recv(id_priv);
@@ -2476,8 +2462,8 @@ static int cma_ib_req_handler(struct ib_cm_id *cm_id,
24762462

24772463
if (READ_ONCE(conn_id->state) == RDMA_CM_CONNECT &&
24782464
conn_id->id.qp_type != IB_QPT_UD) {
2479-
trace_cm_send_mra(cm_id->context);
2480-
ib_send_cm_mra(cm_id, CMA_CM_MRA_SETTING, NULL, 0);
2465+
trace_cm_prepare_mra(cm_id->context);
2466+
ib_prepare_cm_mra(cm_id);
24812467
}
24822468
mutex_unlock(&conn_id->handler_mutex);
24832469

@@ -5245,7 +5231,8 @@ static int cma_netevent_callback(struct notifier_block *self,
52455231
neigh->ha, ETH_ALEN))
52465232
continue;
52475233
cma_id_get(current_id);
5248-
queue_work(cma_wq, &current_id->id.net_work);
5234+
if (!queue_work(cma_wq, &current_id->id.net_work))
5235+
cma_id_put(current_id);
52495236
}
52505237
out:
52515238
spin_unlock_irqrestore(&id_table_lock, flags);

drivers/infiniband/core/cma_trace.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ DECLARE_EVENT_CLASS(cma_fsm_class,
5555

5656
DEFINE_CMA_FSM_EVENT(send_rtu);
5757
DEFINE_CMA_FSM_EVENT(send_rej);
58-
DEFINE_CMA_FSM_EVENT(send_mra);
58+
DEFINE_CMA_FSM_EVENT(prepare_mra);
5959
DEFINE_CMA_FSM_EVENT(send_sidr_req);
6060
DEFINE_CMA_FSM_EVENT(send_sidr_rep);
6161
DEFINE_CMA_FSM_EVENT(disconnect);

drivers/infiniband/core/iwcm.c

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -368,12 +368,9 @@ EXPORT_SYMBOL(iw_cm_disconnect);
368368
/*
369369
* CM_ID <-- DESTROYING
370370
*
371-
* Clean up all resources associated with the connection and release
372-
* the initial reference taken by iw_create_cm_id.
373-
*
374-
* Returns true if and only if the last cm_id_priv reference has been dropped.
371+
* Clean up all resources associated with the connection.
375372
*/
376-
static bool destroy_cm_id(struct iw_cm_id *cm_id)
373+
static void destroy_cm_id(struct iw_cm_id *cm_id)
377374
{
378375
struct iwcm_id_private *cm_id_priv;
379376
struct ib_qp *qp;
@@ -442,20 +439,22 @@ static bool destroy_cm_id(struct iw_cm_id *cm_id)
442439
iwpm_remove_mapinfo(&cm_id->local_addr, &cm_id->m_local_addr);
443440
iwpm_remove_mapping(&cm_id->local_addr, RDMA_NL_IWCM);
444441
}
445-
446-
return iwcm_deref_id(cm_id_priv);
447442
}
448443

449444
/*
450-
* This function is only called by the application thread and cannot
451-
* be called by the event thread. The function will wait for all
452-
* references to be released on the cm_id and then kfree the cm_id
453-
* object.
445+
* Destroy cm_id. If the cm_id still has other references, wait for all
446+
* references to be released on the cm_id and then release the initial
447+
* reference taken by iw_create_cm_id.
454448
*/
455449
void iw_destroy_cm_id(struct iw_cm_id *cm_id)
456450
{
457-
if (!destroy_cm_id(cm_id))
451+
struct iwcm_id_private *cm_id_priv;
452+
453+
cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
454+
destroy_cm_id(cm_id);
455+
if (refcount_read(&cm_id_priv->refcount) > 1)
458456
flush_workqueue(iwcm_wq);
457+
iwcm_deref_id(cm_id_priv);
459458
}
460459
EXPORT_SYMBOL(iw_destroy_cm_id);
461460

@@ -1035,8 +1034,10 @@ static void cm_work_handler(struct work_struct *_work)
10351034

10361035
if (!test_bit(IWCM_F_DROP_EVENTS, &cm_id_priv->flags)) {
10371036
ret = process_event(cm_id_priv, &levent);
1038-
if (ret)
1039-
WARN_ON_ONCE(destroy_cm_id(&cm_id_priv->id));
1037+
if (ret) {
1038+
destroy_cm_id(&cm_id_priv->id);
1039+
WARN_ON_ONCE(iwcm_deref_id(cm_id_priv));
1040+
}
10401041
} else
10411042
pr_debug("dropping event %d\n", levent.event);
10421043
if (iwcm_deref_id(cm_id_priv))

drivers/infiniband/core/mad_rmpp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ static struct ib_mad_send_buf *alloc_response_msg(struct ib_mad_agent *agent,
158158
ah = ib_create_ah_from_wc(agent->qp->pd, recv_wc->wc,
159159
recv_wc->recv_buf.grh, agent->port_num);
160160
if (IS_ERR(ah))
161-
return (void *) ah;
161+
return ERR_CAST(ah);
162162

163163
hdr_len = ib_get_mad_data_offset(recv_wc->recv_buf.mad->mad_hdr.mgmt_class);
164164
msg = ib_create_send_mad(agent, recv_wc->wc->src_qp,

0 commit comments

Comments
 (0)