soc: qcom: Free qmi handle in a worker thread
This change on arrival of ssr event schdule a worker thread, which when run carry out task of qmi handle destruction. It is a desired change to make ssr notification callback as light as possible and avoid blocking it for long in corner cases. Change-Id: I832fabce7569b1b8b966b7c49cda1b00cff2c472 Signed-off-by: Avaneesh Kumar Dwivedi <akdwived@codeaurora.org>
This commit is contained in:
parent
783427f7ad
commit
fb7aadf142
1 changed files with 7 additions and 6 deletions
|
@ -99,6 +99,7 @@ struct ind_req_resp {
|
|||
*/
|
||||
struct qmi_client_info {
|
||||
int instance_id;
|
||||
int subsys_state;
|
||||
struct work_struct svc_arrive;
|
||||
struct work_struct svc_exit;
|
||||
struct work_struct svc_rcv_msg;
|
||||
|
@ -436,7 +437,7 @@ static void root_service_exit_work(struct work_struct *work)
|
|||
{
|
||||
struct qmi_client_info *data = container_of(work,
|
||||
struct qmi_client_info, svc_exit);
|
||||
root_service_service_exit(data, ROOT_PD_DOWN);
|
||||
root_service_service_exit(data, data->subsys_state);
|
||||
}
|
||||
|
||||
static int service_event_notify(struct notifier_block *this,
|
||||
|
@ -453,6 +454,7 @@ static int service_event_notify(struct notifier_block *this,
|
|||
break;
|
||||
case QMI_SERVER_EXIT:
|
||||
pr_debug("Root PD service DOWN\n");
|
||||
data->subsys_state = ROOT_PD_DOWN;
|
||||
queue_work(data->svc_event_wq, &data->svc_exit);
|
||||
break;
|
||||
default:
|
||||
|
@ -468,7 +470,6 @@ static int ssr_event_notify(struct notifier_block *this,
|
|||
struct qmi_client_info *info = container_of(this,
|
||||
struct qmi_client_info, ssr_notifier);
|
||||
struct notif_data *notif = data;
|
||||
enum pd_subsys_state state;
|
||||
|
||||
switch (code) {
|
||||
case SUBSYS_BEFORE_SHUTDOWN:
|
||||
|
@ -476,16 +477,16 @@ static int ssr_event_notify(struct notifier_block *this,
|
|||
notif->crashed);
|
||||
switch (notif->crashed) {
|
||||
case CRASH_STATUS_ERR_FATAL:
|
||||
state = ROOT_PD_ERR_FATAL;
|
||||
info->subsys_state = ROOT_PD_ERR_FATAL;
|
||||
break;
|
||||
case CRASH_STATUS_WDOG_BITE:
|
||||
state = ROOT_PD_WDOG_BITE;
|
||||
info->subsys_state = ROOT_PD_WDOG_BITE;
|
||||
break;
|
||||
default:
|
||||
state = ROOT_PD_SHUTDOWN;
|
||||
info->subsys_state = ROOT_PD_SHUTDOWN;
|
||||
break;
|
||||
}
|
||||
root_service_service_exit(info, state);
|
||||
queue_work(info->svc_event_wq, &info->svc_exit);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
Loading…
Add table
Reference in a new issue