Adding collision table locks
Signed-off-by: Adam Rutkowski <adam.j.rutkowski@intel.com>
This commit is contained in:
@@ -22,19 +22,44 @@ void ocf_metadata_concurrency_deinit(struct ocf_metadata_lock *metadata_lock)
|
||||
|
||||
int ocf_metadata_concurrency_attached_init(
|
||||
struct ocf_metadata_lock *metadata_lock, ocf_cache_t cache,
|
||||
uint64_t hash_table_entries)
|
||||
uint64_t hash_table_entries, uint32_t colision_table_pages)
|
||||
{
|
||||
uint64_t i;
|
||||
int err = 0;
|
||||
|
||||
metadata_lock->cache = cache;
|
||||
metadata_lock->num_hash_entries = hash_table_entries;
|
||||
metadata_lock->hash = env_vzalloc(sizeof(env_rwsem) *
|
||||
hash_table_entries);
|
||||
if (!metadata_lock->hash)
|
||||
metadata_lock->collision_pages = env_vzalloc(sizeof(env_rwsem) *
|
||||
colision_table_pages);
|
||||
if (!metadata_lock->hash ||
|
||||
!metadata_lock->collision_pages) {
|
||||
env_vfree(metadata_lock->hash);
|
||||
env_vfree(metadata_lock->collision_pages);
|
||||
metadata_lock->hash = NULL;
|
||||
metadata_lock->collision_pages = NULL;
|
||||
return -OCF_ERR_NO_MEM;
|
||||
}
|
||||
|
||||
for (i = 0; i < hash_table_entries; i++)
|
||||
env_rwsem_init(&metadata_lock->hash[i]);
|
||||
for (i = 0; i < colision_table_pages; i++) {
|
||||
err = env_rwsem_init(&metadata_lock->collision_pages[i]);
|
||||
if (err)
|
||||
break;
|
||||
}
|
||||
|
||||
if (err) {
|
||||
while (i--)
|
||||
env_rwsem_destroy(&metadata_lock->collision_pages[i]);
|
||||
env_vfree(metadata_lock->collision_pages);
|
||||
metadata_lock->collision_pages = NULL;
|
||||
ocf_metadata_concurrency_attached_deinit(metadata_lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
metadata_lock->cache = cache;
|
||||
metadata_lock->num_hash_entries = hash_table_entries;
|
||||
metadata_lock->num_collision_pages = colision_table_pages;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -44,10 +69,21 @@ void ocf_metadata_concurrency_attached_deinit(
|
||||
{
|
||||
uint64_t i;
|
||||
|
||||
for (i = 0; i < metadata_lock->num_hash_entries; i++)
|
||||
env_rwsem_destroy(&metadata_lock->hash[i]);
|
||||
if (metadata_lock->hash) {
|
||||
for (i = 0; i < metadata_lock->num_hash_entries; i++)
|
||||
env_rwsem_destroy(&metadata_lock->hash[i]);
|
||||
env_vfree(metadata_lock->hash);
|
||||
metadata_lock->hash = NULL;
|
||||
metadata_lock->num_hash_entries = 0;
|
||||
}
|
||||
|
||||
env_vfree(metadata_lock->hash);
|
||||
if (metadata_lock->collision_pages) {
|
||||
for (i = 0; i < metadata_lock->num_collision_pages; i++)
|
||||
env_rwsem_destroy(&metadata_lock->collision_pages[i]);
|
||||
env_vfree(metadata_lock->collision_pages);
|
||||
metadata_lock->collision_pages = NULL;
|
||||
metadata_lock->num_collision_pages = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void ocf_metadata_start_exclusive_access(
|
||||
@@ -266,3 +302,27 @@ void ocf_req_hash_unlock_wr(struct ocf_request *req)
|
||||
}
|
||||
ocf_metadata_end_shared_access(&req->cache->metadata.lock);
|
||||
}
|
||||
|
||||
void ocf_collision_start_shared_access(struct ocf_metadata_lock *metadata_lock,
|
||||
uint32_t page)
|
||||
{
|
||||
env_rwsem_down_read(&metadata_lock->collision_pages[page]);
|
||||
}
|
||||
|
||||
void ocf_collision_end_shared_access(struct ocf_metadata_lock *metadata_lock,
|
||||
uint32_t page)
|
||||
{
|
||||
env_rwsem_up_read(&metadata_lock->collision_pages[page]);
|
||||
}
|
||||
|
||||
void ocf_collision_start_exclusive_access(struct ocf_metadata_lock *metadata_lock,
|
||||
uint32_t page)
|
||||
{
|
||||
env_rwsem_down_write(&metadata_lock->collision_pages[page]);
|
||||
}
|
||||
|
||||
void ocf_collision_end_exclusive_access(struct ocf_metadata_lock *metadata_lock,
|
||||
uint32_t page)
|
||||
{
|
||||
env_rwsem_up_write(&metadata_lock->collision_pages[page]);
|
||||
}
|
||||
|
Reference in New Issue
Block a user