summaryrefslogtreecommitdiff
path: root/lwis_allocator.c
diff options
context:
space:
mode:
authorHolmes Chou <holmeschou@google.com>2022-12-19 08:25:42 +0000
committerTreeHugger Robot <treehugger-gerrit@google.com>2022-12-21 07:43:33 +0000
commita9f5b66b820ac0c2cba690e482b4fc6e8e7dfe48 (patch)
tree3cb5cadee543abe4c90e4fa6d7745a2c38831a5c /lwis_allocator.c
parent9a87a088a2fb1b9644dee8b917524d73f030c517 (diff)
downloadlwis-a9f5b66b820ac0c2cba690e482b4fc6e8e7dfe48.tar.gz
LWIS: Add lock to protect lwis_dev->block_mgr accessing
Add lock to protect lwis_dev->block_mgr accessing Bug: 239873326 Test: GCA, CTS Change-Id: I88787b47cbe83d78be4c09993bdb933a832183ea Signed-off-by: Holmes Chou <holmeschou@google.com>
Diffstat (limited to 'lwis_allocator.c')
-rw-r--r--lwis_allocator.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/lwis_allocator.c b/lwis_allocator.c
index 74fd4cf..66e738a 100644
--- a/lwis_allocator.c
+++ b/lwis_allocator.c
@@ -149,24 +149,25 @@ allocator_get_block_pool(struct lwis_allocator_block_mgr *block_mgr, int idx)
int lwis_allocator_init(struct lwis_device *lwis_dev)
{
struct lwis_allocator_block_mgr *block_mgr;
- unsigned long flags;
if (lwis_dev == NULL) {
dev_err(lwis_dev->dev, "lwis_dev is NULL\n");
return -EINVAL;
}
+ mutex_lock(&lwis_dev->client_lock);
+
if (lwis_dev->block_mgr != NULL) {
block_mgr = lwis_dev->block_mgr;
- spin_lock_irqsave(&block_mgr->lock, flags);
block_mgr->ref_count++;
- spin_unlock_irqrestore(&block_mgr->lock, flags);
+ mutex_unlock(&lwis_dev->client_lock);
return 0;
}
block_mgr = kzalloc(sizeof(struct lwis_allocator_block_mgr), GFP_KERNEL);
if (block_mgr == NULL) {
dev_err(lwis_dev->dev, "Allocate block_mgr failed\n");
+ mutex_unlock(&lwis_dev->client_lock);
return -ENOMEM;
}
@@ -190,29 +191,31 @@ int lwis_allocator_init(struct lwis_device *lwis_dev)
block_mgr->ref_count = 1;
lwis_dev->block_mgr = block_mgr;
+ mutex_unlock(&lwis_dev->client_lock);
return 0;
}
void lwis_allocator_release(struct lwis_device *lwis_dev)
{
struct lwis_allocator_block_mgr *block_mgr;
- unsigned long flags;
if (lwis_dev == NULL) {
dev_err(lwis_dev->dev, "lwis_dev is NULL\n");
return;
}
+ mutex_lock(&lwis_dev->client_lock);
+
block_mgr = lwis_dev->block_mgr;
if (block_mgr == NULL) {
dev_err(lwis_dev->dev, "block_mgr is NULL\n");
+ mutex_unlock(&lwis_dev->client_lock);
return;
}
- spin_lock_irqsave(&block_mgr->lock, flags);
block_mgr->ref_count--;
if (block_mgr->ref_count > 0) {
- spin_unlock_irqrestore(&block_mgr->lock, flags);
+ mutex_unlock(&lwis_dev->client_lock);
return;
}
@@ -223,10 +226,10 @@ void lwis_allocator_release(struct lwis_device *lwis_dev)
allocator_block_pool_free_locked(lwis_dev, &block_mgr->pool_128k);
allocator_block_pool_free_locked(lwis_dev, &block_mgr->pool_256k);
allocator_block_pool_free_locked(lwis_dev, &block_mgr->pool_512k);
- spin_unlock_irqrestore(&block_mgr->lock, flags);
kfree(block_mgr);
lwis_dev->block_mgr = NULL;
+ mutex_unlock(&lwis_dev->client_lock);
}
void *lwis_allocator_allocate(struct lwis_device *lwis_dev, size_t size)