/linux-4.4.14/drivers/infiniband/hw/usnic/ |
H A D | usnic_ib_qp_grp.c | 79 struct usnic_ib_qp_grp *qp_grp = obj; usnic_ib_qp_grp_dump_rows() local 82 default_flow = list_first_entry(&qp_grp->flows_lst, usnic_ib_qp_grp_dump_rows() 85 qp_grp->ibqp.qp_num, usnic_ib_qp_grp_dump_rows() 87 qp_grp->state), usnic_ib_qp_grp_dump_rows() 88 qp_grp->owner_pid, usnic_ib_qp_grp_dump_rows() 89 usnic_vnic_get_index(qp_grp->vf->vnic), usnic_ib_qp_grp_dump_rows() 97 get_qp_res_chunk(struct usnic_ib_qp_grp *qp_grp) get_qp_res_chunk() argument 99 lockdep_assert_held(&qp_grp->lock); get_qp_res_chunk() 104 return usnic_ib_qp_grp_get_chunk(qp_grp, USNIC_VNIC_RES_TYPE_RQ); get_qp_res_chunk() 107 static int enable_qp_grp(struct usnic_ib_qp_grp *qp_grp) enable_qp_grp() argument 115 lockdep_assert_held(&qp_grp->lock); enable_qp_grp() 117 vnic_idx = usnic_vnic_get_index(qp_grp->vf->vnic); enable_qp_grp() 119 res_chunk = get_qp_res_chunk(qp_grp); enable_qp_grp() 128 status = usnic_fwd_enable_qp(qp_grp->ufdev, vnic_idx, enable_qp_grp() 132 res->vnic_idx, qp_grp->ufdev->name, enable_qp_grp() 143 usnic_fwd_disable_qp(qp_grp->ufdev, vnic_idx, enable_qp_grp() 150 static int disable_qp_grp(struct usnic_ib_qp_grp *qp_grp) disable_qp_grp() argument 157 lockdep_assert_held(&qp_grp->lock); disable_qp_grp() 158 vnic_idx = usnic_vnic_get_index(qp_grp->vf->vnic); disable_qp_grp() 160 res_chunk = get_qp_res_chunk(qp_grp); disable_qp_grp() 169 status = usnic_fwd_disable_qp(qp_grp->ufdev, vnic_idx, disable_qp_grp() 174 qp_grp->ufdev->name, disable_qp_grp() 183 static int init_filter_action(struct usnic_ib_qp_grp *qp_grp, init_filter_action() argument 188 res_chunk = usnic_ib_qp_grp_get_chunk(qp_grp, USNIC_VNIC_RES_TYPE_RQ); init_filter_action() 196 uaction->vnic_idx = usnic_vnic_get_index(qp_grp->vf->vnic); init_filter_action() 204 create_roce_custom_flow(struct usnic_ib_qp_grp *qp_grp, create_roce_custom_flow() argument 225 err = init_filter_action(qp_grp, &uaction); create_roce_custom_flow() 229 flow = usnic_fwd_alloc_flow(qp_grp->ufdev, &filter, &uaction); create_roce_custom_flow() 246 qp_flow->qp_grp = qp_grp; create_roce_custom_flow() 265 create_udp_flow(struct usnic_ib_qp_grp *qp_grp, create_udp_flow() argument 300 err = init_filter_action(qp_grp, &uaction); create_udp_flow() 304 flow = usnic_fwd_alloc_flow(qp_grp->ufdev, &filter, &uaction); create_udp_flow() 321 qp_flow->qp_grp = qp_grp; create_udp_flow() 339 create_and_add_flow(struct usnic_ib_qp_grp *qp_grp, create_and_add_flow() argument 348 qp_flow = create_roce_custom_flow(qp_grp, trans_spec); create_and_add_flow() 351 qp_flow = create_udp_flow(qp_grp, trans_spec); create_and_add_flow() 360 list_add_tail(&qp_flow->link, &qp_grp->flows_lst); create_and_add_flow() 387 static void release_and_remove_all_flows(struct usnic_ib_qp_grp *qp_grp) release_and_remove_all_flows() argument 390 list_for_each_entry_safe(qp_flow, tmp, &qp_grp->flows_lst, link) release_and_remove_all_flows() 394 int usnic_ib_qp_grp_modify(struct usnic_ib_qp_grp *qp_grp, usnic_ib_qp_grp_modify() argument 405 old_state = qp_grp->state; usnic_ib_qp_grp_modify() 406 vnic_idx = usnic_vnic_get_index(qp_grp->vf->vnic); usnic_ib_qp_grp_modify() 409 spin_lock(&qp_grp->lock); usnic_ib_qp_grp_modify() 417 release_and_remove_all_flows(qp_grp); usnic_ib_qp_grp_modify() 423 status = disable_qp_grp(qp_grp); usnic_ib_qp_grp_modify() 424 release_and_remove_all_flows(qp_grp); usnic_ib_qp_grp_modify() 434 qp_flow = create_and_add_flow(qp_grp, usnic_ib_qp_grp_modify() 449 qp_flow = create_and_add_flow(qp_grp, usnic_ib_qp_grp_modify() 464 status = disable_qp_grp(qp_grp); usnic_ib_qp_grp_modify() 467 status = disable_qp_grp(qp_grp); usnic_ib_qp_grp_modify() 476 status = enable_qp_grp(qp_grp); usnic_ib_qp_grp_modify() 492 ib_event.device = &qp_grp->vf->pf->ib_dev; usnic_ib_qp_grp_modify() 493 ib_event.element.qp = &qp_grp->ibqp; usnic_ib_qp_grp_modify() 498 qp_grp->ibqp.event_handler(&ib_event, usnic_ib_qp_grp_modify() 499 qp_grp->ibqp.qp_context); usnic_ib_qp_grp_modify() 502 release_and_remove_all_flows(qp_grp); usnic_ib_qp_grp_modify() 503 qp_grp->ibqp.event_handler(&ib_event, usnic_ib_qp_grp_modify() 504 qp_grp->ibqp.qp_context); usnic_ib_qp_grp_modify() 508 status = disable_qp_grp(qp_grp); usnic_ib_qp_grp_modify() 509 release_and_remove_all_flows(qp_grp); usnic_ib_qp_grp_modify() 510 qp_grp->ibqp.event_handler(&ib_event, usnic_ib_qp_grp_modify() 511 qp_grp->ibqp.qp_context); usnic_ib_qp_grp_modify() 520 spin_unlock(&qp_grp->lock); usnic_ib_qp_grp_modify() 523 qp_grp->state = new_state; usnic_ib_qp_grp_modify() 525 qp_grp->grp_id, usnic_ib_qp_grp_modify() 530 qp_grp->grp_id, usnic_ib_qp_grp_modify() 594 struct usnic_ib_qp_grp *qp_grp) qp_grp_and_vf_bind() 614 qp_grp->vf = vf; qp_grp_and_vf_bind() 619 static void qp_grp_and_vf_unbind(struct usnic_ib_qp_grp *qp_grp) qp_grp_and_vf_unbind() argument 624 lockdep_assert_held(&qp_grp->vf->lock); qp_grp_and_vf_unbind() 626 pd = qp_grp->vf->pd; qp_grp_and_vf_unbind() 627 pdev = usnic_vnic_get_pdev(qp_grp->vf->vnic); qp_grp_and_vf_unbind() 628 if (--qp_grp->vf->qp_grp_ref_cnt == 0) { qp_grp_and_vf_unbind() 629 qp_grp->vf->pd = NULL; qp_grp_and_vf_unbind() 632 qp_grp->vf = NULL; qp_grp_and_vf_unbind() 680 struct usnic_ib_qp_grp *qp_grp; usnic_ib_qp_grp_create() local 696 qp_grp = kzalloc(sizeof(*qp_grp), GFP_ATOMIC); usnic_ib_qp_grp_create() 697 if (!qp_grp) { usnic_ib_qp_grp_create() 698 usnic_err("Unable to alloc qp_grp - Out of memory\n"); usnic_ib_qp_grp_create() 702 qp_grp->res_chunk_list = alloc_res_chunk_list(vf->vnic, res_spec, usnic_ib_qp_grp_create() 703 qp_grp); usnic_ib_qp_grp_create() 704 if (IS_ERR_OR_NULL(qp_grp->res_chunk_list)) { usnic_ib_qp_grp_create() 705 err = qp_grp->res_chunk_list ? usnic_ib_qp_grp_create() 706 PTR_ERR(qp_grp->res_chunk_list) : -ENOMEM; usnic_ib_qp_grp_create() 708 qp_grp->grp_id, err); usnic_ib_qp_grp_create() 712 err = qp_grp_and_vf_bind(vf, pd, qp_grp); usnic_ib_qp_grp_create() 716 INIT_LIST_HEAD(&qp_grp->flows_lst); usnic_ib_qp_grp_create() 717 spin_lock_init(&qp_grp->lock); usnic_ib_qp_grp_create() 718 qp_grp->ufdev = ufdev; usnic_ib_qp_grp_create() 719 qp_grp->state = IB_QPS_RESET; usnic_ib_qp_grp_create() 720 qp_grp->owner_pid = current->pid; usnic_ib_qp_grp_create() 722 qp_flow = create_and_add_flow(qp_grp, transport_spec); usnic_ib_qp_grp_create() 730 err = qp_grp_id_from_flow(qp_flow, &qp_grp->grp_id); usnic_ib_qp_grp_create() 733 qp_grp->ibqp.qp_num = qp_grp->grp_id; usnic_ib_qp_grp_create() 735 usnic_ib_sysfs_qpn_add(qp_grp); usnic_ib_qp_grp_create() 737 return qp_grp; usnic_ib_qp_grp_create() 742 qp_grp_and_vf_unbind(qp_grp); usnic_ib_qp_grp_create() 744 free_qp_grp_res(qp_grp->res_chunk_list); usnic_ib_qp_grp_create() 746 kfree(qp_grp); usnic_ib_qp_grp_create() 751 void usnic_ib_qp_grp_destroy(struct usnic_ib_qp_grp *qp_grp) usnic_ib_qp_grp_destroy() argument 754 WARN_ON(qp_grp->state != IB_QPS_RESET); usnic_ib_qp_grp_destroy() 755 lockdep_assert_held(&qp_grp->vf->lock); usnic_ib_qp_grp_destroy() 757 release_and_remove_all_flows(qp_grp); usnic_ib_qp_grp_destroy() 758 usnic_ib_sysfs_qpn_remove(qp_grp); usnic_ib_qp_grp_destroy() 759 qp_grp_and_vf_unbind(qp_grp); usnic_ib_qp_grp_destroy() 760 free_qp_grp_res(qp_grp->res_chunk_list); usnic_ib_qp_grp_destroy() 761 kfree(qp_grp); usnic_ib_qp_grp_destroy() 765 usnic_ib_qp_grp_get_chunk(struct usnic_ib_qp_grp *qp_grp, usnic_ib_qp_grp_get_chunk() argument 770 for (i = 0; qp_grp->res_chunk_list[i]; i++) { usnic_ib_qp_grp_get_chunk() 771 if (qp_grp->res_chunk_list[i]->type == res_type) usnic_ib_qp_grp_get_chunk() 772 return qp_grp->res_chunk_list[i]; usnic_ib_qp_grp_get_chunk() 592 qp_grp_and_vf_bind(struct usnic_ib_vf *vf, struct usnic_ib_pd *pd, struct usnic_ib_qp_grp *qp_grp) qp_grp_and_vf_bind() argument
|
H A D | usnic_ib_verbs.c | 57 static int usnic_ib_fill_create_qp_resp(struct usnic_ib_qp_grp *qp_grp, usnic_ib_fill_create_qp_resp() argument 70 us_ibdev = qp_grp->vf->pf; usnic_ib_fill_create_qp_resp() 71 pdev = usnic_vnic_get_pdev(qp_grp->vf->vnic); usnic_ib_fill_create_qp_resp() 73 usnic_err("Failed to get pdev of qp_grp %d\n", usnic_ib_fill_create_qp_resp() 74 qp_grp->grp_id); usnic_ib_fill_create_qp_resp() 78 bar = usnic_vnic_get_bar(qp_grp->vf->vnic, 0); usnic_ib_fill_create_qp_resp() 80 usnic_err("Failed to get bar0 of qp_grp %d vf %s", usnic_ib_fill_create_qp_resp() 81 qp_grp->grp_id, pci_name(pdev)); usnic_ib_fill_create_qp_resp() 85 resp.vfid = usnic_vnic_get_index(qp_grp->vf->vnic); usnic_ib_fill_create_qp_resp() 89 chunk = usnic_ib_qp_grp_get_chunk(qp_grp, USNIC_VNIC_RES_TYPE_RQ); usnic_ib_fill_create_qp_resp() 91 usnic_err("Failed to get chunk %s for qp_grp %d with err %ld\n", usnic_ib_fill_create_qp_resp() 93 qp_grp->grp_id, usnic_ib_fill_create_qp_resp() 103 chunk = usnic_ib_qp_grp_get_chunk(qp_grp, USNIC_VNIC_RES_TYPE_WQ); usnic_ib_fill_create_qp_resp() 105 usnic_err("Failed to get chunk %s for qp_grp %d with err %ld\n", usnic_ib_fill_create_qp_resp() 107 qp_grp->grp_id, usnic_ib_fill_create_qp_resp() 117 chunk = usnic_ib_qp_grp_get_chunk(qp_grp, USNIC_VNIC_RES_TYPE_CQ); usnic_ib_fill_create_qp_resp() 119 usnic_err("Failed to get chunk %s for qp_grp %d with err %ld\n", usnic_ib_fill_create_qp_resp() 121 qp_grp->grp_id, usnic_ib_fill_create_qp_resp() 131 default_flow = list_first_entry(&qp_grp->flows_lst, usnic_ib_fill_create_qp_resp() 152 struct usnic_ib_qp_grp *qp_grp; find_free_vf_and_create_qp_grp() local 205 qp_grp = usnic_ib_qp_grp_create(us_ibdev->ufdev, vf, pd, res_spec, find_free_vf_and_create_qp_grp() 208 if (IS_ERR_OR_NULL(qp_grp)) { find_free_vf_and_create_qp_grp() 209 usnic_err("Failed to allocate qp_grp\n"); find_free_vf_and_create_qp_grp() 210 return ERR_PTR(qp_grp ? PTR_ERR(qp_grp) : -ENOMEM); find_free_vf_and_create_qp_grp() 213 return qp_grp; find_free_vf_and_create_qp_grp() 216 static void qp_grp_destroy(struct usnic_ib_qp_grp *qp_grp) qp_grp_destroy() argument 218 struct usnic_ib_vf *vf = qp_grp->vf; qp_grp_destroy() 220 WARN_ON(qp_grp->state != IB_QPS_RESET); qp_grp_destroy() 223 usnic_ib_qp_grp_destroy(qp_grp); qp_grp_destroy() 374 struct usnic_ib_qp_grp *qp_grp; usnic_ib_query_qp() local 383 qp_grp = to_uqp_grp(qp); usnic_ib_query_qp() 384 vf = qp_grp->vf; usnic_ib_query_qp() 387 qp_attr->qp_state = qp_grp->state; usnic_ib_query_qp() 388 qp_attr->cur_qp_state = qp_grp->state; usnic_ib_query_qp() 390 switch (qp_grp->ibqp.qp_type) { usnic_ib_query_qp() 395 usnic_err("Unexpected qp_type %d\n", qp_grp->ibqp.qp_type); usnic_ib_query_qp() 476 struct usnic_ib_qp_grp *qp_grp; usnic_ib_create_qp() local 516 qp_grp = find_free_vf_and_create_qp_grp(us_ibdev, to_upd(pd), usnic_ib_create_qp() 519 if (IS_ERR_OR_NULL(qp_grp)) { usnic_ib_create_qp() 520 err = qp_grp ? PTR_ERR(qp_grp) : -ENOMEM; usnic_ib_create_qp() 524 err = usnic_ib_fill_create_qp_resp(qp_grp, udata); usnic_ib_create_qp() 530 qp_grp->ctx = ucontext; usnic_ib_create_qp() 531 list_add_tail(&qp_grp->link, &ucontext->qp_grp_list); usnic_ib_create_qp() 532 usnic_ib_log_vf(qp_grp->vf); usnic_ib_create_qp() 534 return &qp_grp->ibqp; usnic_ib_create_qp() 537 qp_grp_destroy(qp_grp); usnic_ib_create_qp() 545 struct usnic_ib_qp_grp *qp_grp; usnic_ib_destroy_qp() local 550 qp_grp = to_uqp_grp(qp); usnic_ib_destroy_qp() 551 vf = qp_grp->vf; usnic_ib_destroy_qp() 553 if (usnic_ib_qp_grp_modify(qp_grp, IB_QPS_RESET, NULL)) { usnic_ib_destroy_qp() 555 qp_grp->grp_id); usnic_ib_destroy_qp() 558 list_del(&qp_grp->link); usnic_ib_destroy_qp() 559 qp_grp_destroy(qp_grp); usnic_ib_destroy_qp() 568 struct usnic_ib_qp_grp *qp_grp; usnic_ib_modify_qp() local 572 qp_grp = to_uqp_grp(ibqp); usnic_ib_modify_qp() 575 mutex_lock(&qp_grp->vf->pf->usdev_lock); usnic_ib_modify_qp() 577 status = usnic_ib_qp_grp_modify(qp_grp, IB_QPS_INIT, NULL); usnic_ib_modify_qp() 579 status = usnic_ib_qp_grp_modify(qp_grp, IB_QPS_RTR, NULL); usnic_ib_modify_qp() 581 status = usnic_ib_qp_grp_modify(qp_grp, IB_QPS_RTS, NULL); usnic_ib_modify_qp() 588 mutex_unlock(&qp_grp->vf->pf->usdev_lock); usnic_ib_modify_qp() 695 struct usnic_ib_qp_grp *qp_grp; usnic_ib_mmap() local 712 list_for_each_entry(qp_grp, &uctx->qp_grp_list, link) { usnic_ib_mmap() 713 vf = qp_grp->vf; usnic_ib_mmap()
|
H A D | usnic_ib_sysfs.c | 224 struct usnic_ib_qp_grp *qp_grp; usnic_ib_qpn_attr_show() local 227 qp_grp = container_of(kobj, struct usnic_ib_qp_grp, kobj); usnic_ib_qpn_attr_show() 230 return qpn_attr->show(qp_grp, buf); usnic_ib_qpn_attr_show() 240 static ssize_t context_show(struct usnic_ib_qp_grp *qp_grp, char *buf) context_show() argument 242 return scnprintf(buf, PAGE_SIZE, "0x%p\n", qp_grp->ctx); context_show() 245 static ssize_t summary_show(struct usnic_ib_qp_grp *qp_grp, char *buf) summary_show() argument 258 qp_grp->ibqp.qp_num, summary_show() 259 usnic_ib_qp_grp_state_to_string(qp_grp->state), summary_show() 260 qp_grp->owner_pid, summary_show() 261 usnic_vnic_get_index(qp_grp->vf->vnic)); summary_show() 264 for (i = 0; qp_grp->res_chunk_list[i]; i++) { summary_show() 265 res_chunk = qp_grp->res_chunk_list[i]; summary_show() 332 void usnic_ib_sysfs_qpn_add(struct usnic_ib_qp_grp *qp_grp) usnic_ib_sysfs_qpn_add() argument 337 us_ibdev = qp_grp->vf->pf; usnic_ib_sysfs_qpn_add() 339 err = kobject_init_and_add(&qp_grp->kobj, &usnic_ib_qpn_type, usnic_ib_sysfs_qpn_add() 341 "%d", qp_grp->grp_id); usnic_ib_sysfs_qpn_add() 348 void usnic_ib_sysfs_qpn_remove(struct usnic_ib_qp_grp *qp_grp) usnic_ib_sysfs_qpn_remove() argument 352 us_ibdev = qp_grp->vf->pf; usnic_ib_sysfs_qpn_remove() 354 kobject_put(&qp_grp->kobj); usnic_ib_sysfs_qpn_remove()
|
H A D | usnic_ib_qp_grp.h | 79 struct usnic_ib_qp_grp *qp_grp; member in struct:usnic_ib_qp_grp_flow 120 void usnic_ib_qp_grp_destroy(struct usnic_ib_qp_grp *qp_grp); 121 int usnic_ib_qp_grp_modify(struct usnic_ib_qp_grp *qp_grp, 125 *usnic_ib_qp_grp_get_chunk(struct usnic_ib_qp_grp *qp_grp,
|
H A D | usnic_ib_sysfs.h | 41 void usnic_ib_sysfs_qpn_add(struct usnic_ib_qp_grp *qp_grp); 42 void usnic_ib_sysfs_qpn_remove(struct usnic_ib_qp_grp *qp_grp);
|
H A D | usnic_debugfs.c | 85 spin_lock(&qp_flow->qp_grp->lock); flowinfo_read() 88 qp_flow->qp_grp->grp_id, flowinfo_read() 102 spin_unlock(&qp_flow->qp_grp->lock); flowinfo_read()
|
H A D | usnic_ib_main.c | 119 struct usnic_ib_qp_grp *qp_grp; usnic_ib_qp_grp_modify_active_to_err() local 126 list_for_each_entry(qp_grp, &ctx->qp_grp_list, link) { usnic_ib_qp_grp_modify_active_to_err() 127 cur_state = qp_grp->state; usnic_ib_qp_grp_modify_active_to_err() 131 status = usnic_ib_qp_grp_modify(qp_grp, usnic_ib_qp_grp_modify_active_to_err() 136 qp_grp->grp_id, usnic_ib_qp_grp_modify_active_to_err()
|