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:
Mahesh Rao 2023-07-30 12:47:34 +00:00 committed by Carles Cufí
commit c13466974e
2 changed files with 23 additions and 16 deletions

View file

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

View file

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