Merge pull request #439 from mmichal10/remove_core_fine_lock

Remove core fine lock
This commit is contained in:
Robert Baldyga 2021-01-15 21:10:14 +01:00 committed by GitHub
commit 3f7139a814
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 117 additions and 32 deletions

View File

@ -1157,3 +1157,17 @@ void ocf_cache_line_unlock_rd(struct ocf_cache *cache, ocf_cache_line_t line)
__unlock_cache_line_rd(c, line);
}
bool ocf_cache_line_try_lock_wr(struct ocf_cache *cache, ocf_cache_line_t line)
{
struct ocf_cache_line_concurrency *c = cache->device->concurrency.cache_line;
return __lock_cache_line_wr(c, line, NULL, NULL, 0);
}
void ocf_cache_line_unlock_wr(struct ocf_cache *cache, ocf_cache_line_t line)
{
struct ocf_cache_line_concurrency *c = cache->device->concurrency.cache_line;
OCF_DEBUG_RQ(cache, "Cache line = %u", line);
__unlock_cache_line_wr(c, line);
}

View File

@ -161,4 +161,23 @@ void ocf_cache_line_unlock_rd(struct ocf_cache *cache, ocf_cache_line_t line);
*/
bool ocf_cache_line_try_lock_rd(struct ocf_cache *cache, ocf_cache_line_t line);
/**
* @brief Release cache line write lock
*
* @param cache - OCF cache instance
* @param line - Cache line to be unlocked
*/
void ocf_cache_line_unlock_wr(struct ocf_cache *cache, ocf_cache_line_t line);
/**
* @brief Attempt to lock cache line for write
*
* @param cache - OCF cache instance
* @param line - Cache line to be checked for waiters
*
* @retval true - write lock successfully acquired
* @retval false - failed to acquire write lock
*/
bool ocf_cache_line_try_lock_wr(struct ocf_cache *cache, ocf_cache_line_t line);
#endif /* OCF_CONCURRENCY_H_ */

View File

@ -221,6 +221,34 @@ int ocf_metadata_hash_try_lock(struct ocf_metadata_lock *metadata_lock,
return 0;
}
void ocf_metadata_lock_hash_rd(struct ocf_metadata_lock *metadata_lock,
ocf_cache_line_t hash)
{
ocf_metadata_start_shared_access(metadata_lock);
ocf_metadata_hash_lock(metadata_lock, hash, OCF_METADATA_RD);
}
void ocf_metadata_unlock_hash_rd(struct ocf_metadata_lock *metadata_lock,
ocf_cache_line_t hash)
{
ocf_metadata_hash_unlock(metadata_lock, hash, OCF_METADATA_RD);
ocf_metadata_end_shared_access(metadata_lock);
}
void ocf_metadata_lock_hash_wr(struct ocf_metadata_lock *metadata_lock,
ocf_cache_line_t hash)
{
ocf_metadata_start_shared_access(metadata_lock);
ocf_metadata_hash_lock(metadata_lock, hash, OCF_METADATA_WR);
}
void ocf_metadata_unlock_hash_wr(struct ocf_metadata_lock *metadata_lock,
ocf_cache_line_t hash)
{
ocf_metadata_hash_unlock(metadata_lock, hash, OCF_METADATA_WR);
ocf_metadata_end_shared_access(metadata_lock);
}
/* NOTE: attempt to acquire hash lock for multiple core lines may end up
* in deadlock. In order to hash lock multiple core lines safely, use
* ocf_req_hash_lock_* functions */

View File

