Lines Matching full:query

739 static inline void ib_sa_disable_local_svc(struct ib_sa_query *query)  in ib_sa_disable_local_svc()  argument
741 query->flags &= ~IB_SA_ENABLE_LOCAL_SERVICE; in ib_sa_disable_local_svc()
744 static inline int ib_sa_query_cancelled(struct ib_sa_query *query) in ib_sa_query_cancelled() argument
746 return (query->flags & IB_SA_CANCEL); in ib_sa_query_cancelled()
750 struct ib_sa_query *query) in ib_nl_set_path_rec_attrs() argument
752 struct sa_path_rec *sa_rec = query->mad_buf->context[1]; in ib_nl_set_path_rec_attrs()
753 struct ib_sa_mad *mad = query->mad_buf->mad; in ib_nl_set_path_rec_attrs()
759 query->mad_buf->context[1] = NULL; in ib_nl_set_path_rec_attrs()
763 memcpy(header->device_name, dev_name(&query->port->agent->device->dev), in ib_nl_set_path_rec_attrs()
765 header->port_num = query->port->port_num; in ib_nl_set_path_rec_attrs()
769 query->path_use = LS_RESOLVE_PATH_USE_GMP; in ib_nl_set_path_rec_attrs()
771 query->path_use = LS_RESOLVE_PATH_USE_UNIDIRECTIONAL; in ib_nl_set_path_rec_attrs()
772 header->path_use = query->path_use; in ib_nl_set_path_rec_attrs()
832 static int ib_nl_make_request(struct ib_sa_query *query, gfp_t gfp_mask) in ib_nl_make_request() argument
844 INIT_LIST_HEAD(&query->list); in ib_nl_make_request()
845 query->seq = (u32)atomic_inc_return(&ib_nl_sa_request_seq); in ib_nl_make_request()
847 mad = query->mad_buf->mad; in ib_nl_make_request()
857 data = ibnl_put_msg(skb, &nlh, query->seq, 0, RDMA_NL_LS, in ib_nl_make_request()
865 ib_nl_set_path_rec_attrs(skb, query); in ib_nl_make_request()
881 query->timeout = delay + jiffies; in ib_nl_make_request()
882 list_add_tail(&query->list, &ib_nl_request_list); in ib_nl_make_request()
884 if (ib_nl_request_list.next == &query->list) in ib_nl_make_request()
893 static int ib_nl_cancel_request(struct ib_sa_query *query) in ib_nl_cancel_request() argument
902 if (query == wait_query) { in ib_nl_cancel_request()
903 query->flags |= IB_SA_CANCEL; in ib_nl_cancel_request()
904 query->timeout = jiffies; in ib_nl_cancel_request()
905 list_move(&query->list, &ib_nl_request_list); in ib_nl_cancel_request()
919 static void ib_nl_process_good_resolve_rsp(struct ib_sa_query *query, in ib_nl_process_good_resolve_rsp() argument
930 if (query->callback) { in ib_nl_process_good_resolve_rsp()
933 switch (query->path_use) { in ib_nl_process_good_resolve_rsp()
953 mad = query->mad_buf->mad; in ib_nl_process_good_resolve_rsp()
963 query->callback(query, status, mad); in ib_nl_process_good_resolve_rsp()
966 mad_send_wc.send_buf = query->mad_buf; in ib_nl_process_good_resolve_rsp()
968 send_handler(query->mad_buf->mad_agent, &mad_send_wc); in ib_nl_process_good_resolve_rsp()
974 struct ib_sa_query *query; in ib_nl_request_timeout() local
981 query = list_entry(ib_nl_request_list.next, in ib_nl_request_timeout()
984 if (time_after(query->timeout, jiffies)) { in ib_nl_request_timeout()
985 delay = query->timeout - jiffies; in ib_nl_request_timeout()
992 list_del(&query->list); in ib_nl_request_timeout()
993 ib_sa_disable_local_svc(query); in ib_nl_request_timeout()
994 /* Hold the lock to protect against query cancellation */ in ib_nl_request_timeout()
995 if (ib_sa_query_cancelled(query)) in ib_nl_request_timeout()
998 ret = ib_post_send_mad(query->mad_buf, NULL); in ib_nl_request_timeout()
1000 mad_send_wc.send_buf = query->mad_buf; in ib_nl_request_timeout()
1003 send_handler(query->port->agent, &mad_send_wc); in ib_nl_request_timeout()
1017 struct ib_sa_query *query; in ib_nl_handle_set_timeout() local
1047 list_for_each_entry(query, &ib_nl_request_list, list) { in ib_nl_handle_set_timeout()
1048 if (delta < 0 && abs_delta > query->timeout) in ib_nl_handle_set_timeout()
1049 query->timeout = 0; in ib_nl_handle_set_timeout()
1051 query->timeout += delta; in ib_nl_handle_set_timeout()
1055 delay = query->timeout - jiffies; in ib_nl_handle_set_timeout()
1091 struct ib_sa_query *query; in ib_nl_handle_resolve_resp() local
1102 list_for_each_entry(query, &ib_nl_request_list, list) { in ib_nl_handle_resolve_resp()
1104 * If the query is cancelled, let the timeout routine in ib_nl_handle_resolve_resp()
1107 if (nlh->nlmsg_seq == query->seq) { in ib_nl_handle_resolve_resp()
1108 found = !ib_sa_query_cancelled(query); in ib_nl_handle_resolve_resp()
1110 list_del(&query->list); in ib_nl_handle_resolve_resp()
1120 send_buf = query->mad_buf; in ib_nl_handle_resolve_resp()
1124 ib_sa_disable_local_svc(query); in ib_nl_handle_resolve_resp()
1125 ret = ib_post_send_mad(query->mad_buf, NULL); in ib_nl_handle_resolve_resp()
1130 send_handler(query->port->agent, &mad_send_wc); in ib_nl_handle_resolve_resp()
1134 ib_nl_process_good_resolve_rsp(query, nlh); in ib_nl_handle_resolve_resp()
1164 * ib_sa_cancel_query - try to cancel an SA query
1165 * @id:ID of query to cancel
1166 * @query:query pointer to cancel
1168 * Try to cancel an SA query. If the id and query don't match up or
1169 * the query has already completed, nothing is done. Otherwise the
1170 * query is canceled and will complete with a status of -EINTR.
1172 void ib_sa_cancel_query(int id, struct ib_sa_query *query) in ib_sa_cancel_query() argument
1179 if (xa_load(&queries, id) != query) { in ib_sa_cancel_query()
1183 agent = query->port->agent; in ib_sa_cancel_query()
1184 mad_buf = query->mad_buf; in ib_sa_cancel_query()
1188 * If the query is still on the netlink request list, schedule in ib_sa_cancel_query()
1192 if (!ib_nl_cancel_request(query)) in ib_sa_cancel_query()
1291 static int alloc_mad(struct ib_sa_query *query, gfp_t gfp_mask) in alloc_mad() argument
1296 spin_lock_irqsave(&query->port->ah_lock, flags); in alloc_mad()
1297 if (!query->port->sm_ah) { in alloc_mad()
1298 spin_unlock_irqrestore(&query->port->ah_lock, flags); in alloc_mad()
1301 kref_get(&query->port->sm_ah->ref); in alloc_mad()
1302 query->sm_ah = query->port->sm_ah; in alloc_mad()
1303 spin_unlock_irqrestore(&query->port->ah_lock, flags); in alloc_mad()
1309 if ((rdma_query_ah(query->sm_ah->ah, &ah_attr) < 0) || in alloc_mad()
1311 kref_put(&query->sm_ah->ref, free_sm_ah); in alloc_mad()
1314 query->mad_buf = ib_create_send_mad(query->port->agent, 1, in alloc_mad()
1315 query->sm_ah->pkey_index, in alloc_mad()
1318 ((query->flags & IB_SA_QUERY_OPA) ? in alloc_mad()
1321 if (IS_ERR(query->mad_buf)) { in alloc_mad()
1322 kref_put(&query->sm_ah->ref, free_sm_ah); in alloc_mad()
1326 query->mad_buf->ah = query->sm_ah->ah; in alloc_mad()
1331 static void free_mad(struct ib_sa_query *query) in free_mad() argument
1333 ib_free_send_mad(query->mad_buf); in free_mad()
1334 kref_put(&query->sm_ah->ref, free_sm_ah); in free_mad()
1337 static void init_mad(struct ib_sa_query *query, struct ib_mad_agent *agent) in init_mad() argument
1339 struct ib_sa_mad *mad = query->mad_buf->mad; in init_mad()
1344 if (query->flags & IB_SA_QUERY_OPA) { in init_mad()
1358 static int send_mad(struct ib_sa_query *query, unsigned long timeout_ms, in send_mad() argument
1365 ret = __xa_alloc(&queries, &id, query, xa_limit_32b, gfp_mask); in send_mad()
1370 query->mad_buf->timeout_ms = timeout_ms; in send_mad()
1371 query->mad_buf->context[0] = query; in send_mad()
1372 query->id = id; in send_mad()
1374 if ((query->flags & IB_SA_ENABLE_LOCAL_SERVICE) && in send_mad()
1375 (!(query->flags & IB_SA_QUERY_OPA))) { in send_mad()
1377 if (!ib_nl_make_request(query, gfp_mask)) in send_mad()
1380 ib_sa_disable_local_svc(query); in send_mad()
1383 ret = ib_post_send_mad(query->mad_buf, NULL); in send_mad()
1391 * It's not safe to dereference query any more, because the in send_mad()
1392 * send may already have completed and freed the query in in send_mad()
1438 * Check if current PR query can be an OPA query.
1439 * Retuns PR_NOT_SUPPORTED if a path record query is not
1440 * possible, PR_OPA_SUPPORTED if an OPA path record query
1442 * query is possible.
1467 struct ib_sa_path_query *query = in ib_sa_path_rec_callback() local
1478 query->callback(status, &rec, query->context); in ib_sa_path_rec_callback()
1486 if (query->conv_pr) { in ib_sa_path_rec_callback()
1491 query->callback(status, &opa, query->context); in ib_sa_path_rec_callback()
1493 query->callback(status, &rec, query->context); in ib_sa_path_rec_callback()
1497 query->callback(status, NULL, query->context); in ib_sa_path_rec_callback()
1502 struct ib_sa_path_query *query = in ib_sa_path_rec_release() local
1505 kfree(query->conv_pr); in ib_sa_path_rec_release()
1506 kfree(query); in ib_sa_path_rec_release()
1510 * ib_sa_path_rec_get - Start a Path get query
1512 * @device:device to send query on
1513 * @port_num: port number to send query on
1514 * @rec:Path Record to send in query
1515 * @comp_mask:component mask to send in query
1518 * @callback:function called when query completes, times out or is
1521 * @sa_query:query context, used to cancel query
1523 * Send a Path Record Get query to the SA to look up a path. The
1524 * callback function will be called when the query completes (or
1525 * fails); status is 0 for a successful response, -EINTR if the query
1526 * is canceled, -ETIMEDOUT is the query timed out, or -EIO if an error
1527 * occurred sending the query. The resp parameter of the callback is
1531 * error code. Otherwise it is a query ID that can be used to cancel
1532 * the query.
1545 struct ib_sa_path_query *query; in ib_sa_path_rec_get() local
1563 query = kzalloc(sizeof(*query), gfp_mask); in ib_sa_path_rec_get()
1564 if (!query) in ib_sa_path_rec_get()
1567 query->sa_query.port = port; in ib_sa_path_rec_get()
1575 query->sa_query.flags |= IB_SA_QUERY_OPA; in ib_sa_path_rec_get()
1577 query->conv_pr = in ib_sa_path_rec_get()
1578 kmalloc(sizeof(*query->conv_pr), gfp_mask); in ib_sa_path_rec_get()
1579 if (!query->conv_pr) { in ib_sa_path_rec_get()
1586 ret = alloc_mad(&query->sa_query, gfp_mask); in ib_sa_path_rec_get()
1591 query->sa_query.client = client; in ib_sa_path_rec_get()
1592 query->callback = callback; in ib_sa_path_rec_get()
1593 query->context = context; in ib_sa_path_rec_get()
1595 mad = query->sa_query.mad_buf->mad; in ib_sa_path_rec_get()
1596 init_mad(&query->sa_query, agent); in ib_sa_path_rec_get()
1598 query->sa_query.callback = callback ? ib_sa_path_rec_callback : NULL; in ib_sa_path_rec_get()
1599 query->sa_query.release = ib_sa_path_rec_release; in ib_sa_path_rec_get()
1604 if (query->sa_query.flags & IB_SA_QUERY_OPA) { in ib_sa_path_rec_get()
1607 } else if (query->conv_pr) { in ib_sa_path_rec_get()
1608 sa_convert_path_opa_to_ib(query->conv_pr, rec); in ib_sa_path_rec_get()
1610 query->conv_pr, mad->data); in ib_sa_path_rec_get()
1616 *sa_query = &query->sa_query; in ib_sa_path_rec_get()
1618 query->sa_query.flags |= IB_SA_ENABLE_LOCAL_SERVICE; in ib_sa_path_rec_get()
1619 query->sa_query.mad_buf->context[1] = (query->conv_pr) ? in ib_sa_path_rec_get()
1620 query->conv_pr : rec; in ib_sa_path_rec_get()
1622 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); in ib_sa_path_rec_get()
1630 ib_sa_client_put(query->sa_query.client); in ib_sa_path_rec_get()
1631 free_mad(&query->sa_query); in ib_sa_path_rec_get()
1633 kfree(query->conv_pr); in ib_sa_path_rec_get()
1635 kfree(query); in ib_sa_path_rec_get()
1644 struct ib_sa_service_query *query = in ib_sa_service_rec_callback() local
1652 query->callback(status, &rec, query->context); in ib_sa_service_rec_callback()
1654 query->callback(status, NULL, query->context); in ib_sa_service_rec_callback()
1678 * unregister or query a service record.
1680 * fails); status is 0 for a successful response, -EINTR if the query
1681 * is canceled, -ETIMEDOUT is the query timed out, or -EIO if an error
1682 * occurred sending the query. The resp parameter of the callback is
1687 * the query.
1700 struct ib_sa_service_query *query; in ib_sa_service_rec_query() local
1718 query = kzalloc(sizeof(*query), gfp_mask); in ib_sa_service_rec_query()
1719 if (!query) in ib_sa_service_rec_query()
1722 query->sa_query.port = port; in ib_sa_service_rec_query()
1723 ret = alloc_mad(&query->sa_query, gfp_mask); in ib_sa_service_rec_query()
1728 query->sa_query.client = client; in ib_sa_service_rec_query()
1729 query->callback = callback; in ib_sa_service_rec_query()
1730 query->context = context; in ib_sa_service_rec_query()
1732 mad = query->sa_query.mad_buf->mad; in ib_sa_service_rec_query()
1733 init_mad(&query->sa_query, agent); in ib_sa_service_rec_query()
1735 query->sa_query.callback = callback ? ib_sa_service_rec_callback : NULL; in ib_sa_service_rec_query()
1736 query->sa_query.release = ib_sa_service_rec_release; in ib_sa_service_rec_query()
1744 *sa_query = &query->sa_query; in ib_sa_service_rec_query()
1746 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); in ib_sa_service_rec_query()
1754 ib_sa_client_put(query->sa_query.client); in ib_sa_service_rec_query()
1755 free_mad(&query->sa_query); in ib_sa_service_rec_query()
1758 kfree(query); in ib_sa_service_rec_query()
1767 struct ib_sa_mcmember_query *query = in ib_sa_mcmember_rec_callback() local
1775 query->callback(status, &rec, query->context); in ib_sa_mcmember_rec_callback()
1777 query->callback(status, NULL, query->context); in ib_sa_mcmember_rec_callback()
1797 struct ib_sa_mcmember_query *query; in ib_sa_mcmember_rec_query() local
1810 query = kzalloc(sizeof(*query), gfp_mask); in ib_sa_mcmember_rec_query()
1811 if (!query) in ib_sa_mcmember_rec_query()
1814 query->sa_query.port = port; in ib_sa_mcmember_rec_query()
1815 ret = alloc_mad(&query->sa_query, gfp_mask); in ib_sa_mcmember_rec_query()
1820 query->sa_query.client = client; in ib_sa_mcmember_rec_query()
1821 query->callback = callback; in ib_sa_mcmember_rec_query()
1822 query->context = context; in ib_sa_mcmember_rec_query()
1824 mad = query->sa_query.mad_buf->mad; in ib_sa_mcmember_rec_query()
1825 init_mad(&query->sa_query, agent); in ib_sa_mcmember_rec_query()
1827 query->sa_query.callback = callback ? ib_sa_mcmember_rec_callback : NULL; in ib_sa_mcmember_rec_query()
1828 query->sa_query.release = ib_sa_mcmember_rec_release; in ib_sa_mcmember_rec_query()
1836 *sa_query = &query->sa_query; in ib_sa_mcmember_rec_query()
1838 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); in ib_sa_mcmember_rec_query()
1846 ib_sa_client_put(query->sa_query.client); in ib_sa_mcmember_rec_query()
1847 free_mad(&query->sa_query); in ib_sa_mcmember_rec_query()
1850 kfree(query); in ib_sa_mcmember_rec_query()
1859 struct ib_sa_guidinfo_query *query = in ib_sa_guidinfo_rec_callback() local
1867 query->callback(status, &rec, query->context); in ib_sa_guidinfo_rec_callback()
1869 query->callback(status, NULL, query->context); in ib_sa_guidinfo_rec_callback()
1888 struct ib_sa_guidinfo_query *query; in ib_sa_guid_info_rec_query() local
1907 query = kzalloc(sizeof(*query), gfp_mask); in ib_sa_guid_info_rec_query()
1908 if (!query) in ib_sa_guid_info_rec_query()
1911 query->sa_query.port = port; in ib_sa_guid_info_rec_query()
1912 ret = alloc_mad(&query->sa_query, gfp_mask); in ib_sa_guid_info_rec_query()
1917 query->sa_query.client = client; in ib_sa_guid_info_rec_query()
1918 query->callback = callback; in ib_sa_guid_info_rec_query()
1919 query->context = context; in ib_sa_guid_info_rec_query()
1921 mad = query->sa_query.mad_buf->mad; in ib_sa_guid_info_rec_query()
1922 init_mad(&query->sa_query, agent); in ib_sa_guid_info_rec_query()
1924 query->sa_query.callback = callback ? ib_sa_guidinfo_rec_callback : NULL; in ib_sa_guid_info_rec_query()
1925 query->sa_query.release = ib_sa_guidinfo_rec_release; in ib_sa_guid_info_rec_query()
1934 *sa_query = &query->sa_query; in ib_sa_guid_info_rec_query()
1936 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); in ib_sa_guid_info_rec_query()
1944 ib_sa_client_put(query->sa_query.client); in ib_sa_guid_info_rec_query()
1945 free_mad(&query->sa_query); in ib_sa_guid_info_rec_query()
1948 kfree(query); in ib_sa_guid_info_rec_query()
1994 struct ib_sa_classport_info_query *query = in ib_sa_classport_info_rec_callback() local
2038 query->callback(query->context); in ib_sa_classport_info_rec_callback()
2054 struct ib_sa_classport_info_query *query; in ib_sa_classport_info_rec_query() local
2061 query = kzalloc(sizeof(*query), gfp_mask); in ib_sa_classport_info_rec_query()
2062 if (!query) in ib_sa_classport_info_rec_query()
2065 query->sa_query.port = port; in ib_sa_classport_info_rec_query()
2066 query->sa_query.flags |= rdma_cap_opa_ah(port->agent->device, in ib_sa_classport_info_rec_query()
2069 ret = alloc_mad(&query->sa_query, gfp_mask); in ib_sa_classport_info_rec_query()
2073 query->callback = callback; in ib_sa_classport_info_rec_query()
2074 query->context = context; in ib_sa_classport_info_rec_query()
2076 mad = query->sa_query.mad_buf->mad; in ib_sa_classport_info_rec_query()
2077 init_mad(&query->sa_query, agent); in ib_sa_classport_info_rec_query()
2079 query->sa_query.callback = ib_sa_classport_info_rec_callback; in ib_sa_classport_info_rec_query()
2080 query->sa_query.release = ib_sa_classport_info_rec_release; in ib_sa_classport_info_rec_query()
2084 *sa_query = &query->sa_query; in ib_sa_classport_info_rec_query()
2086 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); in ib_sa_classport_info_rec_query()
2094 free_mad(&query->sa_query); in ib_sa_classport_info_rec_query()
2097 kfree(query); in ib_sa_classport_info_rec_query()
2135 /* If the classport info is still not valid, the query should have in update_ib_cpi()
2136 * failed for some reason. Retry issuing the query in update_ib_cpi()
2157 struct ib_sa_query *query = mad_send_wc->send_buf->context[0]; in send_handler() local
2160 if (query->callback) in send_handler()
2166 query->callback(query, -ETIMEDOUT, NULL); in send_handler()
2169 query->callback(query, -EINTR, NULL); in send_handler()
2172 query->callback(query, -EIO, NULL); in send_handler()
2177 __xa_erase(&queries, query->id); in send_handler()
2180 free_mad(query); in send_handler()
2181 if (query->client) in send_handler()
2182 ib_sa_client_put(query->client); in send_handler()
2183 query->release(query); in send_handler()
2190 struct ib_sa_query *query; in recv_handler() local
2195 query = send_buf->context[0]; in recv_handler()
2196 if (query->callback) { in recv_handler()
2198 query->callback(query, in recv_handler()
2203 query->callback(query, -EIO, NULL); in recv_handler()
2219 pr_warn("Couldn't query port\n"); in update_sm_ah()