Lines Matching refs:query

693 static inline void ib_sa_disable_local_svc(struct ib_sa_query *query)  in ib_sa_disable_local_svc()  argument
695 query->flags &= ~IB_SA_ENABLE_LOCAL_SERVICE; in ib_sa_disable_local_svc()
698 static inline int ib_sa_query_cancelled(struct ib_sa_query *query) in ib_sa_query_cancelled() argument
700 return (query->flags & IB_SA_CANCEL); in ib_sa_query_cancelled()
704 struct ib_sa_query *query) in ib_nl_set_path_rec_attrs() argument
706 struct sa_path_rec *sa_rec = query->mad_buf->context[1]; in ib_nl_set_path_rec_attrs()
707 struct ib_sa_mad *mad = query->mad_buf->mad; in ib_nl_set_path_rec_attrs()
713 query->mad_buf->context[1] = NULL; in ib_nl_set_path_rec_attrs()
718 dev_name(&query->port->agent->device->dev), in ib_nl_set_path_rec_attrs()
720 header->port_num = query->port->port_num; in ib_nl_set_path_rec_attrs()
724 query->path_use = LS_RESOLVE_PATH_USE_ALL; in ib_nl_set_path_rec_attrs()
726 query->path_use = LS_RESOLVE_PATH_USE_UNIDIRECTIONAL; in ib_nl_set_path_rec_attrs()
727 header->path_use = query->path_use; in ib_nl_set_path_rec_attrs()
787 static int ib_nl_make_request(struct ib_sa_query *query, gfp_t gfp_mask) in ib_nl_make_request() argument
799 INIT_LIST_HEAD(&query->list); in ib_nl_make_request()
800 query->seq = (u32)atomic_inc_return(&ib_nl_sa_request_seq); in ib_nl_make_request()
802 mad = query->mad_buf->mad; in ib_nl_make_request()
812 data = ibnl_put_msg(skb, &nlh, query->seq, 0, RDMA_NL_LS, in ib_nl_make_request()
820 ib_nl_set_path_rec_attrs(skb, query); in ib_nl_make_request()
836 query->timeout = delay + jiffies; in ib_nl_make_request()
837 list_add_tail(&query->list, &ib_nl_request_list); in ib_nl_make_request()
839 if (ib_nl_request_list.next == &query->list) in ib_nl_make_request()
848 static int ib_nl_cancel_request(struct ib_sa_query *query) in ib_nl_cancel_request() argument
857 if (query == wait_query) { in ib_nl_cancel_request()
858 query->flags |= IB_SA_CANCEL; in ib_nl_cancel_request()
859 query->timeout = jiffies; in ib_nl_cancel_request()
860 list_move(&query->list, &ib_nl_request_list); in ib_nl_cancel_request()
874 static void ib_nl_process_good_resolve_rsp(struct ib_sa_query *query, in ib_nl_process_good_resolve_rsp() argument
886 if (!query->callback) in ib_nl_process_good_resolve_rsp()
889 path_query = container_of(query, struct ib_sa_path_query, sa_query); in ib_nl_process_good_resolve_rsp()
890 mad = query->mad_buf->mad; in ib_nl_process_good_resolve_rsp()
894 query->resp_pr_data = kvcalloc(RDMA_PRIMARY_PATH_MAX_REC_NUM, in ib_nl_process_good_resolve_rsp()
896 if (!query->resp_pr_data) { in ib_nl_process_good_resolve_rsp()
897 query->callback(query, -ENOMEM, 0, NULL); in ib_nl_process_good_resolve_rsp()
904 switch (query->path_use) { in ib_nl_process_good_resolve_rsp()
920 drec = (struct ib_path_rec_data *)query->resp_pr_data; in ib_nl_process_good_resolve_rsp()
947 query->callback(query, status, num_prs, mad); in ib_nl_process_good_resolve_rsp()
948 kvfree(query->resp_pr_data); in ib_nl_process_good_resolve_rsp()
949 query->resp_pr_data = NULL; in ib_nl_process_good_resolve_rsp()
952 mad_send_wc.send_buf = query->mad_buf; in ib_nl_process_good_resolve_rsp()
954 send_handler(query->mad_buf->mad_agent, &mad_send_wc); in ib_nl_process_good_resolve_rsp()
960 struct ib_sa_query *query; in ib_nl_request_timeout() local
967 query = list_entry(ib_nl_request_list.next, in ib_nl_request_timeout()
970 if (time_after(query->timeout, jiffies)) { in ib_nl_request_timeout()
971 delay = query->timeout - jiffies; in ib_nl_request_timeout()
978 list_del(&query->list); in ib_nl_request_timeout()
979 ib_sa_disable_local_svc(query); in ib_nl_request_timeout()
981 if (ib_sa_query_cancelled(query)) in ib_nl_request_timeout()
984 ret = ib_post_send_mad(query->mad_buf, NULL); in ib_nl_request_timeout()
986 mad_send_wc.send_buf = query->mad_buf; in ib_nl_request_timeout()
989 send_handler(query->port->agent, &mad_send_wc); in ib_nl_request_timeout()
1003 struct ib_sa_query *query; in ib_nl_handle_set_timeout() local
1033 list_for_each_entry(query, &ib_nl_request_list, list) { in ib_nl_handle_set_timeout()
1034 if (delta < 0 && abs_delta > query->timeout) in ib_nl_handle_set_timeout()
1035 query->timeout = 0; in ib_nl_handle_set_timeout()
1037 query->timeout += delta; in ib_nl_handle_set_timeout()
1041 delay = query->timeout - jiffies; in ib_nl_handle_set_timeout()
1077 struct ib_sa_query *query = NULL, *iter; in ib_nl_handle_resolve_resp() local
1095 query = iter; in ib_nl_handle_resolve_resp()
1101 if (!query) { in ib_nl_handle_resolve_resp()
1106 send_buf = query->mad_buf; in ib_nl_handle_resolve_resp()
1110 ib_sa_disable_local_svc(query); in ib_nl_handle_resolve_resp()
1111 ret = ib_post_send_mad(query->mad_buf, NULL); in ib_nl_handle_resolve_resp()
1116 send_handler(query->port->agent, &mad_send_wc); in ib_nl_handle_resolve_resp()
1120 ib_nl_process_good_resolve_rsp(query, nlh); in ib_nl_handle_resolve_resp()
1158 void ib_sa_cancel_query(int id, struct ib_sa_query *query) in ib_sa_cancel_query() argument
1164 if (xa_load(&queries, id) != query) { in ib_sa_cancel_query()
1168 mad_buf = query->mad_buf; in ib_sa_cancel_query()
1176 if (!ib_nl_cancel_request(query)) in ib_sa_cancel_query()
1275 static int alloc_mad(struct ib_sa_query *query, gfp_t gfp_mask) in alloc_mad() argument
1280 spin_lock_irqsave(&query->port->ah_lock, flags); in alloc_mad()
1281 if (!query->port->sm_ah) { in alloc_mad()
1282 spin_unlock_irqrestore(&query->port->ah_lock, flags); in alloc_mad()
1285 kref_get(&query->port->sm_ah->ref); in alloc_mad()
1286 query->sm_ah = query->port->sm_ah; in alloc_mad()
1287 spin_unlock_irqrestore(&query->port->ah_lock, flags); in alloc_mad()
1293 if ((rdma_query_ah(query->sm_ah->ah, &ah_attr) < 0) || in alloc_mad()
1295 kref_put(&query->sm_ah->ref, free_sm_ah); in alloc_mad()
1298 query->mad_buf = ib_create_send_mad(query->port->agent, 1, in alloc_mad()
1299 query->sm_ah->pkey_index, in alloc_mad()
1302 ((query->flags & IB_SA_QUERY_OPA) ? in alloc_mad()
1305 if (IS_ERR(query->mad_buf)) { in alloc_mad()
1306 kref_put(&query->sm_ah->ref, free_sm_ah); in alloc_mad()
1310 query->mad_buf->ah = query->sm_ah->ah; in alloc_mad()
1315 static void free_mad(struct ib_sa_query *query) in free_mad() argument
1317 ib_free_send_mad(query->mad_buf); in free_mad()
1318 kref_put(&query->sm_ah->ref, free_sm_ah); in free_mad()
1321 static void init_mad(struct ib_sa_query *query, struct ib_mad_agent *agent) in init_mad() argument
1323 struct ib_sa_mad *mad = query->mad_buf->mad; in init_mad()
1328 if (query->flags & IB_SA_QUERY_OPA) { in init_mad()
1342 static int send_mad(struct ib_sa_query *query, unsigned long timeout_ms, in send_mad() argument
1350 ret = __xa_alloc(&queries, &id, query, xa_limit_32b, gfp_mask); in send_mad()
1355 query->mad_buf->timeout_ms = timeout_ms / nmbr_sa_query_retries; in send_mad()
1356 query->mad_buf->retries = nmbr_sa_query_retries; in send_mad()
1357 if (!query->mad_buf->timeout_ms) { in send_mad()
1359 query->mad_buf->timeout_ms = 1; in send_mad()
1360 query->mad_buf->retries = timeout_ms; in send_mad()
1362 query->mad_buf->context[0] = query; in send_mad()
1363 query->id = id; in send_mad()
1365 if ((query->flags & IB_SA_ENABLE_LOCAL_SERVICE) && in send_mad()
1366 (!(query->flags & IB_SA_QUERY_OPA))) { in send_mad()
1368 if (!ib_nl_make_request(query, gfp_mask)) in send_mad()
1371 ib_sa_disable_local_svc(query); in send_mad()
1374 ret = ib_post_send_mad(query->mad_buf, NULL); in send_mad()
1454 static void ib_sa_pr_callback_single(struct ib_sa_path_query *query, in ib_sa_pr_callback_single() argument
1464 if (query->conv_pr) { in ib_sa_pr_callback_single()
1469 query->callback(status, &opa, 1, query->context); in ib_sa_pr_callback_single()
1471 query->callback(status, &rec, 1, query->context); in ib_sa_pr_callback_single()
1483 static void ib_sa_pr_callback_multiple(struct ib_sa_path_query *query, in ib_sa_pr_callback_multiple() argument
1492 query->callback(-ENOMEM, NULL, 0, query->context); in ib_sa_pr_callback_multiple()
1504 query->callback(status, rec, num_prs, query->context); in ib_sa_pr_callback_multiple()
1512 struct ib_sa_path_query *query = in ib_sa_path_rec_callback() local
1517 query->callback(status, NULL, 0, query->context); in ib_sa_path_rec_callback()
1523 query->callback(-EINVAL, NULL, 0, query->context); in ib_sa_path_rec_callback()
1530 query->callback(status, &rec, num_prs, query->context); in ib_sa_path_rec_callback()
1533 ib_sa_pr_callback_single(query, status, mad); in ib_sa_path_rec_callback()
1535 ib_sa_pr_callback_multiple(query, status, num_prs, in ib_sa_path_rec_callback()
1542 struct ib_sa_path_query *query = in ib_sa_path_rec_release() local
1545 kfree(query->conv_pr); in ib_sa_path_rec_release()
1546 kfree(query); in ib_sa_path_rec_release()
1585 struct ib_sa_path_query *query; in ib_sa_path_rec_get() local
1603 query = kzalloc(sizeof(*query), gfp_mask); in ib_sa_path_rec_get()
1604 if (!query) in ib_sa_path_rec_get()
1607 query->sa_query.port = port; in ib_sa_path_rec_get()
1614 query->sa_query.flags |= IB_SA_QUERY_OPA; in ib_sa_path_rec_get()
1616 query->conv_pr = in ib_sa_path_rec_get()
1617 kmalloc(sizeof(*query->conv_pr), gfp_mask); in ib_sa_path_rec_get()
1618 if (!query->conv_pr) { in ib_sa_path_rec_get()
1625 ret = alloc_mad(&query->sa_query, gfp_mask); in ib_sa_path_rec_get()
1630 query->sa_query.client = client; in ib_sa_path_rec_get()
1631 query->callback = callback; in ib_sa_path_rec_get()
1632 query->context = context; in ib_sa_path_rec_get()
1634 mad = query->sa_query.mad_buf->mad; in ib_sa_path_rec_get()
1635 init_mad(&query->sa_query, agent); in ib_sa_path_rec_get()
1637 query->sa_query.callback = callback ? ib_sa_path_rec_callback : NULL; in ib_sa_path_rec_get()
1638 query->sa_query.release = ib_sa_path_rec_release; in ib_sa_path_rec_get()
1643 if (query->sa_query.flags & IB_SA_QUERY_OPA) { in ib_sa_path_rec_get()
1646 } else if (query->conv_pr) { in ib_sa_path_rec_get()
1647 sa_convert_path_opa_to_ib(query->conv_pr, rec); in ib_sa_path_rec_get()
1649 query->conv_pr, mad->data); in ib_sa_path_rec_get()
1655 *sa_query = &query->sa_query; in ib_sa_path_rec_get()
1657 query->sa_query.flags |= IB_SA_ENABLE_LOCAL_SERVICE; in ib_sa_path_rec_get()
1658 query->sa_query.mad_buf->context[1] = (query->conv_pr) ? in ib_sa_path_rec_get()
1659 query->conv_pr : rec; in ib_sa_path_rec_get()
1661 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); in ib_sa_path_rec_get()
1669 ib_sa_client_put(query->sa_query.client); in ib_sa_path_rec_get()
1670 free_mad(&query->sa_query); in ib_sa_path_rec_get()
1672 kfree(query->conv_pr); in ib_sa_path_rec_get()
1674 kfree(query); in ib_sa_path_rec_get()
1683 struct ib_sa_mcmember_query *query = in ib_sa_mcmember_rec_callback() local
1691 query->callback(status, &rec, query->context); in ib_sa_mcmember_rec_callback()
1693 query->callback(status, NULL, query->context); in ib_sa_mcmember_rec_callback()
1713 struct ib_sa_mcmember_query *query; in ib_sa_mcmember_rec_query() local
1726 query = kzalloc(sizeof(*query), gfp_mask); in ib_sa_mcmember_rec_query()
1727 if (!query) in ib_sa_mcmember_rec_query()
1730 query->sa_query.port = port; in ib_sa_mcmember_rec_query()
1731 ret = alloc_mad(&query->sa_query, gfp_mask); in ib_sa_mcmember_rec_query()
1736 query->sa_query.client = client; in ib_sa_mcmember_rec_query()
1737 query->callback = callback; in ib_sa_mcmember_rec_query()
1738 query->context = context; in ib_sa_mcmember_rec_query()
1740 mad = query->sa_query.mad_buf->mad; in ib_sa_mcmember_rec_query()
1741 init_mad(&query->sa_query, agent); in ib_sa_mcmember_rec_query()
1743 query->sa_query.callback = callback ? ib_sa_mcmember_rec_callback : NULL; in ib_sa_mcmember_rec_query()
1744 query->sa_query.release = ib_sa_mcmember_rec_release; in ib_sa_mcmember_rec_query()
1752 *sa_query = &query->sa_query; in ib_sa_mcmember_rec_query()
1754 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); in ib_sa_mcmember_rec_query()
1762 ib_sa_client_put(query->sa_query.client); in ib_sa_mcmember_rec_query()
1763 free_mad(&query->sa_query); in ib_sa_mcmember_rec_query()
1766 kfree(query); in ib_sa_mcmember_rec_query()
1775 struct ib_sa_guidinfo_query *query = in ib_sa_guidinfo_rec_callback() local
1783 query->callback(status, &rec, query->context); in ib_sa_guidinfo_rec_callback()
1785 query->callback(status, NULL, query->context); in ib_sa_guidinfo_rec_callback()
1804 struct ib_sa_guidinfo_query *query; in ib_sa_guid_info_rec_query() local
1823 query = kzalloc(sizeof(*query), gfp_mask); in ib_sa_guid_info_rec_query()
1824 if (!query) in ib_sa_guid_info_rec_query()
1827 query->sa_query.port = port; in ib_sa_guid_info_rec_query()
1828 ret = alloc_mad(&query->sa_query, gfp_mask); in ib_sa_guid_info_rec_query()
1833 query->sa_query.client = client; in ib_sa_guid_info_rec_query()
1834 query->callback = callback; in ib_sa_guid_info_rec_query()
1835 query->context = context; in ib_sa_guid_info_rec_query()
1837 mad = query->sa_query.mad_buf->mad; in ib_sa_guid_info_rec_query()
1838 init_mad(&query->sa_query, agent); in ib_sa_guid_info_rec_query()
1840 query->sa_query.callback = callback ? ib_sa_guidinfo_rec_callback : NULL; in ib_sa_guid_info_rec_query()
1841 query->sa_query.release = ib_sa_guidinfo_rec_release; in ib_sa_guid_info_rec_query()
1850 *sa_query = &query->sa_query; in ib_sa_guid_info_rec_query()
1852 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); in ib_sa_guid_info_rec_query()
1860 ib_sa_client_put(query->sa_query.client); in ib_sa_guid_info_rec_query()
1861 free_mad(&query->sa_query); in ib_sa_guid_info_rec_query()
1864 kfree(query); in ib_sa_guid_info_rec_query()
1886 struct ib_sa_classport_info_query *query = in ib_sa_classport_info_rec_callback() local
1930 query->callback(query->context); in ib_sa_classport_info_rec_callback()
1946 struct ib_sa_classport_info_query *query; in ib_sa_classport_info_rec_query() local
1953 query = kzalloc(sizeof(*query), gfp_mask); in ib_sa_classport_info_rec_query()
1954 if (!query) in ib_sa_classport_info_rec_query()
1957 query->sa_query.port = port; in ib_sa_classport_info_rec_query()
1958 query->sa_query.flags |= rdma_cap_opa_ah(port->agent->device, in ib_sa_classport_info_rec_query()
1961 ret = alloc_mad(&query->sa_query, gfp_mask); in ib_sa_classport_info_rec_query()
1965 query->callback = callback; in ib_sa_classport_info_rec_query()
1966 query->context = context; in ib_sa_classport_info_rec_query()
1968 mad = query->sa_query.mad_buf->mad; in ib_sa_classport_info_rec_query()
1969 init_mad(&query->sa_query, agent); in ib_sa_classport_info_rec_query()
1971 query->sa_query.callback = ib_sa_classport_info_rec_callback; in ib_sa_classport_info_rec_query()
1972 query->sa_query.release = ib_sa_classport_info_rec_release; in ib_sa_classport_info_rec_query()
1976 *sa_query = &query->sa_query; in ib_sa_classport_info_rec_query()
1978 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); in ib_sa_classport_info_rec_query()
1986 free_mad(&query->sa_query); in ib_sa_classport_info_rec_query()
1989 kfree(query); in ib_sa_classport_info_rec_query()
2049 struct ib_sa_query *query = mad_send_wc->send_buf->context[0]; in send_handler() local
2052 if (query->callback) in send_handler()
2058 query->callback(query, -ETIMEDOUT, 0, NULL); in send_handler()
2061 query->callback(query, -EINTR, 0, NULL); in send_handler()
2064 query->callback(query, -EIO, 0, NULL); in send_handler()
2069 __xa_erase(&queries, query->id); in send_handler()
2072 free_mad(query); in send_handler()
2073 if (query->client) in send_handler()
2074 ib_sa_client_put(query->client); in send_handler()
2075 query->release(query); in send_handler()
2082 struct ib_sa_query *query; in recv_handler() local
2087 query = send_buf->context[0]; in recv_handler()
2088 if (query->callback) { in recv_handler()
2090 query->callback(query, in recv_handler()
2095 query->callback(query, -EIO, 0, NULL); in recv_handler()