@ -136,6 +136,17 @@ static inline void ocf_metadata_status_bits_unlock(
ocf_metadata_status_bits_unlock(&cache->metadata.lock, \
OCF_METADATA_WR)
/* lock/unlock single hash */
void ocf_metadata_lock_hash_rd(struct ocf_metadata_lock *metadata_lock,
ocf_cache_line_t hash);
void ocf_metadata_unlock_hash_rd(struct ocf_metadata_lock *metadata_lock,
ocf_cache_line_t hash);
void ocf_metadata_lock_hash_wr(struct ocf_metadata_lock *metadata_lock,
ocf_cache_line_t hash);
void ocf_metadata_unlock_hash_wr(struct ocf_metadata_lock *metadata_lock,
ocf_cache_line_t hash);
/* lock/unlock single hash provided core id and core line */
void ocf_metadata_hash_lock_rd(struct ocf_metadata_lock *metadata_lock,
uint32_t core_id, uint64_t core_line);
void ocf_metadata_hash_unlock_rd(struct ocf_metadata_lock *metadata_lock,

View File

@ -91,8 +91,8 @@ int ocf_metadata_actor(struct ocf_cache *cache,
/* the caller must hold the relevant cache block concurrency reader lock
* and the metadata lock
*/
void ocf_metadata_sparse_cache_line(struct ocf_cache *cache,
uint32_t cache_line)
void ocf_metadata_remove_cache_line(struct ocf_cache *cache,
ocf_cache_line_t cache_line)
{
ocf_part_id_t partition_id =
ocf_metadata_get_partition_id(cache, cache_line);
@ -104,8 +104,8 @@ void ocf_metadata_sparse_cache_line(struct ocf_cache *cache,
ocf_freelist_put_cache_line(cache->freelist, cache_line);
}
static void _ocf_metadata_sparse_cache_line(struct ocf_cache *cache,
uint32_t cache_line)
void ocf_metadata_sparse_cache_line(struct ocf_cache *cache,
ocf_cache_line_t cache_line)
{
ocf_metadata_start_collision_shared_access(cache, cache_line);
@ -127,5 +127,5 @@ int ocf_metadata_sparse_range(struct ocf_cache *cache, int core_id,
uint64_t start_byte, uint64_t end_byte)
{
return ocf_metadata_actor(cache, PARTITION_INVALID, core_id,
start_byte, end_byte, _ocf_metadata_sparse_cache_line);
start_byte, end_byte, ocf_metadata_sparse_cache_line);
}

View File

@ -21,6 +21,9 @@ static inline ocf_cache_line_t ocf_metadata_hash_func(ocf_cache_t cache,
% entries);
}
void ocf_metadata_remove_cache_line(struct ocf_cache *cache,
ocf_cache_line_t cache_line);
void ocf_metadata_sparse_cache_line(struct ocf_cache *cache,
ocf_cache_line_t cache_line);

View File

@ -54,41 +54,51 @@ void cache_mngt_core_remove_from_cleaning_pol(ocf_core_t core)
/* Deinitialize core metadata in attached metadata */
void cache_mngt_core_deinit_attached_meta(ocf_core_t core)
{
int retry = 1;
uint64_t core_size = 0;
ocf_cleaning_t clean_pol_type;
ocf_cache_t cache = ocf_core_get_cache(core);
ocf_core_id_t core_id = ocf_core_get_id(core);
ocf_core_id_t iter_core_id;
ocf_cache_line_t curr_cline, prev_cline;
uint32_t hash, num_hash = cache->device->hash_table_entries;
core_size = ocf_volume_get_length(&core->volume);
if (!core_size)
core_size = ~0ULL;
for (hash = 0; hash < num_hash;) {
prev_cline = cache->device->collision_table_entries;
ocf_metadata_lock_hash_wr(&cache->metadata.lock, hash);
ocf_metadata_start_exclusive_access(&cache->metadata.lock);
curr_cline = ocf_metadata_get_hash(cache, hash);
while (curr_cline != cache->device->collision_table_entries) {
ocf_metadata_get_core_info(cache, curr_cline, &iter_core_id,
NULL);
clean_pol_type = cache->conf_meta->cleaning_policy_type;
while (retry) {
retry = 0;
if (cleaning_policy_ops[clean_pol_type].purge_range) {
retry = cleaning_policy_ops[clean_pol_type].purge_range(cache,
core_id, 0, core_size);
if (iter_core_id != core_id) {
/* `prev_cline` is a pointer to last not sparsed cacheline in
* current hash */
prev_cline = curr_cline;
curr_cline = ocf_metadata_get_collision_next(cache, curr_cline);
continue;
}
if (!ocf_cache_line_try_lock_wr(cache, curr_cline))
break;
if (metadata_test_dirty(cache, curr_cline))
ocf_purge_cleaning_policy(cache, curr_cline);
ocf_metadata_sparse_cache_line(cache, curr_cline);
ocf_cache_line_unlock_wr(cache, curr_cline);
if (prev_cline != cache->device->collision_table_entries)
curr_cline = ocf_metadata_get_collision_next(cache, prev_cline);
else
curr_cline = ocf_metadata_get_hash(cache, hash);
}
ocf_metadata_unlock_hash_wr(&cache->metadata.lock, hash);
if (!retry) {
/* Remove from collision_table and Partition. Put in FREELIST */
retry = ocf_metadata_sparse_range(cache, core_id, 0,
core_size);
}
if (retry) {
ocf_metadata_end_exclusive_access(&cache->metadata.lock);
/* Check whether all the cachelines from the hash bucket were sparsed */
if (curr_cline == cache->device->collision_table_entries)
hash++;
else
env_msleep(100);
ocf_metadata_start_exclusive_access(
&cache->metadata.lock);
}
}
ocf_metadata_end_exclusive_access(&cache->metadata.lock);
}
/* Mark core as removed in metadata */

View File

@ -45,7 +45,7 @@ static void __set_cache_line_invalid(struct ocf_cache *cache, uint8_t start_bit,
*/
if (!is_valid && !ocf_cache_line_are_waiters(cache, line)) {
ocf_purge_eviction_policy(cache, line);
ocf_metadata_sparse_cache_line(cache, line);
ocf_metadata_remove_cache_line(cache, line);
}
}