Skip to content

Commit bb3f889

Browse files
author
CKI KWF Bot
committed
Merge: CNB98: RDMA: Update to v6.16
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/7480 Description: This patch set updates the RDMA core and RDMA ULPs to upstream kernel v6.16. Depends: !7355 Upstream: Linus's master tree. Issues: JIRA: https://issues.redhat.com/browse/RHEL-110100 Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=69108556 Omitted-fix: 0b261d7 ("RDMA/rxe: Break endless pagefault loop for RO pages") Signed-off-by: Kamal Heib <kheib@redhat.com> Approved-by: Murphy Zhou <xzhou@redhat.com> Approved-by: José Ignacio Tornos Martínez <jtornosm@redhat.com> Approved-by: Rafael Aquini <raquini@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: CKI GitLab Kmaint Pipeline Bot <26919896-cki-kmaint-pipeline-bot@users.noreply.gitlab.com>
2 parents 3d698cc + 44affbf commit bb3f889

File tree

22 files changed

+545
-350
lines changed

22 files changed

+545
-350
lines changed

drivers/infiniband/core/cache.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -582,8 +582,8 @@ static int __ib_cache_gid_add(struct ib_device *ib_dev, u32 port,
582582
out_unlock:
583583
mutex_unlock(&table->lock);
584584
if (ret)
585-
pr_warn("%s: unable to add gid %pI6 error=%d\n",
586-
__func__, gid->raw, ret);
585+
pr_warn_ratelimited("%s: unable to add gid %pI6 error=%d\n",
586+
__func__, gid->raw, ret);
587587
return ret;
588588
}
589589

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

@@ -2200,8 +2186,8 @@ static int cma_ib_handler(struct ib_cm_id *cm_id,
22002186
case IB_CM_REP_RECEIVED:
22012187
if (state == RDMA_CM_CONNECT &&
22022188
(id_priv->id.qp_type != IB_QPT_UD)) {
2203-
trace_cm_send_mra(id_priv);
2204-
ib_send_cm_mra(cm_id, CMA_CM_MRA_SETTING, NULL, 0);
2189+
trace_cm_prepare_mra(id_priv);
2190+
ib_prepare_cm_mra(cm_id);
22052191
}
22062192
if (id_priv->id.qp) {
22072193
event.status = cma_rep_recv(id_priv);
@@ -2462,8 +2448,8 @@ static int cma_ib_req_handler(struct ib_cm_id *cm_id,
24622448

24632449
if (READ_ONCE(conn_id->state) == RDMA_CM_CONNECT &&
24642450
conn_id->id.qp_type != IB_QPT_UD) {
2465-
trace_cm_send_mra(cm_id->context);
2466-
ib_send_cm_mra(cm_id, CMA_CM_MRA_SETTING, NULL, 0);
2451+
trace_cm_prepare_mra(cm_id->context);
2452+
ib_prepare_cm_mra(cm_id);
24672453
}
24682454
mutex_unlock(&conn_id->handler_mutex);
24692455

@@ -5231,7 +5217,8 @@ static int cma_netevent_callback(struct notifier_block *self,
52315217
neigh->ha, ETH_ALEN))
52325218
continue;
52335219
cma_id_get(current_id);
5234-
queue_work(cma_wq, &current_id->id.net_work);
5220+
if (!queue_work(cma_wq, &current_id->id.net_work))
5221+
cma_id_put(current_id);
52355222
}
52365223
out:
52375224
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/device.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1352,6 +1352,9 @@ static void ib_device_notify_register(struct ib_device *device)
13521352

13531353
down_read(&devices_rwsem);
13541354

1355+
/* Mark for userspace that device is ready */
1356+
kobject_uevent(&device->dev.kobj, KOBJ_ADD);
1357+
13551358
ret = rdma_nl_notify_event(device, 0, RDMA_REGISTER_EVENT);
13561359
if (ret)
13571360
goto out;
@@ -1468,10 +1471,9 @@ int ib_register_device(struct ib_device *device, const char *name,
14681471
return ret;
14691472
}
14701473
dev_set_uevent_suppress(&device->dev, false);
1471-
/* Mark for userspace that device is ready */
1472-
kobject_uevent(&device->dev.kobj, KOBJ_ADD);
14731474

14741475
ib_device_notify_register(device);
1476+
14751477
ib_device_put(device);
14761478

14771479
return 0;

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)