Lines Matching +full:pd +full:- +full:node
1 // SPDX-License-Identifier: GPL-2.0
31 struct list_head node; member
46 /* serialize pd status invocation */
69 struct list_head node; member
80 pdr->locator_addr.sq_family = AF_QIPCRTR; in pdr_locator_new_server()
81 pdr->locator_addr.sq_node = svc->node; in pdr_locator_new_server()
82 pdr->locator_addr.sq_port = svc->port; in pdr_locator_new_server()
84 mutex_lock(&pdr->lock); in pdr_locator_new_server()
85 pdr->locator_init_complete = true; in pdr_locator_new_server()
86 mutex_unlock(&pdr->lock); in pdr_locator_new_server()
89 mutex_lock(&pdr->list_lock); in pdr_locator_new_server()
90 list_for_each_entry(pds, &pdr->lookups, node) { in pdr_locator_new_server()
91 if (pds->need_locator_lookup) in pdr_locator_new_server()
92 schedule_work(&pdr->locator_work); in pdr_locator_new_server()
94 mutex_unlock(&pdr->list_lock); in pdr_locator_new_server()
105 mutex_lock(&pdr->lock); in pdr_locator_del_server()
106 pdr->locator_init_complete = false; in pdr_locator_del_server()
107 mutex_unlock(&pdr->lock); in pdr_locator_del_server()
109 pdr->locator_addr.sq_node = 0; in pdr_locator_del_server()
110 pdr->locator_addr.sq_port = 0; in pdr_locator_del_server()
127 ret = qmi_txn_init(&pdr->notifier_hdl, &txn, in pdr_register_listener()
134 strscpy(req.service_path, pds->service_path, sizeof(req.service_path)); in pdr_register_listener()
136 ret = qmi_send_request(&pdr->notifier_hdl, &pds->addr, in pdr_register_listener()
149 pds->service_path, ret); in pdr_register_listener()
155 pds->service_path, resp.resp.error); in pdr_register_listener()
156 return -EREMOTEIO; in pdr_register_listener()
159 pds->state = resp.curr_state; in pdr_register_listener()
171 mutex_lock(&pdr->list_lock); in pdr_notifier_work()
172 list_for_each_entry(pds, &pdr->lookups, node) { in pdr_notifier_work()
173 if (pds->service_connected) { in pdr_notifier_work()
174 if (!pds->need_notifier_register) in pdr_notifier_work()
177 pds->need_notifier_register = false; in pdr_notifier_work()
180 pds->state = SERVREG_SERVICE_STATE_DOWN; in pdr_notifier_work()
182 if (!pds->need_notifier_remove) in pdr_notifier_work()
185 pds->need_notifier_remove = false; in pdr_notifier_work()
186 pds->state = SERVREG_SERVICE_STATE_DOWN; in pdr_notifier_work()
189 mutex_lock(&pdr->status_lock); in pdr_notifier_work()
190 pdr->status(pds->state, pds->service_path, pdr->priv); in pdr_notifier_work()
191 mutex_unlock(&pdr->status_lock); in pdr_notifier_work()
193 mutex_unlock(&pdr->list_lock); in pdr_notifier_work()
203 mutex_lock(&pdr->list_lock); in pdr_notifier_new_server()
204 list_for_each_entry(pds, &pdr->lookups, node) { in pdr_notifier_new_server()
205 if (pds->service == svc->service && in pdr_notifier_new_server()
206 pds->instance == svc->instance) { in pdr_notifier_new_server()
207 pds->service_connected = true; in pdr_notifier_new_server()
208 pds->need_notifier_register = true; in pdr_notifier_new_server()
209 pds->addr.sq_family = AF_QIPCRTR; in pdr_notifier_new_server()
210 pds->addr.sq_node = svc->node; in pdr_notifier_new_server()
211 pds->addr.sq_port = svc->port; in pdr_notifier_new_server()
212 queue_work(pdr->notifier_wq, &pdr->notifier_work); in pdr_notifier_new_server()
215 mutex_unlock(&pdr->list_lock); in pdr_notifier_new_server()
227 mutex_lock(&pdr->list_lock); in pdr_notifier_del_server()
228 list_for_each_entry(pds, &pdr->lookups, node) { in pdr_notifier_del_server()
229 if (pds->service == svc->service && in pdr_notifier_del_server()
230 pds->instance == svc->instance) { in pdr_notifier_del_server()
231 pds->service_connected = false; in pdr_notifier_del_server()
232 pds->need_notifier_remove = true; in pdr_notifier_del_server()
233 pds->addr.sq_node = 0; in pdr_notifier_del_server()
234 pds->addr.sq_port = 0; in pdr_notifier_del_server()
235 queue_work(pdr->notifier_wq, &pdr->notifier_work); in pdr_notifier_del_server()
238 mutex_unlock(&pdr->list_lock); in pdr_notifier_del_server()
254 ret = qmi_txn_init(&pdr->notifier_hdl, &txn, servreg_set_ack_resp_ei, in pdr_send_indack_msg()
260 strscpy(req.service_path, pds->service_path, sizeof(req.service_path)); in pdr_send_indack_msg()
262 ret = qmi_send_request(&pdr->notifier_hdl, &pds->addr, in pdr_send_indack_msg()
280 list_for_each_entry_safe(ind, tmp, &pdr->indack_list, node) { in pdr_indack_work()
281 pds = ind->pds; in pdr_indack_work()
283 mutex_lock(&pdr->status_lock); in pdr_indack_work()
284 pds->state = ind->curr_state; in pdr_indack_work()
285 pdr->status(pds->state, pds->service_path, pdr->priv); in pdr_indack_work()
286 mutex_unlock(&pdr->status_lock); in pdr_indack_work()
288 /* Ack the indication after clients release the PD resources */ in pdr_indack_work()
289 pdr_send_indack_msg(pdr, pds, ind->transaction_id); in pdr_indack_work()
291 mutex_lock(&pdr->list_lock); in pdr_indack_work()
292 list_del(&ind->node); in pdr_indack_work()
293 mutex_unlock(&pdr->list_lock); in pdr_indack_work()
309 if (!ind_msg || !ind_msg->service_path[0] || in pdr_indication_cb()
310 strlen(ind_msg->service_path) > SERVREG_NAME_LENGTH) in pdr_indication_cb()
313 mutex_lock(&pdr->list_lock); in pdr_indication_cb()
314 list_for_each_entry(iter, &pdr->lookups, node) { in pdr_indication_cb()
315 if (strcmp(iter->service_path, ind_msg->service_path)) in pdr_indication_cb()
321 mutex_unlock(&pdr->list_lock); in pdr_indication_cb()
326 pr_info("PDR: Indication received from %s, state: 0x%x, trans-id: %d\n", in pdr_indication_cb()
327 ind_msg->service_path, ind_msg->curr_state, in pdr_indication_cb()
328 ind_msg->transaction_id); in pdr_indication_cb()
334 ind->transaction_id = ind_msg->transaction_id; in pdr_indication_cb()
335 ind->curr_state = ind_msg->curr_state; in pdr_indication_cb()
336 ind->pds = pds; in pdr_indication_cb()
338 mutex_lock(&pdr->list_lock); in pdr_indication_cb()
339 list_add_tail(&ind->node, &pdr->indack_list); in pdr_indication_cb()
340 mutex_unlock(&pdr->list_lock); in pdr_indication_cb()
342 queue_work(pdr->indack_wq, &pdr->indack_work); in pdr_indication_cb()
363 ret = qmi_txn_init(&pdr->locator_hdl, &txn, in pdr_get_domain_list()
368 ret = qmi_send_request(&pdr->locator_hdl, in pdr_get_domain_list()
369 &pdr->locator_addr, in pdr_get_domain_list()
382 req->service_name, ret); in pdr_get_domain_list()
386 if (resp->resp.result != QMI_RESULT_SUCCESS_V01) { in pdr_get_domain_list()
388 req->service_name, resp->resp.error); in pdr_get_domain_list()
389 return -EREMOTEIO; in pdr_get_domain_list()
405 return -ENOMEM; in pdr_locate_service()
408 strscpy(req.service_name, pds->service_name, sizeof(req.service_name)); in pdr_locate_service()
418 for (i = domains_read; i < resp->domain_list_len; i++) { in pdr_locate_service()
419 entry = &resp->domain_list[i]; in pdr_locate_service()
421 if (strnlen(entry->name, sizeof(entry->name)) == sizeof(entry->name)) in pdr_locate_service()
424 if (!strcmp(entry->name, pds->service_path)) { in pdr_locate_service()
425 pds->service_data_valid = entry->service_data_valid; in pdr_locate_service()
426 pds->service_data = entry->service_data; in pdr_locate_service()
427 pds->instance = entry->instance; in pdr_locate_service()
433 ret = -ENXIO; in pdr_locate_service()
436 if (resp->domain_list_len > resp->total_domains) in pdr_locate_service()
437 resp->domain_list_len = resp->total_domains; in pdr_locate_service()
439 domains_read += resp->domain_list_len; in pdr_locate_service()
440 } while (domains_read < resp->total_domains); in pdr_locate_service()
451 pds->service_name, err); in pdr_notify_lookup_failure()
453 if (err == -ENXIO) in pdr_notify_lookup_failure()
456 list_del(&pds->node); in pdr_notify_lookup_failure()
457 pds->state = SERVREG_LOCATOR_ERR; in pdr_notify_lookup_failure()
458 mutex_lock(&pdr->status_lock); in pdr_notify_lookup_failure()
459 pdr->status(pds->state, pds->service_path, pdr->priv); in pdr_notify_lookup_failure()
460 mutex_unlock(&pdr->status_lock); in pdr_notify_lookup_failure()
472 mutex_lock(&pdr->lock); in pdr_locator_work()
473 if (!pdr->locator_init_complete) { in pdr_locator_work()
474 mutex_unlock(&pdr->lock); in pdr_locator_work()
478 mutex_unlock(&pdr->lock); in pdr_locator_work()
480 mutex_lock(&pdr->list_lock); in pdr_locator_work()
481 list_for_each_entry_safe(pds, tmp, &pdr->lookups, node) { in pdr_locator_work()
482 if (!pds->need_locator_lookup) in pdr_locator_work()
491 ret = qmi_add_lookup(&pdr->notifier_hdl, pds->service, 1, in pdr_locator_work()
492 pds->instance); in pdr_locator_work()
498 pds->need_locator_lookup = false; in pdr_locator_work()
500 mutex_unlock(&pdr->list_lock); in pdr_locator_work()
504 * pdr_add_lookup() - register a tracking request for a PD
509 * Registering a pdr lookup allows for tracking the life cycle of the PD.
511 * Return: pdr_service object on success, ERR_PTR on failure. -EALREADY is
522 return ERR_PTR(-EINVAL); in pdr_add_lookup()
526 return ERR_PTR(-EINVAL); in pdr_add_lookup()
530 return ERR_PTR(-ENOMEM); in pdr_add_lookup()
532 pds->service = SERVREG_NOTIFIER_SERVICE; in pdr_add_lookup()
533 strscpy(pds->service_name, service_name, sizeof(pds->service_name)); in pdr_add_lookup()
534 strscpy(pds->service_path, service_path, sizeof(pds->service_path)); in pdr_add_lookup()
535 pds->need_locator_lookup = true; in pdr_add_lookup()
537 mutex_lock(&pdr->list_lock); in pdr_add_lookup()
538 list_for_each_entry(tmp, &pdr->lookups, node) { in pdr_add_lookup()
539 if (strcmp(tmp->service_path, service_path)) in pdr_add_lookup()
542 mutex_unlock(&pdr->list_lock); in pdr_add_lookup()
543 ret = -EALREADY; in pdr_add_lookup()
547 list_add(&pds->node, &pdr->lookups); in pdr_add_lookup()
548 mutex_unlock(&pdr->list_lock); in pdr_add_lookup()
550 schedule_work(&pdr->locator_work); in pdr_add_lookup()
560 * pdr_restart_pd() - restart PD
562 * @pds: PD service handle
564 * Restarts the PD tracked by the PDR client handle for a given service path.
578 return -EINVAL; in pdr_restart_pd()
580 mutex_lock(&pdr->list_lock); in pdr_restart_pd()
581 list_for_each_entry(tmp, &pdr->lookups, node) { in pdr_restart_pd()
585 if (!pds->service_connected) in pdr_restart_pd()
589 strscpy(req.service_path, pds->service_path, sizeof(req.service_path)); in pdr_restart_pd()
590 addr = pds->addr; in pdr_restart_pd()
593 mutex_unlock(&pdr->list_lock); in pdr_restart_pd()
596 return -EINVAL; in pdr_restart_pd()
598 ret = qmi_txn_init(&pdr->notifier_hdl, &txn, in pdr_restart_pd()
604 ret = qmi_send_request(&pdr->notifier_hdl, &addr, in pdr_restart_pd()
615 pr_err("PDR: %s PD restart txn wait failed: %d\n", in pdr_restart_pd()
623 pr_err("PDR: %s PD restart is disabled: 0x%x\n", in pdr_restart_pd()
625 return -EOPNOTSUPP; in pdr_restart_pd()
630 pr_err("PDR: %s request for PD restart failed: 0x%x\n", in pdr_restart_pd()
632 return -EREMOTEIO; in pdr_restart_pd()
640 * pdr_handle_alloc() - initialize the PDR client handle
641 * @status: function to be called on PD state change
656 return ERR_PTR(-EINVAL); in pdr_handle_alloc()
660 return ERR_PTR(-ENOMEM); in pdr_handle_alloc()
662 pdr->status = status; in pdr_handle_alloc()
663 pdr->priv = priv; in pdr_handle_alloc()
665 mutex_init(&pdr->status_lock); in pdr_handle_alloc()
666 mutex_init(&pdr->list_lock); in pdr_handle_alloc()
667 mutex_init(&pdr->lock); in pdr_handle_alloc()
669 INIT_LIST_HEAD(&pdr->lookups); in pdr_handle_alloc()
670 INIT_LIST_HEAD(&pdr->indack_list); in pdr_handle_alloc()
672 INIT_WORK(&pdr->locator_work, pdr_locator_work); in pdr_handle_alloc()
673 INIT_WORK(&pdr->notifier_work, pdr_notifier_work); in pdr_handle_alloc()
674 INIT_WORK(&pdr->indack_work, pdr_indack_work); in pdr_handle_alloc()
676 pdr->notifier_wq = create_singlethread_workqueue("pdr_notifier_wq"); in pdr_handle_alloc()
677 if (!pdr->notifier_wq) { in pdr_handle_alloc()
678 ret = -ENOMEM; in pdr_handle_alloc()
682 pdr->indack_wq = alloc_ordered_workqueue("pdr_indack_wq", WQ_HIGHPRI); in pdr_handle_alloc()
683 if (!pdr->indack_wq) { in pdr_handle_alloc()
684 ret = -ENOMEM; in pdr_handle_alloc()
688 ret = qmi_handle_init(&pdr->locator_hdl, in pdr_handle_alloc()
694 ret = qmi_add_lookup(&pdr->locator_hdl, SERVREG_LOCATOR_SERVICE, 1, 1); in pdr_handle_alloc()
698 ret = qmi_handle_init(&pdr->notifier_hdl, in pdr_handle_alloc()
708 qmi_handle_release(&pdr->locator_hdl); in pdr_handle_alloc()
710 destroy_workqueue(pdr->indack_wq); in pdr_handle_alloc()
712 destroy_workqueue(pdr->notifier_wq); in pdr_handle_alloc()
721 * pdr_handle_release() - release the PDR client handle
733 mutex_lock(&pdr->list_lock); in pdr_handle_release()
734 list_for_each_entry_safe(pds, tmp, &pdr->lookups, node) { in pdr_handle_release()
735 list_del(&pds->node); in pdr_handle_release()
738 mutex_unlock(&pdr->list_lock); in pdr_handle_release()
740 cancel_work_sync(&pdr->locator_work); in pdr_handle_release()
741 cancel_work_sync(&pdr->notifier_work); in pdr_handle_release()
742 cancel_work_sync(&pdr->indack_work); in pdr_handle_release()
744 destroy_workqueue(pdr->notifier_wq); in pdr_handle_release()
745 destroy_workqueue(pdr->indack_wq); in pdr_handle_release()
747 qmi_handle_release(&pdr->locator_hdl); in pdr_handle_release()
748 qmi_handle_release(&pdr->notifier_hdl); in pdr_handle_release()