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:
Avaneesh Kumar Dwivedi 2017-03-07 15:13:31 +05:30
parent 783427f7ad
commit fb7aadf142

View file

@ -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;