Lines Matching full:gsi
46 /* Call with gsi->lock locked */
49 struct mlx5_ib_gsi_qp *gsi = &mqp->gsi; in generate_completions() local
54 for (index = gsi->outstanding_ci; index != gsi->outstanding_pi; in generate_completions()
56 wr = &gsi->outstanding_wrs[index % gsi->cap.max_send_wr]; in generate_completions()
65 gsi->outstanding_ci = index; in generate_completions()
70 struct mlx5_ib_gsi_qp *gsi = cq->cq_context; in handle_single_completion() local
73 struct mlx5_ib_qp *mqp = container_of(gsi, struct mlx5_ib_qp, gsi); in handle_single_completion()
77 spin_lock_irqsave(&gsi->lock, flags); in handle_single_completion()
85 spin_unlock_irqrestore(&gsi->lock, flags); in handle_single_completion()
92 struct mlx5_ib_gsi_qp *gsi; in mlx5_ib_create_gsi() local
106 gsi = &mqp->gsi; in mlx5_ib_create_gsi()
107 gsi->tx_qps = kcalloc(num_qps, sizeof(*gsi->tx_qps), GFP_KERNEL); in mlx5_ib_create_gsi()
108 if (!gsi->tx_qps) in mlx5_ib_create_gsi()
111 gsi->outstanding_wrs = in mlx5_ib_create_gsi()
112 kcalloc(attr->cap.max_send_wr, sizeof(*gsi->outstanding_wrs), in mlx5_ib_create_gsi()
114 if (!gsi->outstanding_wrs) { in mlx5_ib_create_gsi()
121 if (dev->devr.ports[port_num - 1].gsi) { in mlx5_ib_create_gsi()
122 mlx5_ib_warn(dev, "GSI QP already exists on port %d\n", in mlx5_ib_create_gsi()
127 gsi->num_qps = num_qps; in mlx5_ib_create_gsi()
128 spin_lock_init(&gsi->lock); in mlx5_ib_create_gsi()
130 gsi->cap = attr->cap; in mlx5_ib_create_gsi()
131 gsi->port_num = port_num; in mlx5_ib_create_gsi()
133 gsi->cq = ib_alloc_cq(pd->device, gsi, attr->cap.max_send_wr, 0, in mlx5_ib_create_gsi()
135 if (IS_ERR(gsi->cq)) { in mlx5_ib_create_gsi()
136 mlx5_ib_warn(dev, "unable to create send CQ for GSI QP. error %ld\n", in mlx5_ib_create_gsi()
137 PTR_ERR(gsi->cq)); in mlx5_ib_create_gsi()
138 ret = PTR_ERR(gsi->cq); in mlx5_ib_create_gsi()
143 hw_init_attr.send_cq = gsi->cq; in mlx5_ib_create_gsi()
150 gsi->rx_qp = mlx5_ib_create_qp(pd, &hw_init_attr, NULL); in mlx5_ib_create_gsi()
151 if (IS_ERR(gsi->rx_qp)) { in mlx5_ib_create_gsi()
152 mlx5_ib_warn(dev, "unable to create hardware GSI QP. error %ld\n", in mlx5_ib_create_gsi()
153 PTR_ERR(gsi->rx_qp)); in mlx5_ib_create_gsi()
154 ret = PTR_ERR(gsi->rx_qp); in mlx5_ib_create_gsi()
157 gsi->rx_qp->device = pd->device; in mlx5_ib_create_gsi()
158 gsi->rx_qp->pd = pd; in mlx5_ib_create_gsi()
159 gsi->rx_qp->real_qp = gsi->rx_qp; in mlx5_ib_create_gsi()
161 gsi->rx_qp->qp_type = hw_init_attr.qp_type; in mlx5_ib_create_gsi()
162 gsi->rx_qp->send_cq = hw_init_attr.send_cq; in mlx5_ib_create_gsi()
163 gsi->rx_qp->recv_cq = hw_init_attr.recv_cq; in mlx5_ib_create_gsi()
164 gsi->rx_qp->event_handler = hw_init_attr.event_handler; in mlx5_ib_create_gsi()
165 spin_lock_init(&gsi->rx_qp->mr_lock); in mlx5_ib_create_gsi()
166 INIT_LIST_HEAD(&gsi->rx_qp->rdma_mrs); in mlx5_ib_create_gsi()
167 INIT_LIST_HEAD(&gsi->rx_qp->sig_mrs); in mlx5_ib_create_gsi()
169 dev->devr.ports[attr->port_num - 1].gsi = gsi; in mlx5_ib_create_gsi()
176 ib_free_cq(gsi->cq); in mlx5_ib_create_gsi()
179 kfree(gsi->outstanding_wrs); in mlx5_ib_create_gsi()
181 kfree(gsi->tx_qps); in mlx5_ib_create_gsi()
188 struct mlx5_ib_gsi_qp *gsi = &mqp->gsi; in mlx5_ib_destroy_gsi() local
189 const int port_num = gsi->port_num; in mlx5_ib_destroy_gsi()
194 ret = mlx5_ib_destroy_qp(gsi->rx_qp, NULL); in mlx5_ib_destroy_gsi()
196 mlx5_ib_warn(dev, "unable to destroy hardware GSI QP. error %d\n", in mlx5_ib_destroy_gsi()
201 dev->devr.ports[port_num - 1].gsi = NULL; in mlx5_ib_destroy_gsi()
203 gsi->rx_qp = NULL; in mlx5_ib_destroy_gsi()
205 for (qp_index = 0; qp_index < gsi->num_qps; ++qp_index) { in mlx5_ib_destroy_gsi()
206 if (!gsi->tx_qps[qp_index]) in mlx5_ib_destroy_gsi()
208 WARN_ON_ONCE(ib_destroy_qp(gsi->tx_qps[qp_index])); in mlx5_ib_destroy_gsi()
209 gsi->tx_qps[qp_index] = NULL; in mlx5_ib_destroy_gsi()
212 ib_free_cq(gsi->cq); in mlx5_ib_destroy_gsi()
214 kfree(gsi->outstanding_wrs); in mlx5_ib_destroy_gsi()
215 kfree(gsi->tx_qps); in mlx5_ib_destroy_gsi()
221 static struct ib_qp *create_gsi_ud_qp(struct mlx5_ib_gsi_qp *gsi) in create_gsi_ud_qp() argument
223 struct ib_pd *pd = gsi->rx_qp->pd; in create_gsi_ud_qp()
225 .event_handler = gsi->rx_qp->event_handler, in create_gsi_ud_qp()
226 .qp_context = gsi->rx_qp->qp_context, in create_gsi_ud_qp()
227 .send_cq = gsi->cq, in create_gsi_ud_qp()
228 .recv_cq = gsi->rx_qp->recv_cq, in create_gsi_ud_qp()
230 .max_send_wr = gsi->cap.max_send_wr, in create_gsi_ud_qp()
231 .max_send_sge = gsi->cap.max_send_sge, in create_gsi_ud_qp()
232 .max_inline_data = gsi->cap.max_inline_data, in create_gsi_ud_qp()
241 static int modify_to_rts(struct mlx5_ib_gsi_qp *gsi, struct ib_qp *qp, in modify_to_rts() argument
253 attr.port_num = gsi->port_num; in modify_to_rts()
281 static void setup_qp(struct mlx5_ib_gsi_qp *gsi, u16 qp_index) in setup_qp() argument
283 struct ib_device *device = gsi->rx_qp->device; in setup_qp()
295 ret = ib_query_pkey(device, gsi->port_num, pkey_index, &pkey); in setup_qp()
298 gsi->port_num, qp_index); in setup_qp()
304 gsi->port_num, qp_index); in setup_qp()
308 spin_lock_irqsave(&gsi->lock, flags); in setup_qp()
309 qp = gsi->tx_qps[qp_index]; in setup_qp()
310 spin_unlock_irqrestore(&gsi->lock, flags); in setup_qp()
312 mlx5_ib_dbg(dev, "already existing GSI TX QP at port %d, index %d. Skipping\n", in setup_qp()
313 gsi->port_num, qp_index); in setup_qp()
317 qp = create_gsi_ud_qp(gsi); in setup_qp()
319 mlx5_ib_warn(dev, "unable to create hardware UD QP for GSI: %ld\n", in setup_qp()
327 ret = modify_to_rts(gsi, qp, pkey_index); in setup_qp()
331 spin_lock_irqsave(&gsi->lock, flags); in setup_qp()
332 WARN_ON_ONCE(gsi->tx_qps[qp_index]); in setup_qp()
333 gsi->tx_qps[qp_index] = qp; in setup_qp()
334 spin_unlock_irqrestore(&gsi->lock, flags); in setup_qp()
342 static void setup_qps(struct mlx5_ib_gsi_qp *gsi) in setup_qps() argument
344 struct mlx5_ib_dev *dev = to_mdev(gsi->rx_qp->device); in setup_qps()
348 for (qp_index = 0; qp_index < gsi->num_qps; ++qp_index) in setup_qps()
349 setup_qp(gsi, qp_index); in setup_qps()
358 struct mlx5_ib_gsi_qp *gsi = &mqp->gsi; in mlx5_ib_gsi_modify_qp() local
361 mlx5_ib_dbg(dev, "modifying GSI QP to state %d\n", attr->qp_state); in mlx5_ib_gsi_modify_qp()
363 ret = ib_modify_qp(gsi->rx_qp, attr, attr_mask); in mlx5_ib_gsi_modify_qp()
365 mlx5_ib_warn(dev, "unable to modify GSI rx QP: %d\n", ret); in mlx5_ib_gsi_modify_qp()
369 if (to_mqp(gsi->rx_qp)->state == IB_QPS_RTS) in mlx5_ib_gsi_modify_qp()
370 setup_qps(gsi); in mlx5_ib_gsi_modify_qp()
379 struct mlx5_ib_gsi_qp *gsi = &mqp->gsi; in mlx5_ib_gsi_query_qp() local
382 ret = ib_query_qp(gsi->rx_qp, qp_attr, qp_attr_mask, qp_init_attr); in mlx5_ib_gsi_query_qp()
383 qp_init_attr->cap = gsi->cap; in mlx5_ib_gsi_query_qp()
387 /* Call with gsi->lock locked */
391 struct mlx5_ib_gsi_qp *gsi = &mqp->gsi; in mlx5_ib_add_outstanding_wr() local
392 struct mlx5_ib_dev *dev = to_mdev(gsi->rx_qp->device); in mlx5_ib_add_outstanding_wr()
395 if (gsi->outstanding_pi == gsi->outstanding_ci + gsi->cap.max_send_wr) { in mlx5_ib_add_outstanding_wr()
396 mlx5_ib_warn(dev, "no available GSI work request.\n"); in mlx5_ib_add_outstanding_wr()
400 gsi_wr = &gsi->outstanding_wrs[gsi->outstanding_pi % in mlx5_ib_add_outstanding_wr()
401 gsi->cap.max_send_wr]; in mlx5_ib_add_outstanding_wr()
402 gsi->outstanding_pi++; in mlx5_ib_add_outstanding_wr()
419 /* Call with gsi->lock locked */
439 /* Call with gsi->lock locked */
440 static struct ib_qp *get_tx_qp(struct mlx5_ib_gsi_qp *gsi, struct ib_ud_wr *wr) in get_tx_qp() argument
442 struct mlx5_ib_dev *dev = to_mdev(gsi->rx_qp->device); in get_tx_qp()
446 if (!gsi->num_qps) in get_tx_qp()
447 return gsi->rx_qp; in get_tx_qp()
452 if (qp_index >= gsi->num_qps) in get_tx_qp()
455 return gsi->tx_qps[qp_index]; in get_tx_qp()
462 struct mlx5_ib_gsi_qp *gsi = &mqp->gsi; in mlx5_ib_gsi_post_send() local
472 spin_lock_irqsave(&gsi->lock, flags); in mlx5_ib_gsi_post_send()
473 tx_qp = get_tx_qp(gsi, &cur_wr); in mlx5_ib_gsi_post_send()
478 spin_unlock_irqrestore(&gsi->lock, flags); in mlx5_ib_gsi_post_send()
489 gsi->outstanding_pi--; in mlx5_ib_gsi_post_send()
492 spin_unlock_irqrestore(&gsi->lock, flags); in mlx5_ib_gsi_post_send()
498 spin_unlock_irqrestore(&gsi->lock, flags); in mlx5_ib_gsi_post_send()
507 struct mlx5_ib_gsi_qp *gsi = &mqp->gsi; in mlx5_ib_gsi_post_recv() local
509 return ib_post_recv(gsi->rx_qp, wr, bad_wr); in mlx5_ib_gsi_post_recv()
512 void mlx5_ib_gsi_pkey_change(struct mlx5_ib_gsi_qp *gsi) in mlx5_ib_gsi_pkey_change() argument
514 if (!gsi) in mlx5_ib_gsi_pkey_change()
517 setup_qps(gsi); in mlx5_ib_gsi_pkey_change()