• Home
  • Raw
  • Download

Lines Matching full:gsi

72 /* Call with gsi->lock locked */
73 static void generate_completions(struct mlx5_ib_gsi_qp *gsi) in generate_completions() argument
75 struct ib_cq *gsi_cq = gsi->ibqp.send_cq; in generate_completions()
79 for (index = gsi->outstanding_ci; index != gsi->outstanding_pi; in generate_completions()
81 wr = &gsi->outstanding_wrs[index % gsi->cap.max_send_wr]; in generate_completions()
86 if (gsi->sq_sig_type == IB_SIGNAL_ALL_WR || in generate_completions()
93 gsi->outstanding_ci = index; in generate_completions()
98 struct mlx5_ib_gsi_qp *gsi = cq->cq_context; in handle_single_completion() local
104 spin_lock_irqsave(&gsi->lock, flags); in handle_single_completion()
109 wr->wc.qp = &gsi->ibqp; in handle_single_completion()
111 generate_completions(gsi); in handle_single_completion()
112 spin_unlock_irqrestore(&gsi->lock, flags); in handle_single_completion()
119 struct mlx5_ib_gsi_qp *gsi; in mlx5_ib_gsi_create_qp() local
126 mlx5_ib_dbg(dev, "creating GSI QP\n"); in mlx5_ib_gsi_create_qp()
130 "invalid port number %d during GSI QP creation\n", in mlx5_ib_gsi_create_qp()
135 gsi = kzalloc(sizeof(*gsi), GFP_KERNEL); in mlx5_ib_gsi_create_qp()
136 if (!gsi) in mlx5_ib_gsi_create_qp()
139 gsi->tx_qps = kcalloc(num_qps, sizeof(*gsi->tx_qps), GFP_KERNEL); in mlx5_ib_gsi_create_qp()
140 if (!gsi->tx_qps) { in mlx5_ib_gsi_create_qp()
145 gsi->outstanding_wrs = kcalloc(init_attr->cap.max_send_wr, in mlx5_ib_gsi_create_qp()
146 sizeof(*gsi->outstanding_wrs), in mlx5_ib_gsi_create_qp()
148 if (!gsi->outstanding_wrs) { in mlx5_ib_gsi_create_qp()
153 mutex_init(&gsi->mutex); in mlx5_ib_gsi_create_qp()
157 if (dev->devr.ports[port_num - 1].gsi) { in mlx5_ib_gsi_create_qp()
158 mlx5_ib_warn(dev, "GSI QP already exists on port %d\n", in mlx5_ib_gsi_create_qp()
163 gsi->num_qps = num_qps; in mlx5_ib_gsi_create_qp()
164 spin_lock_init(&gsi->lock); in mlx5_ib_gsi_create_qp()
166 gsi->cap = init_attr->cap; in mlx5_ib_gsi_create_qp()
167 gsi->sq_sig_type = init_attr->sq_sig_type; in mlx5_ib_gsi_create_qp()
168 gsi->ibqp.qp_num = 1; in mlx5_ib_gsi_create_qp()
169 gsi->port_num = port_num; in mlx5_ib_gsi_create_qp()
171 gsi->cq = ib_alloc_cq(pd->device, gsi, init_attr->cap.max_send_wr, 0, in mlx5_ib_gsi_create_qp()
173 if (IS_ERR(gsi->cq)) { in mlx5_ib_gsi_create_qp()
174 mlx5_ib_warn(dev, "unable to create send CQ for GSI QP. error %ld\n", in mlx5_ib_gsi_create_qp()
175 PTR_ERR(gsi->cq)); in mlx5_ib_gsi_create_qp()
176 ret = PTR_ERR(gsi->cq); in mlx5_ib_gsi_create_qp()
181 hw_init_attr.send_cq = gsi->cq; in mlx5_ib_gsi_create_qp()
187 gsi->rx_qp = ib_create_qp(pd, &hw_init_attr); in mlx5_ib_gsi_create_qp()
188 if (IS_ERR(gsi->rx_qp)) { in mlx5_ib_gsi_create_qp()
189 mlx5_ib_warn(dev, "unable to create hardware GSI QP. error %ld\n", in mlx5_ib_gsi_create_qp()
190 PTR_ERR(gsi->rx_qp)); in mlx5_ib_gsi_create_qp()
191 ret = PTR_ERR(gsi->rx_qp); in mlx5_ib_gsi_create_qp()
195 dev->devr.ports[init_attr->port_num - 1].gsi = gsi; in mlx5_ib_gsi_create_qp()
199 return &gsi->ibqp; in mlx5_ib_gsi_create_qp()
202 ib_free_cq(gsi->cq); in mlx5_ib_gsi_create_qp()
205 kfree(gsi->outstanding_wrs); in mlx5_ib_gsi_create_qp()
207 kfree(gsi->tx_qps); in mlx5_ib_gsi_create_qp()
209 kfree(gsi); in mlx5_ib_gsi_create_qp()
216 struct mlx5_ib_gsi_qp *gsi = gsi_qp(qp); in mlx5_ib_gsi_destroy_qp() local
217 const int port_num = gsi->port_num; in mlx5_ib_gsi_destroy_qp()
221 mlx5_ib_dbg(dev, "destroying GSI QP\n"); in mlx5_ib_gsi_destroy_qp()
224 ret = ib_destroy_qp(gsi->rx_qp); in mlx5_ib_gsi_destroy_qp()
226 mlx5_ib_warn(dev, "unable to destroy hardware GSI QP. error %d\n", in mlx5_ib_gsi_destroy_qp()
231 dev->devr.ports[port_num - 1].gsi = NULL; in mlx5_ib_gsi_destroy_qp()
233 gsi->rx_qp = NULL; in mlx5_ib_gsi_destroy_qp()
235 for (qp_index = 0; qp_index < gsi->num_qps; ++qp_index) { in mlx5_ib_gsi_destroy_qp()
236 if (!gsi->tx_qps[qp_index]) in mlx5_ib_gsi_destroy_qp()
238 WARN_ON_ONCE(ib_destroy_qp(gsi->tx_qps[qp_index])); in mlx5_ib_gsi_destroy_qp()
239 gsi->tx_qps[qp_index] = NULL; in mlx5_ib_gsi_destroy_qp()
242 ib_free_cq(gsi->cq); in mlx5_ib_gsi_destroy_qp()
244 kfree(gsi->outstanding_wrs); in mlx5_ib_gsi_destroy_qp()
245 kfree(gsi->tx_qps); in mlx5_ib_gsi_destroy_qp()
246 kfree(gsi); in mlx5_ib_gsi_destroy_qp()
251 static struct ib_qp *create_gsi_ud_qp(struct mlx5_ib_gsi_qp *gsi) in create_gsi_ud_qp() argument
253 struct ib_pd *pd = gsi->rx_qp->pd; in create_gsi_ud_qp()
255 .event_handler = gsi->rx_qp->event_handler, in create_gsi_ud_qp()
256 .qp_context = gsi->rx_qp->qp_context, in create_gsi_ud_qp()
257 .send_cq = gsi->cq, in create_gsi_ud_qp()
258 .recv_cq = gsi->rx_qp->recv_cq, in create_gsi_ud_qp()
260 .max_send_wr = gsi->cap.max_send_wr, in create_gsi_ud_qp()
261 .max_send_sge = gsi->cap.max_send_sge, in create_gsi_ud_qp()
262 .max_inline_data = gsi->cap.max_inline_data, in create_gsi_ud_qp()
264 .sq_sig_type = gsi->sq_sig_type, in create_gsi_ud_qp()
272 static int modify_to_rts(struct mlx5_ib_gsi_qp *gsi, struct ib_qp *qp, in modify_to_rts() argument
284 attr.port_num = gsi->port_num; in modify_to_rts()
312 static void setup_qp(struct mlx5_ib_gsi_qp *gsi, u16 qp_index) in setup_qp() argument
314 struct ib_device *device = gsi->rx_qp->device; in setup_qp()
321 ret = ib_query_pkey(device, gsi->port_num, qp_index, &pkey); in setup_qp()
324 gsi->port_num, qp_index); in setup_qp()
330 gsi->port_num, qp_index); in setup_qp()
334 spin_lock_irqsave(&gsi->lock, flags); in setup_qp()
335 qp = gsi->tx_qps[qp_index]; in setup_qp()
336 spin_unlock_irqrestore(&gsi->lock, flags); in setup_qp()
338 mlx5_ib_dbg(dev, "already existing GSI TX QP at port %d, index %d. Skipping\n", in setup_qp()
339 gsi->port_num, qp_index); in setup_qp()
343 qp = create_gsi_ud_qp(gsi); in setup_qp()
345 mlx5_ib_warn(dev, "unable to create hardware UD QP for GSI: %ld\n", in setup_qp()
350 ret = modify_to_rts(gsi, qp, qp_index); in setup_qp()
354 spin_lock_irqsave(&gsi->lock, flags); in setup_qp()
355 WARN_ON_ONCE(gsi->tx_qps[qp_index]); in setup_qp()
356 gsi->tx_qps[qp_index] = qp; in setup_qp()
357 spin_unlock_irqrestore(&gsi->lock, flags); in setup_qp()
365 static void setup_qps(struct mlx5_ib_gsi_qp *gsi) in setup_qps() argument
369 for (qp_index = 0; qp_index < gsi->num_qps; ++qp_index) in setup_qps()
370 setup_qp(gsi, qp_index); in setup_qps()
377 struct mlx5_ib_gsi_qp *gsi = gsi_qp(qp); in mlx5_ib_gsi_modify_qp() local
380 mlx5_ib_dbg(dev, "modifying GSI QP to state %d\n", attr->qp_state); in mlx5_ib_gsi_modify_qp()
382 mutex_lock(&gsi->mutex); in mlx5_ib_gsi_modify_qp()
383 ret = ib_modify_qp(gsi->rx_qp, attr, attr_mask); in mlx5_ib_gsi_modify_qp()
385 mlx5_ib_warn(dev, "unable to modify GSI rx QP: %d\n", ret); in mlx5_ib_gsi_modify_qp()
389 if (to_mqp(gsi->rx_qp)->state == IB_QPS_RTS) in mlx5_ib_gsi_modify_qp()
390 setup_qps(gsi); in mlx5_ib_gsi_modify_qp()
393 mutex_unlock(&gsi->mutex); in mlx5_ib_gsi_modify_qp()
402 struct mlx5_ib_gsi_qp *gsi = gsi_qp(qp); in mlx5_ib_gsi_query_qp() local
405 mutex_lock(&gsi->mutex); in mlx5_ib_gsi_query_qp()
406 ret = ib_query_qp(gsi->rx_qp, qp_attr, qp_attr_mask, qp_init_attr); in mlx5_ib_gsi_query_qp()
407 qp_init_attr->cap = gsi->cap; in mlx5_ib_gsi_query_qp()
408 mutex_unlock(&gsi->mutex); in mlx5_ib_gsi_query_qp()
413 /* Call with gsi->lock locked */
414 static int mlx5_ib_add_outstanding_wr(struct mlx5_ib_gsi_qp *gsi, in mlx5_ib_add_outstanding_wr() argument
417 struct mlx5_ib_dev *dev = to_mdev(gsi->rx_qp->device); in mlx5_ib_add_outstanding_wr()
420 if (gsi->outstanding_pi == gsi->outstanding_ci + gsi->cap.max_send_wr) { in mlx5_ib_add_outstanding_wr()
421 mlx5_ib_warn(dev, "no available GSI work request.\n"); in mlx5_ib_add_outstanding_wr()
425 gsi_wr = &gsi->outstanding_wrs[gsi->outstanding_pi % in mlx5_ib_add_outstanding_wr()
426 gsi->cap.max_send_wr]; in mlx5_ib_add_outstanding_wr()
427 gsi->outstanding_pi++; in mlx5_ib_add_outstanding_wr()
444 /* Call with gsi->lock locked */
445 static int mlx5_ib_gsi_silent_drop(struct mlx5_ib_gsi_qp *gsi, in mlx5_ib_gsi_silent_drop() argument
452 .qp = &gsi->ibqp, in mlx5_ib_gsi_silent_drop()
456 ret = mlx5_ib_add_outstanding_wr(gsi, wr, &wc); in mlx5_ib_gsi_silent_drop()
460 generate_completions(gsi); in mlx5_ib_gsi_silent_drop()
465 /* Call with gsi->lock locked */
466 static struct ib_qp *get_tx_qp(struct mlx5_ib_gsi_qp *gsi, struct ib_ud_wr *wr) in get_tx_qp() argument
468 struct mlx5_ib_dev *dev = to_mdev(gsi->rx_qp->device); in get_tx_qp()
472 return gsi->rx_qp; in get_tx_qp()
474 if (qp_index >= gsi->num_qps) in get_tx_qp()
477 return gsi->tx_qps[qp_index]; in get_tx_qp()
483 struct mlx5_ib_gsi_qp *gsi = gsi_qp(qp); in mlx5_ib_gsi_post_send() local
493 spin_lock_irqsave(&gsi->lock, flags); in mlx5_ib_gsi_post_send()
494 tx_qp = get_tx_qp(gsi, &cur_wr); in mlx5_ib_gsi_post_send()
496 ret = mlx5_ib_gsi_silent_drop(gsi, &cur_wr); in mlx5_ib_gsi_post_send()
499 spin_unlock_irqrestore(&gsi->lock, flags); in mlx5_ib_gsi_post_send()
503 ret = mlx5_ib_add_outstanding_wr(gsi, &cur_wr, NULL); in mlx5_ib_gsi_post_send()
510 gsi->outstanding_pi--; in mlx5_ib_gsi_post_send()
513 spin_unlock_irqrestore(&gsi->lock, flags); in mlx5_ib_gsi_post_send()
519 spin_unlock_irqrestore(&gsi->lock, flags); in mlx5_ib_gsi_post_send()
527 struct mlx5_ib_gsi_qp *gsi = gsi_qp(qp); in mlx5_ib_gsi_post_recv() local
529 return ib_post_recv(gsi->rx_qp, wr, bad_wr); in mlx5_ib_gsi_post_recv()
532 void mlx5_ib_gsi_pkey_change(struct mlx5_ib_gsi_qp *gsi) in mlx5_ib_gsi_pkey_change() argument
534 if (!gsi) in mlx5_ib_gsi_pkey_change()
537 mutex_lock(&gsi->mutex); in mlx5_ib_gsi_pkey_change()
538 setup_qps(gsi); in mlx5_ib_gsi_pkey_change()
539 mutex_unlock(&gsi->mutex); in mlx5_ib_gsi_pkey_change()