wifi: eswifi: Allow nested locking

In order to prevent potential deadlock in various callbacks such as
accept, recv, etc... Add support for nested eswifi locking, allowing
callee to safely access back to the eswifi methods.

Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
This commit is contained in:
Loic Poulain 2019-02-13 18:02:54 +01:00 committed by Jukka Rissanen
commit 033b267085

View file

@ -9,6 +9,7 @@
#include <zephyr.h>
#include <kernel.h>
#include <kernel_structs.h>
#include <net/wifi_mgmt.h>
@ -71,6 +72,8 @@ struct eswifi_dev {
u8_t mac[6];
char buf[MAX_DATA_SIZE];
struct k_mutex mutex;
atomic_val_t mutex_owner;
unsigned int mutex_depth;
void *bus_data;
struct eswifi_off_socket socket[ESWIFI_OFFLOAD_MAX_SOCKETS];
};
@ -89,12 +92,22 @@ static inline int eswifi_request(struct eswifi_dev *eswifi, char *cmd,
static inline void eswifi_lock(struct eswifi_dev *eswifi)
{
/* Nested locking */
if (atomic_get(&eswifi->mutex_owner) != (atomic_t)(uintptr_t)_current) {
k_mutex_lock(&eswifi->mutex, K_FOREVER);
atomic_set(&eswifi->mutex_owner, (atomic_t)(uintptr_t)_current);
eswifi->mutex_depth = 1;
} else {
eswifi->mutex_depth++;
}
}
static inline void eswifi_unlock(struct eswifi_dev *eswifi)
{
if (!--eswifi->mutex_depth) {
atomic_set(&eswifi->mutex_owner, -1);
k_mutex_unlock(&eswifi->mutex);
}
}
extern struct eswifi_bus_ops eswifi_bus_ops_spi;