subsystem: sip_svc: Use atomic variable for locking in singly open system
Use atomic variable for singly open system. Add k_timer_stop() for sip_svc open timer(). Signed-off-by: Mahesh Rao <mahesh.rao@intel.com>
This commit is contained in:
parent
97f9d3c60b
commit
c13466974e
2 changed files with 23 additions and 16 deletions
|
@ -13,11 +13,21 @@
|
||||||
|
|
||||||
#ifdef CONFIG_ARM_SIP_SVC_SUBSYS
|
#ifdef CONFIG_ARM_SIP_SVC_SUBSYS
|
||||||
|
|
||||||
|
#include <zephyr/sys/atomic.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Length of SVC conduit name in sip svc subsystem.
|
* @brief Length of SVC conduit name in sip svc subsystem.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#define SIP_SVC_SUBSYS_CONDUIT_NAME_LENGTH (4)
|
#define SIP_SVC_SUBSYS_CONDUIT_NAME_LENGTH (4U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Open lock states in sip_svc atomic variable
|
||||||
|
*/
|
||||||
|
enum open_state {
|
||||||
|
SIP_SVC_OPEN_UNLOCKED = 0,
|
||||||
|
SIP_SVC_OPEN_LOCKED
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Arm SiP Service client data.
|
* @brief Arm SiP Service client data.
|
||||||
|
@ -73,8 +83,8 @@ struct sip_svc_controller {
|
||||||
k_tid_t tid;
|
k_tid_t tid;
|
||||||
|
|
||||||
#if CONFIG_ARM_SIP_SVC_SUBSYS_SINGLY_OPEN
|
#if CONFIG_ARM_SIP_SVC_SUBSYS_SINGLY_OPEN
|
||||||
/* Mutex to restrict one client access */
|
/* Atomic variable to restrict one client access */
|
||||||
struct k_mutex open_mutex;
|
atomic_t open_lock;
|
||||||
#endif
|
#endif
|
||||||
/* Mutex for protecting database access */
|
/* Mutex for protecting database access */
|
||||||
struct k_mutex data_mutex;
|
struct k_mutex data_mutex;
|
||||||
|
|
|
@ -129,8 +129,7 @@ static inline bool is_sip_svc_controller(void *ct)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
STRUCT_SECTION_FOREACH(sip_svc_controller, ctrl)
|
STRUCT_SECTION_FOREACH(sip_svc_controller, ctrl) {
|
||||||
{
|
|
||||||
if ((void *)ctrl == ct) {
|
if ((void *)ctrl == ct) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -320,10 +319,8 @@ int sip_svc_open(void *ct, uint32_t c_token, k_timeout_t k_timeout)
|
||||||
* Acquire open lock, when only one client can transact at
|
* Acquire open lock, when only one client can transact at
|
||||||
* a time.
|
* a time.
|
||||||
*/
|
*/
|
||||||
ret = k_mutex_lock(&ctrl->open_mutex, K_NO_WAIT);
|
if (!atomic_cas(&ctrl->open_lock, SIP_SVC_OPEN_UNLOCKED, SIP_SVC_OPEN_LOCKED)) {
|
||||||
if (ret != 0) {
|
LOG_DBG("0x%x didn't get open lock, wait for it to be released", c_token);
|
||||||
LOG_DBG("0x%x didn't get open lock, wait for it to be released, %d",
|
|
||||||
c_token, ret);
|
|
||||||
k_mutex_unlock(&ctrl->data_mutex);
|
k_mutex_unlock(&ctrl->data_mutex);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -337,6 +334,7 @@ int sip_svc_open(void *ct, uint32_t c_token, k_timeout_t k_timeout)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
k_timer_stop(&timer);
|
||||||
LOG_ERR("Timedout at %s for 0x%x", __func__, c_token);
|
LOG_ERR("Timedout at %s for 0x%x", __func__, c_token);
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
@ -386,7 +384,7 @@ int sip_svc_close(void *ct, uint32_t c_token, struct sip_svc_request *pre_close_
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CONFIG_ARM_SIP_SVC_SUBSYS_SINGLY_OPEN
|
#if CONFIG_ARM_SIP_SVC_SUBSYS_SINGLY_OPEN
|
||||||
k_mutex_unlock(&ctrl->open_mutex);
|
(void)atomic_set(&ctrl->open_lock, SIP_SVC_OPEN_UNLOCKED);
|
||||||
#endif
|
#endif
|
||||||
k_mutex_unlock(&ctrl->data_mutex);
|
k_mutex_unlock(&ctrl->data_mutex);
|
||||||
|
|
||||||
|
@ -802,8 +800,7 @@ void *sip_svc_get_controller(char *method)
|
||||||
/**
|
/**
|
||||||
* For more info on below code check @ref SIP_SVC_CONTROLLER_DEFINE()
|
* For more info on below code check @ref SIP_SVC_CONTROLLER_DEFINE()
|
||||||
*/
|
*/
|
||||||
STRUCT_SECTION_FOREACH(sip_svc_controller, ctrl)
|
STRUCT_SECTION_FOREACH(sip_svc_controller, ctrl) {
|
||||||
{
|
|
||||||
if (!strncmp(ctrl->method, method, SIP_SVC_SUBSYS_CONDUIT_NAME_LENGTH)) {
|
if (!strncmp(ctrl->method, method, SIP_SVC_SUBSYS_CONDUIT_NAME_LENGTH)) {
|
||||||
return (void *)ctrl;
|
return (void *)ctrl;
|
||||||
}
|
}
|
||||||
|
@ -831,8 +828,7 @@ static int sip_svc_subsys_init(void)
|
||||||
* SIP_SVC_CONTROLLER_DEFINE(),see @ref SIP_SVC_CONTROLLER_DEFINE() for more
|
* SIP_SVC_CONTROLLER_DEFINE(),see @ref SIP_SVC_CONTROLLER_DEFINE() for more
|
||||||
* info.
|
* info.
|
||||||
*/
|
*/
|
||||||
STRUCT_SECTION_FOREACH(sip_svc_controller, ctrl)
|
STRUCT_SECTION_FOREACH(sip_svc_controller, ctrl) {
|
||||||
{
|
|
||||||
if (!device_is_ready(ctrl->dev)) {
|
if (!device_is_ready(ctrl->dev)) {
|
||||||
LOG_ERR("device not ready");
|
LOG_ERR("device not ready");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
@ -926,10 +922,11 @@ static int sip_svc_subsys_init(void)
|
||||||
ctrl->active_job_cnt = 0;
|
ctrl->active_job_cnt = 0;
|
||||||
ctrl->active_async_job_cnt = 0;
|
ctrl->active_async_job_cnt = 0;
|
||||||
|
|
||||||
/* Initialize mutex */
|
/* Initialize atomic variable */
|
||||||
#if CONFIG_ARM_SIP_SVC_SUBSYS_SINGLY_OPEN
|
#if CONFIG_ARM_SIP_SVC_SUBSYS_SINGLY_OPEN
|
||||||
k_mutex_init(&ctrl->open_mutex);
|
(void)atomic_set(&ctrl->open_lock, SIP_SVC_OPEN_UNLOCKED);
|
||||||
#endif
|
#endif
|
||||||
|
/* Initialize mutex */
|
||||||
k_mutex_init(&ctrl->data_mutex);
|
k_mutex_init(&ctrl->data_mutex);
|
||||||
|
|
||||||
ctrl->init = true;
|
ctrl->init = true;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue