diff options
author | Holmes Chou <holmeschou@google.com> | 2022-12-19 08:25:42 +0000 |
---|---|---|
committer | TreeHugger Robot <treehugger-gerrit@google.com> | 2022-12-21 07:43:33 +0000 |
commit | a9f5b66b820ac0c2cba690e482b4fc6e8e7dfe48 (patch) | |
tree | 3cb5cadee543abe4c90e4fa6d7745a2c38831a5c /lwis_allocator.c | |
parent | 9a87a088a2fb1b9644dee8b917524d73f030c517 (diff) | |
download | lwis-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.c | 17 |
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) |