Lines Matching refs:query

421 static inline void ib_sa_disable_local_svc(struct ib_sa_query *query)  in ib_sa_disable_local_svc()  argument
423 query->flags &= ~IB_SA_ENABLE_LOCAL_SERVICE; in ib_sa_disable_local_svc()
426 static inline int ib_sa_query_cancelled(struct ib_sa_query *query) in ib_sa_query_cancelled() argument
428 return (query->flags & IB_SA_CANCEL); in ib_sa_query_cancelled()
432 struct ib_sa_query *query) in ib_nl_set_path_rec_attrs() argument
434 struct ib_sa_path_rec *sa_rec = query->mad_buf->context[1]; in ib_nl_set_path_rec_attrs()
435 struct ib_sa_mad *mad = query->mad_buf->mad; in ib_nl_set_path_rec_attrs()
441 query->mad_buf->context[1] = NULL; in ib_nl_set_path_rec_attrs()
446 memcpy(header->device_name, query->port->agent->device->name, in ib_nl_set_path_rec_attrs()
448 header->port_num = query->port->port_num; in ib_nl_set_path_rec_attrs()
452 query->path_use = LS_RESOLVE_PATH_USE_GMP; in ib_nl_set_path_rec_attrs()
454 query->path_use = LS_RESOLVE_PATH_USE_UNIDIRECTIONAL; in ib_nl_set_path_rec_attrs()
455 header->path_use = query->path_use; in ib_nl_set_path_rec_attrs()
515 static int ib_nl_send_msg(struct ib_sa_query *query, gfp_t gfp_mask) in ib_nl_send_msg() argument
524 mad = query->mad_buf->mad; in ib_nl_send_msg()
534 data = ibnl_put_msg(skb, &nlh, query->seq, 0, RDMA_NL_LS, in ib_nl_send_msg()
542 ib_nl_set_path_rec_attrs(skb, query); in ib_nl_send_msg()
556 static int ib_nl_make_request(struct ib_sa_query *query, gfp_t gfp_mask) in ib_nl_make_request() argument
562 INIT_LIST_HEAD(&query->list); in ib_nl_make_request()
563 query->seq = (u32)atomic_inc_return(&ib_nl_sa_request_seq); in ib_nl_make_request()
568 query->timeout = delay + jiffies; in ib_nl_make_request()
569 list_add_tail(&query->list, &ib_nl_request_list); in ib_nl_make_request()
571 if (ib_nl_request_list.next == &query->list) in ib_nl_make_request()
575 ret = ib_nl_send_msg(query, gfp_mask); in ib_nl_make_request()
580 list_del(&query->list); in ib_nl_make_request()
589 static int ib_nl_cancel_request(struct ib_sa_query *query) in ib_nl_cancel_request() argument
598 if (query == wait_query) { in ib_nl_cancel_request()
599 query->flags |= IB_SA_CANCEL; in ib_nl_cancel_request()
600 query->timeout = jiffies; in ib_nl_cancel_request()
601 list_move(&query->list, &ib_nl_request_list); in ib_nl_cancel_request()
615 static void ib_nl_process_good_resolve_rsp(struct ib_sa_query *query, in ib_nl_process_good_resolve_rsp() argument
626 if (query->callback) { in ib_nl_process_good_resolve_rsp()
629 switch (query->path_use) { in ib_nl_process_good_resolve_rsp()
649 mad = query->mad_buf->mad; in ib_nl_process_good_resolve_rsp()
659 query->callback(query, status, mad); in ib_nl_process_good_resolve_rsp()
662 mad_send_wc.send_buf = query->mad_buf; in ib_nl_process_good_resolve_rsp()
664 send_handler(query->mad_buf->mad_agent, &mad_send_wc); in ib_nl_process_good_resolve_rsp()
670 struct ib_sa_query *query; in ib_nl_request_timeout() local
677 query = list_entry(ib_nl_request_list.next, in ib_nl_request_timeout()
680 if (time_after(query->timeout, jiffies)) { in ib_nl_request_timeout()
681 delay = query->timeout - jiffies; in ib_nl_request_timeout()
688 list_del(&query->list); in ib_nl_request_timeout()
689 ib_sa_disable_local_svc(query); in ib_nl_request_timeout()
691 if (ib_sa_query_cancelled(query)) in ib_nl_request_timeout()
694 ret = ib_post_send_mad(query->mad_buf, NULL); in ib_nl_request_timeout()
696 mad_send_wc.send_buf = query->mad_buf; in ib_nl_request_timeout()
699 send_handler(query->port->agent, &mad_send_wc); in ib_nl_request_timeout()
713 struct ib_sa_query *query; in ib_nl_handle_set_timeout() local
742 list_for_each_entry(query, &ib_nl_request_list, list) { in ib_nl_handle_set_timeout()
743 if (delta < 0 && abs_delta > query->timeout) in ib_nl_handle_set_timeout()
744 query->timeout = 0; in ib_nl_handle_set_timeout()
746 query->timeout += delta; in ib_nl_handle_set_timeout()
750 delay = query->timeout - jiffies; in ib_nl_handle_set_timeout()
786 struct ib_sa_query *query; in ib_nl_handle_resolve_resp() local
796 list_for_each_entry(query, &ib_nl_request_list, list) { in ib_nl_handle_resolve_resp()
801 if (nlh->nlmsg_seq == query->seq) { in ib_nl_handle_resolve_resp()
802 found = !ib_sa_query_cancelled(query); in ib_nl_handle_resolve_resp()
804 list_del(&query->list); in ib_nl_handle_resolve_resp()
814 send_buf = query->mad_buf; in ib_nl_handle_resolve_resp()
818 ib_sa_disable_local_svc(query); in ib_nl_handle_resolve_resp()
819 ret = ib_post_send_mad(query->mad_buf, NULL); in ib_nl_handle_resolve_resp()
824 send_handler(query->port->agent, &mad_send_wc); in ib_nl_handle_resolve_resp()
828 ib_nl_process_good_resolve_rsp(query, nlh); in ib_nl_handle_resolve_resp()
950 void ib_sa_cancel_query(int id, struct ib_sa_query *query) in ib_sa_cancel_query() argument
957 if (idr_find(&query_idr, id) != query) { in ib_sa_cancel_query()
961 agent = query->port->agent; in ib_sa_cancel_query()
962 mad_buf = query->mad_buf; in ib_sa_cancel_query()
970 if (!ib_nl_cancel_request(query)) in ib_sa_cancel_query()
1039 static int alloc_mad(struct ib_sa_query *query, gfp_t gfp_mask) in alloc_mad() argument
1043 spin_lock_irqsave(&query->port->ah_lock, flags); in alloc_mad()
1044 if (!query->port->sm_ah) { in alloc_mad()
1045 spin_unlock_irqrestore(&query->port->ah_lock, flags); in alloc_mad()
1048 kref_get(&query->port->sm_ah->ref); in alloc_mad()
1049 query->sm_ah = query->port->sm_ah; in alloc_mad()
1050 spin_unlock_irqrestore(&query->port->ah_lock, flags); in alloc_mad()
1052 query->mad_buf = ib_create_send_mad(query->port->agent, 1, in alloc_mad()
1053 query->sm_ah->pkey_index, in alloc_mad()
1057 if (IS_ERR(query->mad_buf)) { in alloc_mad()
1058 kref_put(&query->sm_ah->ref, free_sm_ah); in alloc_mad()
1062 query->mad_buf->ah = query->sm_ah->ah; in alloc_mad()
1067 static void free_mad(struct ib_sa_query *query) in free_mad() argument
1069 ib_free_send_mad(query->mad_buf); in free_mad()
1070 kref_put(&query->sm_ah->ref, free_sm_ah); in free_mad()
1089 static int send_mad(struct ib_sa_query *query, int timeout_ms, gfp_t gfp_mask) in send_mad() argument
1099 id = idr_alloc(&query_idr, query, 0, 0, GFP_NOWAIT); in send_mad()
1107 query->mad_buf->timeout_ms = timeout_ms; in send_mad()
1108 query->mad_buf->context[0] = query; in send_mad()
1109 query->id = id; in send_mad()
1111 if (query->flags & IB_SA_ENABLE_LOCAL_SERVICE) { in send_mad()
1113 if (!ib_nl_make_request(query, gfp_mask)) in send_mad()
1116 ib_sa_disable_local_svc(query); in send_mad()
1119 ret = ib_post_send_mad(query->mad_buf, NULL); in send_mad()
1150 struct ib_sa_path_query *query = in ib_sa_path_rec_callback() local
1161 query->callback(status, &rec, query->context); in ib_sa_path_rec_callback()
1163 query->callback(status, NULL, query->context); in ib_sa_path_rec_callback()
1207 struct ib_sa_path_query *query; in ib_sa_path_rec_get() local
1220 query = kzalloc(sizeof(*query), gfp_mask); in ib_sa_path_rec_get()
1221 if (!query) in ib_sa_path_rec_get()
1224 query->sa_query.port = port; in ib_sa_path_rec_get()
1225 ret = alloc_mad(&query->sa_query, gfp_mask); in ib_sa_path_rec_get()
1230 query->sa_query.client = client; in ib_sa_path_rec_get()
1231 query->callback = callback; in ib_sa_path_rec_get()
1232 query->context = context; in ib_sa_path_rec_get()
1234 mad = query->sa_query.mad_buf->mad; in ib_sa_path_rec_get()
1237 query->sa_query.callback = callback ? ib_sa_path_rec_callback : NULL; in ib_sa_path_rec_get()
1238 query->sa_query.release = ib_sa_path_rec_release; in ib_sa_path_rec_get()
1245 *sa_query = &query->sa_query; in ib_sa_path_rec_get()
1247 query->sa_query.flags |= IB_SA_ENABLE_LOCAL_SERVICE; in ib_sa_path_rec_get()
1248 query->sa_query.mad_buf->context[1] = rec; in ib_sa_path_rec_get()
1250 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); in ib_sa_path_rec_get()
1258 ib_sa_client_put(query->sa_query.client); in ib_sa_path_rec_get()
1259 free_mad(&query->sa_query); in ib_sa_path_rec_get()
1262 kfree(query); in ib_sa_path_rec_get()
1271 struct ib_sa_service_query *query = in ib_sa_service_rec_callback() local
1279 query->callback(status, &rec, query->context); in ib_sa_service_rec_callback()
1281 query->callback(status, NULL, query->context); in ib_sa_service_rec_callback()
1327 struct ib_sa_service_query *query; in ib_sa_service_rec_query() local
1345 query = kzalloc(sizeof(*query), gfp_mask); in ib_sa_service_rec_query()
1346 if (!query) in ib_sa_service_rec_query()
1349 query->sa_query.port = port; in ib_sa_service_rec_query()
1350 ret = alloc_mad(&query->sa_query, gfp_mask); in ib_sa_service_rec_query()
1355 query->sa_query.client = client; in ib_sa_service_rec_query()
1356 query->callback = callback; in ib_sa_service_rec_query()
1357 query->context = context; in ib_sa_service_rec_query()
1359 mad = query->sa_query.mad_buf->mad; in ib_sa_service_rec_query()
1362 query->sa_query.callback = callback ? ib_sa_service_rec_callback : NULL; in ib_sa_service_rec_query()
1363 query->sa_query.release = ib_sa_service_rec_release; in ib_sa_service_rec_query()
1371 *sa_query = &query->sa_query; in ib_sa_service_rec_query()
1373 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); in ib_sa_service_rec_query()
1381 ib_sa_client_put(query->sa_query.client); in ib_sa_service_rec_query()
1382 free_mad(&query->sa_query); in ib_sa_service_rec_query()
1385 kfree(query); in ib_sa_service_rec_query()
1394 struct ib_sa_mcmember_query *query = in ib_sa_mcmember_rec_callback() local
1402 query->callback(status, &rec, query->context); in ib_sa_mcmember_rec_callback()
1404 query->callback(status, NULL, query->context); in ib_sa_mcmember_rec_callback()
1424 struct ib_sa_mcmember_query *query; in ib_sa_mcmember_rec_query() local
1437 query = kzalloc(sizeof(*query), gfp_mask); in ib_sa_mcmember_rec_query()
1438 if (!query) in ib_sa_mcmember_rec_query()
1441 query->sa_query.port = port; in ib_sa_mcmember_rec_query()
1442 ret = alloc_mad(&query->sa_query, gfp_mask); in ib_sa_mcmember_rec_query()
1447 query->sa_query.client = client; in ib_sa_mcmember_rec_query()
1448 query->callback = callback; in ib_sa_mcmember_rec_query()
1449 query->context = context; in ib_sa_mcmember_rec_query()
1451 mad = query->sa_query.mad_buf->mad; in ib_sa_mcmember_rec_query()
1454 query->sa_query.callback = callback ? ib_sa_mcmember_rec_callback : NULL; in ib_sa_mcmember_rec_query()
1455 query->sa_query.release = ib_sa_mcmember_rec_release; in ib_sa_mcmember_rec_query()
1463 *sa_query = &query->sa_query; in ib_sa_mcmember_rec_query()
1465 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); in ib_sa_mcmember_rec_query()
1473 ib_sa_client_put(query->sa_query.client); in ib_sa_mcmember_rec_query()
1474 free_mad(&query->sa_query); in ib_sa_mcmember_rec_query()
1477 kfree(query); in ib_sa_mcmember_rec_query()
1486 struct ib_sa_guidinfo_query *query = in ib_sa_guidinfo_rec_callback() local
1494 query->callback(status, &rec, query->context); in ib_sa_guidinfo_rec_callback()
1496 query->callback(status, NULL, query->context); in ib_sa_guidinfo_rec_callback()
1515 struct ib_sa_guidinfo_query *query; in ib_sa_guid_info_rec_query() local
1534 query = kzalloc(sizeof(*query), gfp_mask); in ib_sa_guid_info_rec_query()
1535 if (!query) in ib_sa_guid_info_rec_query()
1538 query->sa_query.port = port; in ib_sa_guid_info_rec_query()
1539 ret = alloc_mad(&query->sa_query, gfp_mask); in ib_sa_guid_info_rec_query()
1544 query->sa_query.client = client; in ib_sa_guid_info_rec_query()
1545 query->callback = callback; in ib_sa_guid_info_rec_query()
1546 query->context = context; in ib_sa_guid_info_rec_query()
1548 mad = query->sa_query.mad_buf->mad; in ib_sa_guid_info_rec_query()
1551 query->sa_query.callback = callback ? ib_sa_guidinfo_rec_callback : NULL; in ib_sa_guid_info_rec_query()
1552 query->sa_query.release = ib_sa_guidinfo_rec_release; in ib_sa_guid_info_rec_query()
1561 *sa_query = &query->sa_query; in ib_sa_guid_info_rec_query()
1563 ret = send_mad(&query->sa_query, timeout_ms, gfp_mask); in ib_sa_guid_info_rec_query()
1571 ib_sa_client_put(query->sa_query.client); in ib_sa_guid_info_rec_query()
1572 free_mad(&query->sa_query); in ib_sa_guid_info_rec_query()
1575 kfree(query); in ib_sa_guid_info_rec_query()
1583 struct ib_sa_query *query = mad_send_wc->send_buf->context[0]; in send_handler() local
1586 if (query->callback) in send_handler()
1592 query->callback(query, -ETIMEDOUT, NULL); in send_handler()
1595 query->callback(query, -EINTR, NULL); in send_handler()
1598 query->callback(query, -EIO, NULL); in send_handler()
1603 idr_remove(&query_idr, query->id); in send_handler()
1606 free_mad(query); in send_handler()
1607 ib_sa_client_put(query->client); in send_handler()
1608 query->release(query); in send_handler()
1614 struct ib_sa_query *query; in recv_handler() local
1618 query = mad_buf->context[0]; in recv_handler()
1620 if (query->callback) { in recv_handler()
1622 query->callback(query, in recv_handler()
1627 query->callback(query, -EIO, NULL); in recv_handler()