Lines Matching refs:pdr

76 	struct pdr_handle *pdr = container_of(qmi, struct pdr_handle,  in pdr_locator_new_server()  local
79 mutex_lock(&pdr->lock); in pdr_locator_new_server()
81 pdr->locator_addr.sq_family = AF_QIPCRTR; in pdr_locator_new_server()
82 pdr->locator_addr.sq_node = svc->node; in pdr_locator_new_server()
83 pdr->locator_addr.sq_port = svc->port; 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 schedule_work(&pdr->locator_work); in pdr_locator_new_server()
97 struct pdr_handle *pdr = container_of(qmi, struct pdr_handle, in pdr_locator_del_server() local
100 mutex_lock(&pdr->lock); in pdr_locator_del_server()
101 pdr->locator_init_complete = false; in pdr_locator_del_server()
103 pdr->locator_addr.sq_node = 0; in pdr_locator_del_server()
104 pdr->locator_addr.sq_port = 0; in pdr_locator_del_server()
105 mutex_unlock(&pdr->lock); in pdr_locator_del_server()
113 static int pdr_register_listener(struct pdr_handle *pdr, in pdr_register_listener() argument
122 ret = qmi_txn_init(&pdr->notifier_hdl, &txn, in pdr_register_listener()
131 ret = qmi_send_request(&pdr->notifier_hdl, &pds->addr, in pdr_register_listener()
161 struct pdr_handle *pdr = container_of(work, struct pdr_handle, in pdr_notifier_work() local
166 mutex_lock(&pdr->list_lock); in pdr_notifier_work()
167 list_for_each_entry(pds, &pdr->lookups, node) { in pdr_notifier_work()
173 ret = pdr_register_listener(pdr, pds, true); in pdr_notifier_work()
184 mutex_lock(&pdr->status_lock); in pdr_notifier_work()
185 pdr->status(pds->state, pds->service_path, pdr->priv); in pdr_notifier_work()
186 mutex_unlock(&pdr->status_lock); in pdr_notifier_work()
188 mutex_unlock(&pdr->list_lock); in pdr_notifier_work()
194 struct pdr_handle *pdr = container_of(qmi, struct pdr_handle, in pdr_notifier_new_server() local
198 mutex_lock(&pdr->list_lock); in pdr_notifier_new_server()
199 list_for_each_entry(pds, &pdr->lookups, node) { in pdr_notifier_new_server()
207 queue_work(pdr->notifier_wq, &pdr->notifier_work); in pdr_notifier_new_server()
210 mutex_unlock(&pdr->list_lock); in pdr_notifier_new_server()
218 struct pdr_handle *pdr = container_of(qmi, struct pdr_handle, in pdr_notifier_del_server() local
222 mutex_lock(&pdr->list_lock); in pdr_notifier_del_server()
223 list_for_each_entry(pds, &pdr->lookups, node) { in pdr_notifier_del_server()
230 queue_work(pdr->notifier_wq, &pdr->notifier_work); in pdr_notifier_del_server()
233 mutex_unlock(&pdr->list_lock); in pdr_notifier_del_server()
241 static int pdr_send_indack_msg(struct pdr_handle *pdr, struct pdr_service *pds, in pdr_send_indack_msg() argument
249 ret = qmi_txn_init(&pdr->notifier_hdl, &txn, servreg_set_ack_resp_ei, in pdr_send_indack_msg()
257 ret = qmi_send_request(&pdr->notifier_hdl, &pds->addr, in pdr_send_indack_msg()
270 struct pdr_handle *pdr = container_of(work, struct pdr_handle, in pdr_indack_work() local
275 list_for_each_entry_safe(ind, tmp, &pdr->indack_list, node) { in pdr_indack_work()
278 mutex_lock(&pdr->status_lock); in pdr_indack_work()
280 pdr->status(pds->state, pds->service_path, pdr->priv); in pdr_indack_work()
281 mutex_unlock(&pdr->status_lock); in pdr_indack_work()
284 pdr_send_indack_msg(pdr, pds, ind->transaction_id); in pdr_indack_work()
286 mutex_lock(&pdr->list_lock); in pdr_indack_work()
288 mutex_unlock(&pdr->list_lock); in pdr_indack_work()
298 struct pdr_handle *pdr = container_of(qmi, struct pdr_handle, in pdr_indication_cb() local
308 mutex_lock(&pdr->list_lock); in pdr_indication_cb()
309 list_for_each_entry(iter, &pdr->lookups, node) { in pdr_indication_cb()
316 mutex_unlock(&pdr->list_lock); in pdr_indication_cb()
333 mutex_lock(&pdr->list_lock); in pdr_indication_cb()
334 list_add_tail(&ind->node, &pdr->indack_list); in pdr_indication_cb()
335 mutex_unlock(&pdr->list_lock); in pdr_indication_cb()
337 queue_work(pdr->indack_wq, &pdr->indack_work); in pdr_indication_cb()
353 struct pdr_handle *pdr) in pdr_get_domain_list() argument
358 ret = qmi_txn_init(&pdr->locator_hdl, &txn, in pdr_get_domain_list()
363 mutex_lock(&pdr->lock); in pdr_get_domain_list()
364 ret = qmi_send_request(&pdr->locator_hdl, in pdr_get_domain_list()
365 &pdr->locator_addr, in pdr_get_domain_list()
370 mutex_unlock(&pdr->lock); in pdr_get_domain_list()
392 static int pdr_locate_service(struct pdr_handle *pdr, struct pdr_service *pds) in pdr_locate_service() argument
411 ret = pdr_get_domain_list(&req, resp, pdr); in pdr_locate_service()
442 static void pdr_notify_lookup_failure(struct pdr_handle *pdr, in pdr_notify_lookup_failure() argument
454 mutex_lock(&pdr->status_lock); in pdr_notify_lookup_failure()
455 pdr->status(pds->state, pds->service_path, pdr->priv); in pdr_notify_lookup_failure()
456 mutex_unlock(&pdr->status_lock); in pdr_notify_lookup_failure()
462 struct pdr_handle *pdr = container_of(work, struct pdr_handle, in pdr_locator_work() local
468 mutex_lock(&pdr->lock); in pdr_locator_work()
469 if (!pdr->locator_init_complete) { in pdr_locator_work()
470 mutex_unlock(&pdr->lock); in pdr_locator_work()
474 mutex_unlock(&pdr->lock); in pdr_locator_work()
476 mutex_lock(&pdr->list_lock); in pdr_locator_work()
477 list_for_each_entry_safe(pds, tmp, &pdr->lookups, node) { in pdr_locator_work()
481 ret = pdr_locate_service(pdr, pds); in pdr_locator_work()
483 pdr_notify_lookup_failure(pdr, pds, ret); in pdr_locator_work()
487 ret = qmi_add_lookup(&pdr->notifier_hdl, pds->service, 1, in pdr_locator_work()
490 pdr_notify_lookup_failure(pdr, pds, ret); in pdr_locator_work()
496 mutex_unlock(&pdr->list_lock); in pdr_locator_work()
510 struct pdr_service *pdr_add_lookup(struct pdr_handle *pdr, in pdr_add_lookup() argument
516 if (IS_ERR_OR_NULL(pdr)) in pdr_add_lookup()
532 mutex_lock(&pdr->list_lock); in pdr_add_lookup()
533 list_for_each_entry(tmp, &pdr->lookups, node) { in pdr_add_lookup()
537 mutex_unlock(&pdr->list_lock); in pdr_add_lookup()
541 list_add(&pds->node, &pdr->lookups); in pdr_add_lookup()
542 mutex_unlock(&pdr->list_lock); in pdr_add_lookup()
544 schedule_work(&pdr->locator_work); in pdr_add_lookup()
559 int pdr_restart_pd(struct pdr_handle *pdr, struct pdr_service *pds) in pdr_restart_pd() argument
568 if (IS_ERR_OR_NULL(pdr) || IS_ERR_OR_NULL(pds)) in pdr_restart_pd()
571 mutex_lock(&pdr->list_lock); in pdr_restart_pd()
572 list_for_each_entry(tmp, &pdr->lookups, node) { in pdr_restart_pd()
584 mutex_unlock(&pdr->list_lock); in pdr_restart_pd()
589 ret = qmi_txn_init(&pdr->notifier_hdl, &txn, in pdr_restart_pd()
595 ret = qmi_send_request(&pdr->notifier_hdl, &addr, in pdr_restart_pd()
648 struct pdr_handle *pdr __free(kfree) = kzalloc(sizeof(*pdr), GFP_KERNEL); in pdr_handle_alloc()
649 if (!pdr) in pdr_handle_alloc()
652 pdr->status = status; in pdr_handle_alloc()
653 pdr->priv = priv; in pdr_handle_alloc()
655 mutex_init(&pdr->status_lock); in pdr_handle_alloc()
656 mutex_init(&pdr->list_lock); in pdr_handle_alloc()
657 mutex_init(&pdr->lock); in pdr_handle_alloc()
659 INIT_LIST_HEAD(&pdr->lookups); in pdr_handle_alloc()
660 INIT_LIST_HEAD(&pdr->indack_list); in pdr_handle_alloc()
662 INIT_WORK(&pdr->locator_work, pdr_locator_work); in pdr_handle_alloc()
663 INIT_WORK(&pdr->notifier_work, pdr_notifier_work); in pdr_handle_alloc()
664 INIT_WORK(&pdr->indack_work, pdr_indack_work); in pdr_handle_alloc()
666 pdr->notifier_wq = create_singlethread_workqueue("pdr_notifier_wq"); in pdr_handle_alloc()
667 if (!pdr->notifier_wq) in pdr_handle_alloc()
670 pdr->indack_wq = alloc_ordered_workqueue("pdr_indack_wq", WQ_HIGHPRI); in pdr_handle_alloc()
671 if (!pdr->indack_wq) { in pdr_handle_alloc()
676 ret = qmi_handle_init(&pdr->locator_hdl, in pdr_handle_alloc()
682 ret = qmi_add_lookup(&pdr->locator_hdl, SERVREG_LOCATOR_SERVICE, 1, 1); in pdr_handle_alloc()
686 ret = qmi_handle_init(&pdr->notifier_hdl, in pdr_handle_alloc()
693 return_ptr(pdr); in pdr_handle_alloc()
696 qmi_handle_release(&pdr->locator_hdl); in pdr_handle_alloc()
698 destroy_workqueue(pdr->indack_wq); in pdr_handle_alloc()
700 destroy_workqueue(pdr->notifier_wq); in pdr_handle_alloc()
712 void pdr_handle_release(struct pdr_handle *pdr) in pdr_handle_release() argument
716 if (IS_ERR_OR_NULL(pdr)) in pdr_handle_release()
719 mutex_lock(&pdr->list_lock); in pdr_handle_release()
720 list_for_each_entry_safe(pds, tmp, &pdr->lookups, node) { in pdr_handle_release()
724 mutex_unlock(&pdr->list_lock); in pdr_handle_release()
726 cancel_work_sync(&pdr->locator_work); in pdr_handle_release()
727 cancel_work_sync(&pdr->notifier_work); in pdr_handle_release()
728 cancel_work_sync(&pdr->indack_work); in pdr_handle_release()
730 destroy_workqueue(pdr->notifier_wq); in pdr_handle_release()
731 destroy_workqueue(pdr->indack_wq); in pdr_handle_release()
733 qmi_handle_release(&pdr->locator_hdl); in pdr_handle_release()
734 qmi_handle_release(&pdr->notifier_hdl); in pdr_handle_release()
736 kfree(pdr); in pdr_handle_release()