89 lines
2.5 KiB
C
89 lines
2.5 KiB
C
/*
|
|
* Copyright(c) 2012-2018 Intel Corporation
|
|
* SPDX-License-Identifier: BSD-3-Clause-Clear
|
|
*/
|
|
|
|
#include "ocf/ocf.h"
|
|
#include "metadata.h"
|
|
#include "../utils/utils_cache_line.h"
|
|
|
|
/*
|
|
*
|
|
*/
|
|
void ocf_metadata_add_to_collision(struct ocf_cache *cache,
|
|
ocf_core_id_t core_id, uint64_t core_line,
|
|
ocf_cache_line_t hash, ocf_cache_line_t cache_line)
|
|
{
|
|
ocf_cache_line_t prev_cache_line = ocf_metadata_get_hash(cache, hash);
|
|
ocf_cache_line_t line_entries = cache->device->collision_table_entries;
|
|
ocf_cache_line_t hash_entries = cache->device->hash_table_entries;
|
|
|
|
ENV_BUG_ON(!(hash < hash_entries));
|
|
ENV_BUG_ON(!(cache_line < line_entries));
|
|
|
|
/* Setup new node */
|
|
ocf_metadata_set_core_info(cache, cache_line, core_id,
|
|
core_line);
|
|
|
|
/* Update collision info:
|
|
* - next is set to value from hash table;
|
|
* - previous is set to collision table entries value
|
|
*/
|
|
ocf_metadata_set_collision_info(cache, cache_line, prev_cache_line,
|
|
line_entries);
|
|
|
|
/* Update previous head */
|
|
if (prev_cache_line != line_entries) {
|
|
ocf_metadata_set_collision_prev(cache, prev_cache_line,
|
|
cache_line);
|
|
}
|
|
|
|
/* Update hash Table: hash table contains pointer to
|
|
* collision table so it contains indexes in collision table
|
|
*/
|
|
ocf_metadata_set_hash(cache, hash, cache_line);
|
|
}
|
|
|
|
/*
|
|
*
|
|
*/
|
|
void ocf_metadata_remove_from_collision(struct ocf_cache *cache,
|
|
ocf_cache_line_t line, ocf_part_id_t part_id)
|
|
{
|
|
ocf_core_id_t core_id;
|
|
uint64_t core_sector;
|
|
ocf_cache_line_t hash_father;
|
|
ocf_cache_line_t prev_line, next_line;
|
|
ocf_cache_line_t line_entries = cache->device->collision_table_entries;
|
|
ocf_cache_line_t hash_entries = cache->device->hash_table_entries;
|
|
|
|
ENV_BUG_ON(!(line < line_entries));
|
|
|
|
ocf_metadata_get_collision_info(cache, line, &next_line, &prev_line);
|
|
|
|
/* Update previous node if any. */
|
|
if (prev_line != line_entries)
|
|
ocf_metadata_set_collision_next(cache, prev_line, next_line);
|
|
|
|
/* Update next node if any. */
|
|
if (next_line != line_entries)
|
|
ocf_metadata_set_collision_prev(cache, next_line, prev_line);
|
|
|
|
ocf_metadata_get_core_info(cache, line, &core_id, &core_sector);
|
|
|
|
/* Update hash table, because if it was pointing to the given node it
|
|
* must now point to the given's node next
|
|
*/
|
|
hash_father = ocf_metadata_hash_func(cache, core_sector, core_id);
|
|
ENV_BUG_ON(!(hash_father < hash_entries));
|
|
|
|
if (ocf_metadata_get_hash(cache, hash_father) == line)
|
|
ocf_metadata_set_hash(cache, hash_father, next_line);
|
|
|
|
ocf_metadata_set_collision_info(cache, line,
|
|
line_entries, line_entries);
|
|
|
|
ocf_metadata_set_core_info(cache, line,
|
|
OCF_CORE_MAX, ULLONG_MAX);
|
|
}
|