Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bf751d65 authored by Subash Abhinov Kasiviswanathan's avatar Subash Abhinov Kasiviswanathan
Browse files

soc: qcom: wda: Fix invalid memory access



Flush powersave workqueue when 5G QMI DFC service is down to
avoid a race condition that powersave work still access the QMI
handle that is being freed.

CRs-fixed: 2387468
Change-Id: I18294939fc629b9cf902e346356d071603080a18
Acked-by: default avatarWeiyi Chen <weiyic@qti.qualcomm.com>
Signed-off-by: default avatarSubash Abhinov Kasiviswanathan <subashab@codeaurora.org>
parent 0aa4af23
Loading
Loading
Loading
Loading
+8 −1
Original line number Original line Diff line number Diff line
@@ -471,6 +471,8 @@ qmi_rmnet_delete_client(void *port, struct qmi_info *qmi, struct tcmsg *tcm)
		wda_qmi_client_exit(data);
		wda_qmi_client_exit(data);
		qmi->wda_client = NULL;
		qmi->wda_client = NULL;
		qmi->wda_pending = NULL;
		qmi->wda_pending = NULL;
	} else {
		qmi_rmnet_flush_ps_wq();
	}
	}


	__qmi_rmnet_delete_client(port, qmi, idx);
	__qmi_rmnet_delete_client(port, qmi, idx);
@@ -984,6 +986,12 @@ void qmi_rmnet_set_dl_msg_active(void *port)
}
}
EXPORT_SYMBOL(qmi_rmnet_set_dl_msg_active);
EXPORT_SYMBOL(qmi_rmnet_set_dl_msg_active);


void qmi_rmnet_flush_ps_wq(void)
{
	if (rmnet_ps_wq)
		flush_workqueue(rmnet_ps_wq);
}

bool qmi_rmnet_ignore_grant(void *port)
bool qmi_rmnet_ignore_grant(void *port)
{
{
	struct qmi_info *qmi;
	struct qmi_info *qmi;
@@ -995,5 +1003,4 @@ bool qmi_rmnet_ignore_grant(void *port)
	return qmi->ps_ignore_grant;
	return qmi->ps_ignore_grant;
}
}
EXPORT_SYMBOL(qmi_rmnet_ignore_grant);
EXPORT_SYMBOL(qmi_rmnet_ignore_grant);

#endif
#endif
+4 −0
Original line number Original line Diff line number Diff line
@@ -155,6 +155,7 @@ int
wda_qmi_client_init(void *port, struct svc_info *psvc, struct qmi_info *qmi);
wda_qmi_client_init(void *port, struct svc_info *psvc, struct qmi_info *qmi);
void wda_qmi_client_exit(void *wda_data);
void wda_qmi_client_exit(void *wda_data);
int wda_set_powersave_mode(void *wda_data, u8 enable);
int wda_set_powersave_mode(void *wda_data, u8 enable);
void qmi_rmnet_flush_ps_wq(void);
#else
#else
static inline int
static inline int
wda_qmi_client_init(void *port, struct svc_info *psvc, struct qmi_info *qmi)
wda_qmi_client_init(void *port, struct svc_info *psvc, struct qmi_info *qmi)
@@ -170,5 +171,8 @@ static inline int wda_set_powersave_mode(void *wda_data, u8 enable)
{
{
	return -EINVAL;
	return -EINVAL;
}
}
static inline void qmi_rmnet_flush_ps_wq(void)
{
}
#endif
#endif
#endif /*_RMNET_QMI_I_H*/
#endif /*_RMNET_QMI_I_H*/