Adding collision table locks
Signed-off-by: Adam Rutkowski <adam.j.rutkowski@intel.com>
This commit is contained in:
@@ -71,6 +71,8 @@ int ocf_cache_line_concurrency_init(struct ocf_cache *cache)
|
||||
int error = 0;
|
||||
struct ocf_cache_line_concurrency *c;
|
||||
char name[ALLOCATOR_NAME_MAX];
|
||||
ocf_cache_line_t line_entries = ocf_metadata_collision_table_entries(
|
||||
cache);
|
||||
|
||||
ENV_BUG_ON(cache->device->concurrency.cache_line);
|
||||
|
||||
@@ -85,8 +87,8 @@ int ocf_cache_line_concurrency_init(struct ocf_cache *cache)
|
||||
cache->device->concurrency.cache_line = c;
|
||||
|
||||
OCF_REALLOC_INIT(&c->access, &c->access_limit);
|
||||
OCF_REALLOC_CP(&c->access, sizeof(c->access[0]),
|
||||
cache->device->collision_table_entries, &c->access_limit);
|
||||
OCF_REALLOC_CP(&c->access, sizeof(c->access[0]), line_entries,
|
||||
&c->access_limit);
|
||||
|
||||
if (!c->access) {
|
||||
error = __LINE__;
|
||||
|
@@ -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]);
|
||||
}
|
||||
|
@@ -16,7 +16,7 @@ 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);
|
||||
|
||||
void ocf_metadata_concurrency_attached_deinit(
|
||||
struct ocf_metadata_lock *metadata_lock);
|
||||
@@ -111,4 +111,13 @@ void ocf_req_hash_lock_wr(struct ocf_request *req);
|
||||
void ocf_req_hash_unlock_wr(struct ocf_request *req);
|
||||
void ocf_req_hash_lock_upgrade(struct ocf_request *req);
|
||||
|
||||
/* collision table page lock interface */
|
||||
void ocf_collision_start_shared_access(struct ocf_metadata_lock *metadata_lock,
|
||||
uint32_t page);
|
||||
void ocf_collision_end_shared_access(struct ocf_metadata_lock *metadata_lock,
|
||||
uint32_t page);
|
||||
void ocf_collision_start_exclusive_access(struct ocf_metadata_lock *metadata_lock,
|
||||
uint32_t page);
|
||||
void ocf_collision_end_exclusive_access(struct ocf_metadata_lock *metadata_lock,
|
||||
uint32_t page);
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user