Lines Matching refs:srq

16 	struct hns_roce_srq *srq;
19 srq = xa_load(&srq_table->xa, srqn & (hr_dev->caps.num_srqs - 1));
20 if (srq)
21 refcount_inc(&srq->refcount);
24 if (!srq) {
29 srq->event(srq, event_type);
31 if (refcount_dec_and_test(&srq->refcount))
32 complete(&srq->free);
35 static void hns_roce_ib_srq_event(struct hns_roce_srq *srq,
38 struct hns_roce_dev *hr_dev = to_hr_dev(srq->ibsrq.device);
39 struct ib_srq *ibsrq = &srq->ibsrq;
44 event.element.srq = ibsrq;
55 event_type, srq->srqn);
63 static int alloc_srqn(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq)
71 ibdev_err(&hr_dev->ib_dev, "failed to alloc srq(%d).\n", id);
75 srq->srqn = id;
80 static void free_srqn(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq)
82 ida_free(&hr_dev->srq_table.srq_ida.ida, (int)srq->srqn);
86 struct hns_roce_srq *srq)
98 ret = hr_dev->hw->write_srqc(srq, mailbox->buf);
105 srq->srqn);
114 static int alloc_srqc(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq)
120 ret = hns_roce_table_get(hr_dev, &srq_table->table, srq->srqn);
126 ret = xa_err(xa_store(&srq_table->xa, srq->srqn, srq, GFP_KERNEL));
132 ret = hns_roce_create_srqc(hr_dev, srq);
139 xa_erase(&srq_table->xa, srq->srqn);
141 hns_roce_table_put(hr_dev, &srq_table->table, srq->srqn);
146 static void free_srqc(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq)
152 srq->srqn);
155 ret, srq->srqn);
157 xa_erase(&srq_table->xa, srq->srqn);
159 if (refcount_dec_and_test(&srq->refcount))
160 complete(&srq->free);
161 wait_for_completion(&srq->free);
163 hns_roce_table_put(hr_dev, &srq_table->table, srq->srqn);
166 static int alloc_srq_idx(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq,
169 struct hns_roce_idx_que *idx_que = &srq->idx_que;
174 srq->idx_que.entry_shift = ilog2(HNS_ROCE_IDX_QUE_ENTRY_SZ);
177 buf_attr.region[0].size = to_hr_hem_entries_size(srq->wqe_cnt,
178 srq->idx_que.entry_shift);
192 idx_que->bitmap = bitmap_zalloc(srq->wqe_cnt, GFP_KERNEL);
210 static void free_srq_idx(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq)
212 struct hns_roce_idx_que *idx_que = &srq->idx_que;
220 struct hns_roce_srq *srq,
227 srq->wqe_shift = ilog2(roundup_pow_of_two(max(HNS_ROCE_SGE_SIZE,
229 srq->max_gs)));
232 buf_attr.region[0].size = to_hr_hem_entries_size(srq->wqe_cnt,
233 srq->wqe_shift);
237 ret = hns_roce_mtr_create(hr_dev, &srq->buf_mtr, &buf_attr,
248 struct hns_roce_srq *srq)
250 hns_roce_mtr_destroy(hr_dev, &srq->buf_mtr);
253 static int alloc_srq_wrid(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq)
255 srq->wrid = kvmalloc_array(srq->wqe_cnt, sizeof(u64), GFP_KERNEL);
256 if (!srq->wrid)
262 static void free_srq_wrid(struct hns_roce_srq *srq)
264 kvfree(srq->wrid);
265 srq->wrid = NULL;
290 static int set_srq_basic_param(struct hns_roce_srq *srq,
294 struct hns_roce_dev *hr_dev = to_hr_dev(srq->ibsrq.device);
298 max_sge = proc_srq_sge(hr_dev, srq, !!udata);
308 srq->wqe_cnt = roundup_pow_of_two(attr->max_wr);
309 srq->max_gs = roundup_pow_of_two(attr->max_sge + srq->rsv_sge);
311 attr->max_wr = srq->wqe_cnt;
312 attr->max_sge = srq->max_gs - srq->rsv_sge;
318 static void set_srq_ext_param(struct hns_roce_srq *srq,
321 srq->cqn = ib_srq_has_cq(init_attr->srq_type) ?
324 srq->xrcdn = (init_attr->srq_type == IB_SRQT_XRC) ?
328 static int set_srq_param(struct hns_roce_srq *srq,
334 ret = set_srq_basic_param(srq, init_attr, udata);
338 set_srq_ext_param(srq, init_attr);
343 static int alloc_srq_buf(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq,
360 ret = alloc_srq_idx(hr_dev, srq, udata, ucmd.que_addr);
364 ret = alloc_srq_wqe_buf(hr_dev, srq, udata, ucmd.buf_addr);
369 ret = alloc_srq_wrid(hr_dev, srq);
377 free_srq_wqe_buf(hr_dev, srq);
379 free_srq_idx(hr_dev, srq);
384 static void free_srq_buf(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq)
386 free_srq_wrid(srq);
387 free_srq_wqe_buf(hr_dev, srq);
388 free_srq_idx(hr_dev, srq);
391 static int get_srq_ucmd(struct hns_roce_srq *srq, struct ib_udata *udata,
394 struct ib_device *ibdev = srq->ibsrq.device;
406 static void free_srq_db(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq,
411 if (!(srq->cap_flags & HNS_ROCE_SRQ_CAP_RECORD_DB))
414 srq->cap_flags &= ~HNS_ROCE_SRQ_CAP_RECORD_DB;
419 hns_roce_db_unmap_user(uctx, &srq->rdb);
421 hns_roce_free_db(hr_dev, &srq->rdb);
425 static int alloc_srq_db(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq,
434 ret = get_srq_ucmd(srq, udata, &ucmd);
443 &srq->rdb);
447 srq->cap_flags |= HNS_ROCE_RSP_SRQ_CAP_RECORD_DB;
451 ret = hns_roce_alloc_db(hr_dev, &srq->rdb, 1);
455 *srq->rdb.db_record = 0;
456 srq->cap_flags |= HNS_ROCE_RSP_SRQ_CAP_RECORD_DB;
458 srq->db_reg = hr_dev->reg_base + SRQ_DB_REG;
470 struct hns_roce_srq *srq = to_hr_srq(ib_srq);
473 mutex_init(&srq->mutex);
474 spin_lock_init(&srq->lock);
476 ret = set_srq_param(srq, init_attr, udata);
480 ret = alloc_srq_buf(hr_dev, srq, udata);
484 ret = alloc_srq_db(hr_dev, srq, udata, &resp);
488 ret = alloc_srqn(hr_dev, srq);
492 ret = alloc_srqc(hr_dev, srq);
497 resp.cap_flags = srq->cap_flags;
498 resp.srqn = srq->srqn;
506 srq->event = hns_roce_ib_srq_event;
507 refcount_set(&srq->refcount, 1);
508 init_completion(&srq->free);
513 free_srqc(hr_dev, srq);
515 free_srqn(hr_dev, srq);
517 free_srq_db(hr_dev, srq, udata);
519 free_srq_buf(hr_dev, srq);
529 struct hns_roce_srq *srq = to_hr_srq(ibsrq);
531 free_srqc(hr_dev, srq);
532 free_srqn(hr_dev, srq);
533 free_srq_db(hr_dev, srq, udata);
534 free_srq_buf(hr_dev, srq);