Lines Matching refs:query

740 static inline void ib_sa_disable_local_svc(struct ib_sa_query *query)  in ib_sa_disable_local_svc()  argument
742 query->flags &= ~IB_SA_ENABLE_LOCAL_SERVICE; in ib_sa_disable_local_svc()
745 static inline int ib_sa_query_cancelled(struct ib_sa_query *query) in ib_sa_query_cancelled() argument
747 return (query->flags & IB_SA_CANCEL); in ib_sa_query_cancelled()
751 struct ib_sa_query *query) in ib_nl_set_path_rec_attrs() argument
753 struct sa_path_rec *sa_rec = query->mad_buf->context[1]; in ib_nl_set_path_rec_attrs()
754 struct ib_sa_mad *mad = query->mad_buf->mad; in ib_nl_set_path_rec_attrs()
760 query->mad_buf->context[1] = NULL; in ib_nl_set_path_rec_attrs()
764 memcpy(header->device_name, query->port->agent->device->name, in ib_nl_set_path_rec_attrs()
766 header->port_num = query->port->port_num; in ib_nl_set_path_rec_attrs()
770 query->path_use = LS_RESOLVE_PATH_USE_GMP; in ib_nl_set_path_rec_attrs()
772 query->path_use = LS_RESOLVE_PATH_USE_UNIDIRECTIONAL; in ib_nl_set_path_rec_attrs()
773 header->path_use = query->path_use; in ib_nl_set_path_rec_attrs()
833 static int ib_nl_send_msg(struct ib_sa_query *query, gfp_t gfp_mask) in ib_nl_send_msg() argument
842 mad = query->mad_buf->mad; in ib_nl_send_msg()
852 data = ibnl_put_msg(skb, &nlh, query->seq, 0, RDMA_NL_LS, in ib_nl_send_msg()
860 ib_nl_set_path_rec_attrs(skb, query); in ib_nl_send_msg()
874 static int ib_nl_make_request(struct ib_sa_query *query, gfp_t gfp_mask) in ib_nl_make_request() argument
880 INIT_LIST_HEAD(&query->list); in ib_nl_make_request()
881 query->seq = (u32)atomic_inc_return(&ib_nl_sa_request_seq); in ib_nl_make_request()
886 query->timeout = delay + jiffies; in ib_nl_make_request()
887 list_add_tail(&query->list, &ib_nl_request_list); in ib_nl_make_request()
889 if (ib_nl_request_list.next == &query->list) in ib_nl_make_request()
893 ret = ib_nl_send_msg(query, gfp_mask); in ib_nl_make_request()
898 list_del(&query->list); in ib_nl_make_request()
907 static int ib_nl_cancel_request(struct ib_sa_query *query) in ib_nl_cancel_request() argument
916 if (query == wait_query) { in ib_nl_cancel_request()
917 query->flags |= IB_SA_CANCEL; in ib_nl_cancel_request()
918 query->timeout = jiffies; in ib_nl_cancel_request()
919 list_move(&query->list, &ib_nl_request_list); in ib_nl_cancel_request()
933 static void ib_nl_process_good_resolve_rsp(struct ib_sa_query *query, in ib_nl_process_good_resolve_rsp() argument
944 if (query->callback) { in ib_nl_process_good_resolve_rsp()
947 switch (query->path_use) { in ib_nl_process_good_resolve_rsp()
967 mad = query->mad_buf->mad; in ib_nl_process_good_resolve_rsp()
977 query->callback(query, status, mad); in ib_nl_process_good_resolve_rsp()
980 mad_send_wc.send_buf = query->mad_buf; in ib_nl_process_good_resolve_rsp()
982 send_handler(query->mad_buf->mad_agent, &mad_send_wc); in ib_nl_process_good_resolve_rsp()
988 struct ib_sa_query *query; in ib_nl_request_timeout() local
995 query = list_entry(ib_nl_request_list.next, in ib_nl_request_timeout()
998 if (time_after(query->timeout, jiffies)) { in ib_nl_request_timeout()
999 delay = query->timeout - jiffies; in ib_nl_request_timeout()
1006 list_del(&query->list); in ib_nl_request_timeout()
1007 ib_sa_disable_local_svc(query); in ib_nl_request_timeout()
1009 if (ib_sa_query_cancelled(query)) in ib_nl_request_timeout()
1012 ret = ib_post_send_mad(query->mad_buf, NULL); in ib_nl_request_timeout()
1014 mad_send_wc.send_buf = query->mad_buf; in ib_nl_request_timeout()
1017 send_handler(query->port->agent, &mad_send_wc); in ib_nl_request_timeout()
1031 struct ib_sa_query *query; in ib_nl_handle_set_timeout() local
1061 list_for_each_entry(query, &ib_nl_request_list, list) { in ib_nl_handle_set_timeout()
1062 if (delta < 0 && abs_delta > query->timeout) in ib_nl_handle_set_timeout()
1063 query->timeout = 0; in ib_nl_handle_set_timeout()
1065 query->timeout += delta; in ib_nl_handle_set_timeout()
1069 delay = query->timeout - jiffies; in ib_nl_handle_set_timeout()
1105 struct ib_sa_query *query; in ib_nl_handle_resolve_resp() local
1116 list_for_each_entry(query, &ib_nl_request_list, list) { in ib_nl_handle_resolve_resp()
1121 if (nlh->nlmsg_seq == query->seq) { in ib_nl_handle_resolve_resp()
1122 found = !ib_sa_query_cancelled(query); in ib_nl_handle_resolve_resp()
1124 list_del(&query->list); in ib_nl_handle_resolve_resp()
1134 send_buf = query->mad_buf; in ib_nl_handle_resolve_resp()
1138 ib_sa_disable_local_svc(query); in ib_nl_handle_resolve_resp()
1139 ret = ib_post_send_mad(query->mad_buf, NULL); in ib_nl_handle_resolve_resp()
1144 send_handler(query->port->agent, &mad_send_wc); in ib_nl_handle_resolve_resp()
1148 ib_nl_process_good_resolve_rsp(query, nlh); in ib_nl_handle_resolve_resp()
1186 void ib_sa_cancel_query(int id, struct ib_sa_query *query) in ib_sa_cancel_query() argument
1193 if (idr_find(&query_idr, id) != query) { in ib_sa_cancel_query()
1197 agent = query->port->agent; in ib_sa_cancel_query()
1198 mad_buf = query->mad_buf; in ib_sa_cancel_query()
1206 if (!ib_nl_cancel_request(query)) in ib_sa_cancel_query()
1345 static int alloc_mad(struct ib_sa_query *query, gfp_t gfp_mask) in alloc_mad() argument
1350 spin_lock_irqsave(&query->port->ah_lock, flags); in alloc_mad()
1351 if (!query->port->sm_ah) { in alloc_mad()
1352 spin_unlock_irqrestore(&query->port->ah_lock, flags); in alloc_mad()
1355 kref_get(&query->port->sm_ah->ref); in alloc_mad()
1356 query->sm_ah = query->port->sm_ah; in alloc_mad()
1357 spin_unlock_irqrestore(&query->port->ah_lock, flags); in alloc_mad()
1363 if ((rdma_query_ah(query->sm_ah->ah, &ah_attr) < 0) || in alloc_mad()
1365 kref_put(&query->sm_ah->ref, free_sm_ah); in alloc_mad()
1368 query->mad_buf = ib_create_send_mad(query->port->agent, 1, in alloc_mad()
1369 query->sm_ah->pkey_index, in alloc_mad()
1372 ((query->flags & IB_SA_QUERY_OPA) ? in alloc_mad()
1375 if (IS_ERR(query->mad_buf)) { in alloc_mad()
1376 kref_put(&query->sm_ah->ref, free_sm_ah); in alloc_mad()
1380 query->mad_buf->ah = query->sm_ah->ah; in alloc_mad()
1385 static void free_mad(struct ib_sa_query *query) in free_mad() argument
1387 ib_free_send_mad(query->mad_buf); in free_mad()
1388 kref_put(&query->sm_ah->ref, free_sm_ah); in free_mad()
1391 static void init_mad(struct ib_sa_query *query, struct ib_mad_agent *agent) in init_mad() argument
1393 struct ib_sa_mad *mad = query->mad_buf->mad; in init_mad()
1398 if (query->flags & IB_SA_QUERY_OPA) { in init_mad()
1412 static int send_mad(struct ib_sa_query *query, int timeout_ms, gfp_t gfp_mask) in send_mad() argument
1422 id = idr_alloc(&query_idr, query, 0, 0, GFP_NOWAIT); in send_mad()
1430 query->mad_buf->timeout_ms = timeout_ms; in send_mad()
1431 query->mad_buf->context[0] = query; in send_mad()
1432 query->id = id; in send_mad()
1434 if ((query->flags & IB_SA_ENABLE_LOCAL_SERVICE) && in send_mad()
1435 (!(query->flags & IB_SA_QUERY_OPA))) { in send_mad()
1437 if (!ib_nl_make_request(query, gfp_mask)) in send_mad()
1440 ib_sa_disable_local_svc(query); in send_mad()
1443 ret = ib_post_send_mad(query->mad_buf, NULL); in send_mad()
1531 struct ib_sa_path_query *query = in ib_sa_path_rec_callback() local
1542 query->callback(status, &rec, query->context); in ib_sa_path_rec_callback()
1550 if (query->conv_pr) { in ib_sa_path_rec_callback()
1555 query->callback(status, &opa, query->context); in ib_sa_path_rec_callback()
1557 query->callback(status, &rec, query->context); in ib_sa_path_rec_callback()
1561 query->callback(status, NULL, query->context); in ib_sa_path_rec_callback()
1566 struct ib_sa_path_query *query = in ib_sa_path_rec_release() local
1569 kfree(query->conv_pr); in ib_sa_path_rec_release()
1570 kfree(query); in ib_sa_path_rec_release()
1609 struct ib_sa_path_query *query; in ib_sa_path_rec_get() local
1627 query = kzalloc(sizeof(*query), gfp_mask); in ib_sa_path_rec_get()
1628 if (!query) in ib_sa_path_rec_get()
1631 query->sa_query.port = port; in ib_sa_path_rec_get()
1638 query->sa_query.flags |= IB_SA_QUERY_OPA; in ib_sa_path_rec_get()
1640 query->conv_pr = in ib_sa_path_rec_get()
1641 kmalloc(sizeof(*query->conv_pr), gfp_mask); in ib_sa_path_rec_get()
1642 if (!query->conv_pr) { in ib_sa_path_rec_get()
1649 ret = alloc_mad(&query->sa_query, gfp_mask); in ib_sa_path_rec_get()
1654 query->sa_query.client = client; in ib_sa_path_rec_get()
1655 query->callback = callback; in ib_sa_path_rec_get()
1656 query->context = context; in ib_sa_path_rec_get()
1658 mad = query->sa_query.mad_buf->mad; in ib_sa_path_rec_get()
1659 init_mad(&query->sa_query, agent); in ib_sa_path_rec_get()
1661 query->sa_query.callback = callback ? ib_sa_path_rec_callback : NULL; in ib_sa_path_rec_get()
1662 query->sa_query.release = ib_sa_path_rec_release; in ib_sa_path_rec_get()
1667 if (query->sa_query.flags & IB_SA_QUERY_OPA) { in ib_sa_path_rec_get()
1670 } else if (query->conv_pr) { in ib_sa_path_rec_get()
1671 sa_convert_path_opa_to_ib(query->conv_pr, rec); in ib_sa_path_rec_get()
1673 query->conv_pr, mad->data); in ib_sa_path_rec_get()
1679 *sa_query = &query->sa_query; in ib_sa_path_rec_get()
1681 query->sa_query.flags |= IB_SA_ENABLE_LOCAL_SERVICE; in ib_sa_path_rec_get()
1682 query->sa_query.mad_buf->context[1] = (query->conv_pr) ? in ib_sa_path_rec_get()
1683 query->conv_pr : rec; in ib_sa_path_rec_get()
1685 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); in ib_sa_path_rec_get()
1693 ib_sa_client_put(query->sa_query.client); in ib_sa_path_rec_get()
1694 free_mad(&query->sa_query); in ib_sa_path_rec_get()
1696 kfree(query->conv_pr); in ib_sa_path_rec_get()
1698 kfree(query); in ib_sa_path_rec_get()
1707 struct ib_sa_service_query *query = in ib_sa_service_rec_callback() local
1715 query->callback(status, &rec, query->context); in ib_sa_service_rec_callback()
1717 query->callback(status, NULL, query->context); in ib_sa_service_rec_callback()
1763 struct ib_sa_service_query *query; in ib_sa_service_rec_query() local
1781 query = kzalloc(sizeof(*query), gfp_mask); in ib_sa_service_rec_query()
1782 if (!query) in ib_sa_service_rec_query()
1785 query->sa_query.port = port; in ib_sa_service_rec_query()
1786 ret = alloc_mad(&query->sa_query, gfp_mask); in ib_sa_service_rec_query()
1791 query->sa_query.client = client; in ib_sa_service_rec_query()
1792 query->callback = callback; in ib_sa_service_rec_query()
1793 query->context = context; in ib_sa_service_rec_query()
1795 mad = query->sa_query.mad_buf->mad; in ib_sa_service_rec_query()
1796 init_mad(&query->sa_query, agent); in ib_sa_service_rec_query()
1798 query->sa_query.callback = callback ? ib_sa_service_rec_callback : NULL; in ib_sa_service_rec_query()
1799 query->sa_query.release = ib_sa_service_rec_release; in ib_sa_service_rec_query()
1807 *sa_query = &query->sa_query; in ib_sa_service_rec_query()
1809 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); in ib_sa_service_rec_query()
1817 ib_sa_client_put(query->sa_query.client); in ib_sa_service_rec_query()
1818 free_mad(&query->sa_query); in ib_sa_service_rec_query()
1821 kfree(query); in ib_sa_service_rec_query()
1830 struct ib_sa_mcmember_query *query = in ib_sa_mcmember_rec_callback() local
1838 query->callback(status, &rec, query->context); in ib_sa_mcmember_rec_callback()
1840 query->callback(status, NULL, query->context); in ib_sa_mcmember_rec_callback()
1860 struct ib_sa_mcmember_query *query; in ib_sa_mcmember_rec_query() local
1873 query = kzalloc(sizeof(*query), gfp_mask); in ib_sa_mcmember_rec_query()
1874 if (!query) in ib_sa_mcmember_rec_query()
1877 query->sa_query.port = port; in ib_sa_mcmember_rec_query()
1878 ret = alloc_mad(&query->sa_query, gfp_mask); in ib_sa_mcmember_rec_query()
1883 query->sa_query.client = client; in ib_sa_mcmember_rec_query()
1884 query->callback = callback; in ib_sa_mcmember_rec_query()
1885 query->context = context; in ib_sa_mcmember_rec_query()
1887 mad = query->sa_query.mad_buf->mad; in ib_sa_mcmember_rec_query()
1888 init_mad(&query->sa_query, agent); in ib_sa_mcmember_rec_query()
1890 query->sa_query.callback = callback ? ib_sa_mcmember_rec_callback : NULL; in ib_sa_mcmember_rec_query()
1891 query->sa_query.release = ib_sa_mcmember_rec_release; in ib_sa_mcmember_rec_query()
1899 *sa_query = &query->sa_query; in ib_sa_mcmember_rec_query()
1901 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); in ib_sa_mcmember_rec_query()
1909 ib_sa_client_put(query->sa_query.client); in ib_sa_mcmember_rec_query()
1910 free_mad(&query->sa_query); in ib_sa_mcmember_rec_query()
1913 kfree(query); in ib_sa_mcmember_rec_query()
1922 struct ib_sa_guidinfo_query *query = in ib_sa_guidinfo_rec_callback() local
1930 query->callback(status, &rec, query->context); in ib_sa_guidinfo_rec_callback()
1932 query->callback(status, NULL, query->context); in ib_sa_guidinfo_rec_callback()
1951 struct ib_sa_guidinfo_query *query; in ib_sa_guid_info_rec_query() local
1970 query = kzalloc(sizeof(*query), gfp_mask); in ib_sa_guid_info_rec_query()
1971 if (!query) in ib_sa_guid_info_rec_query()
1974 query->sa_query.port = port; in ib_sa_guid_info_rec_query()
1975 ret = alloc_mad(&query->sa_query, gfp_mask); in ib_sa_guid_info_rec_query()
1980 query->sa_query.client = client; in ib_sa_guid_info_rec_query()
1981 query->callback = callback; in ib_sa_guid_info_rec_query()
1982 query->context = context; in ib_sa_guid_info_rec_query()
1984 mad = query->sa_query.mad_buf->mad; in ib_sa_guid_info_rec_query()
1985 init_mad(&query->sa_query, agent); in ib_sa_guid_info_rec_query()
1987 query->sa_query.callback = callback ? ib_sa_guidinfo_rec_callback : NULL; in ib_sa_guid_info_rec_query()
1988 query->sa_query.release = ib_sa_guidinfo_rec_release; in ib_sa_guid_info_rec_query()
1997 *sa_query = &query->sa_query; in ib_sa_guid_info_rec_query()
1999 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); in ib_sa_guid_info_rec_query()
2007 ib_sa_client_put(query->sa_query.client); in ib_sa_guid_info_rec_query()
2008 free_mad(&query->sa_query); in ib_sa_guid_info_rec_query()
2011 kfree(query); in ib_sa_guid_info_rec_query()
2057 struct ib_sa_classport_info_query *query = in ib_sa_classport_info_rec_callback() local
2101 query->callback(query->context); in ib_sa_classport_info_rec_callback()
2117 struct ib_sa_classport_info_query *query; in ib_sa_classport_info_rec_query() local
2124 query = kzalloc(sizeof(*query), gfp_mask); in ib_sa_classport_info_rec_query()
2125 if (!query) in ib_sa_classport_info_rec_query()
2128 query->sa_query.port = port; in ib_sa_classport_info_rec_query()
2129 query->sa_query.flags |= rdma_cap_opa_ah(port->agent->device, in ib_sa_classport_info_rec_query()
2132 ret = alloc_mad(&query->sa_query, gfp_mask); in ib_sa_classport_info_rec_query()
2136 query->callback = callback; in ib_sa_classport_info_rec_query()
2137 query->context = context; in ib_sa_classport_info_rec_query()
2139 mad = query->sa_query.mad_buf->mad; in ib_sa_classport_info_rec_query()
2140 init_mad(&query->sa_query, agent); in ib_sa_classport_info_rec_query()
2142 query->sa_query.callback = ib_sa_classport_info_rec_callback; in ib_sa_classport_info_rec_query()
2143 query->sa_query.release = ib_sa_classport_info_rec_release; in ib_sa_classport_info_rec_query()
2147 *sa_query = &query->sa_query; in ib_sa_classport_info_rec_query()
2149 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); in ib_sa_classport_info_rec_query()
2157 free_mad(&query->sa_query); in ib_sa_classport_info_rec_query()
2160 kfree(query); in ib_sa_classport_info_rec_query()
2220 struct ib_sa_query *query = mad_send_wc->send_buf->context[0]; in send_handler() local
2223 if (query->callback) in send_handler()
2229 query->callback(query, -ETIMEDOUT, NULL); in send_handler()
2232 query->callback(query, -EINTR, NULL); in send_handler()
2235 query->callback(query, -EIO, NULL); in send_handler()
2240 idr_remove(&query_idr, query->id); in send_handler()
2243 free_mad(query); in send_handler()
2244 if (query->client) in send_handler()
2245 ib_sa_client_put(query->client); in send_handler()
2246 query->release(query); in send_handler()
2253 struct ib_sa_query *query; in recv_handler() local
2258 query = send_buf->context[0]; in recv_handler()
2259 if (query->callback) { in recv_handler()
2261 query->callback(query, in recv_handler()
2266 query->callback(query, -EIO, NULL); in recv_handler()