Remove metadata bits manipulation abstraction

Signed-off-by: Adam Rutkowski <adam.j.rutkowski@intel.com>
This commit is contained in:
Adam Rutkowski 2020-11-23 13:16:39 -06:00
parent 98cba1603f
commit 05c0826c0f
3 changed files with 104 additions and 169 deletions

View File

@ -2788,6 +2788,62 @@ static const struct ocf_metadata_iface metadata_hash_iface = {
#include "metadata_bit.h"
#define _ocf_metadata_funcs_5arg(what) \
bool ocf_metadata_##what(struct ocf_cache *cache, \
ocf_cache_line_t line, uint8_t start, uint8_t stop, bool all) \
{ \
switch (cache->metadata.settings.size) { \
case ocf_cache_line_size_4: \
return _ocf_metadata_##what##_u8(cache, line, start, stop, all); \
case ocf_cache_line_size_8: \
return _ocf_metadata_##what##_u16(cache, line, start, stop, all); \
case ocf_cache_line_size_16: \
return _ocf_metadata_##what##_u32(cache, line, start, stop, all); \
case ocf_cache_line_size_32: \
return _ocf_metadata_##what##_u64(cache, line, start, stop, all); \
case ocf_cache_line_size_64: \
return _ocf_metadata_##what##_u128(cache, line, start, stop, all); \
case ocf_cache_line_size_none: \
default: \
ENV_BUG_ON(1); \
return false; \
} \
} \
#define _ocf_metadata_funcs_4arg(what) \
bool ocf_metadata_##what(struct ocf_cache *cache, \
ocf_cache_line_t line, uint8_t start, uint8_t stop) \
{ \
switch (cache->metadata.settings.size) { \
case ocf_cache_line_size_4: \
return _ocf_metadata_##what##_u8(cache, line, start, stop); \
case ocf_cache_line_size_8: \
return _ocf_metadata_##what##_u16(cache, line, start, stop); \
case ocf_cache_line_size_16: \
return _ocf_metadata_##what##_u32(cache, line, start, stop); \
case ocf_cache_line_size_32: \
return _ocf_metadata_##what##_u64(cache, line, start, stop); \
case ocf_cache_line_size_64: \
return _ocf_metadata_##what##_u128(cache, line, start, stop); \
case ocf_cache_line_size_none: \
default: \
ENV_BUG_ON(1); \
return false; \
} \
} \
#define _ocf_metadata_funcs(what) \
_ocf_metadata_funcs_5arg(test_##what) \
_ocf_metadata_funcs_4arg(test_out_##what) \
_ocf_metadata_funcs_4arg(clear_##what) \
_ocf_metadata_funcs_4arg(set_##what) \
_ocf_metadata_funcs_5arg(test_and_set_##what) \
_ocf_metadata_funcs_5arg(test_and_clear_##what)
_ocf_metadata_funcs(dirty)
_ocf_metadata_funcs(valid)
static void ocf_metadata_hash_init_iface(struct ocf_cache *cache,
ocf_metadata_layout_t layout)
{
@ -2802,104 +2858,6 @@ static void ocf_metadata_hash_init_iface(struct ocf_cache *cache,
iface->layout = layout;
/* Initialize bit status function */
switch (cache->metadata.settings.size) {
case ocf_cache_line_size_4:
iface->test_dirty = _ocf_metadata_test_dirty_u8;
iface->test_out_dirty = _ocf_metadata_test_out_dirty_u8;
iface->clear_dirty = _ocf_metadata_clear_dirty_u8;
iface->set_dirty = _ocf_metadata_set_dirty_u8;
iface->test_and_set_dirty = _ocf_metadata_test_and_set_dirty_u8;
iface->test_and_clear_dirty =
_ocf_metadata_test_and_clear_dirty_u8;
iface->test_valid = _ocf_metadata_test_valid_u8;
iface->test_out_valid = _ocf_metadata_test_out_valid_u8;
iface->clear_valid = _ocf_metadata_clear_valid_u8;
iface->set_valid = _ocf_metadata_set_valid_u8;
iface->test_and_set_valid = _ocf_metadata_test_and_set_valid_u8;
iface->test_and_clear_valid =
_ocf_metadata_test_and_clear_valid_u8;
break;
case ocf_cache_line_size_8:
iface->test_dirty = _ocf_metadata_test_dirty_u16;
iface->test_out_dirty = _ocf_metadata_test_out_dirty_u16;
iface->clear_dirty = _ocf_metadata_clear_dirty_u16;
iface->set_dirty = _ocf_metadata_set_dirty_u16;
iface->test_and_set_dirty =
_ocf_metadata_test_and_set_dirty_u16;
iface->test_and_clear_dirty =
_ocf_metadata_test_and_clear_dirty_u16;
iface->test_valid = _ocf_metadata_test_valid_u16;
iface->test_out_valid = _ocf_metadata_test_out_valid_u16;
iface->clear_valid = _ocf_metadata_clear_valid_u16;
iface->set_valid = _ocf_metadata_set_valid_u16;
iface->test_and_set_valid =
_ocf_metadata_test_and_set_valid_u16;
iface->test_and_clear_valid =
_ocf_metadata_test_and_clear_valid_u16;
break;
case ocf_cache_line_size_16:
iface->test_dirty = _ocf_metadata_test_dirty_u32;
iface->test_out_dirty = _ocf_metadata_test_out_dirty_u32;
iface->clear_dirty = _ocf_metadata_clear_dirty_u32;
iface->set_dirty = _ocf_metadata_set_dirty_u32;
iface->test_and_set_dirty =
_ocf_metadata_test_and_set_dirty_u32;
iface->test_and_clear_dirty =
_ocf_metadata_test_and_clear_dirty_u32;
iface->test_valid = _ocf_metadata_test_valid_u32;
iface->test_out_valid = _ocf_metadata_test_out_valid_u32;
iface->clear_valid = _ocf_metadata_clear_valid_u32;
iface->set_valid = _ocf_metadata_set_valid_u32;
iface->test_and_set_valid =
_ocf_metadata_test_and_set_valid_u32;
iface->test_and_clear_valid =
_ocf_metadata_test_and_clear_valid_u32;
break;
case ocf_cache_line_size_32:
iface->test_dirty = _ocf_metadata_test_dirty_u64;
iface->test_out_dirty = _ocf_metadata_test_out_dirty_u64;
iface->clear_dirty = _ocf_metadata_clear_dirty_u64;
iface->set_dirty = _ocf_metadata_set_dirty_u64;
iface->test_and_set_dirty =
_ocf_metadata_test_and_set_dirty_u64;
iface->test_and_clear_dirty =
_ocf_metadata_test_and_clear_dirty_u64;
iface->test_valid = _ocf_metadata_test_valid_u64;
iface->test_out_valid = _ocf_metadata_test_out_valid_u64;
iface->clear_valid = _ocf_metadata_clear_valid_u64;
iface->set_valid = _ocf_metadata_set_valid_u64;
iface->test_and_set_valid =
_ocf_metadata_test_and_set_valid_u64;
iface->test_and_clear_valid =
_ocf_metadata_test_and_clear_valid_u64;
break;
case ocf_cache_line_size_64:
iface->test_dirty = _ocf_metadata_test_dirty_u128;
iface->test_out_dirty = _ocf_metadata_test_out_dirty_u128;
iface->clear_dirty = _ocf_metadata_clear_dirty_u128;
iface->set_dirty = _ocf_metadata_set_dirty_u128;
iface->test_and_set_dirty =
_ocf_metadata_test_and_set_dirty_u128;
iface->test_and_clear_dirty =
_ocf_metadata_test_and_clear_dirty_u128;
iface->test_valid = _ocf_metadata_test_valid_u128;
iface->test_out_valid = _ocf_metadata_test_out_valid_u128;
iface->clear_valid = _ocf_metadata_clear_valid_u128;
iface->set_valid = _ocf_metadata_set_valid_u128;
iface->test_and_set_valid =
_ocf_metadata_test_and_set_valid_u128;
iface->test_and_clear_valid =
_ocf_metadata_test_and_clear_valid_u128;
break;
default:
ENV_BUG();
break;
}
}
/*

View File

@ -12,15 +12,29 @@
* Dirty
******************************************************************************/
bool ocf_metadata_test_dirty(struct ocf_cache *cache, ocf_cache_line_t line, uint8_t start, uint8_t stop, bool all);
bool ocf_metadata_test_out_dirty(struct ocf_cache *cache, ocf_cache_line_t line, uint8_t start, uint8_t stop);
bool ocf_metadata_clear_dirty(struct ocf_cache *cache, ocf_cache_line_t line, uint8_t start, uint8_t stop);
bool ocf_metadata_set_dirty(struct ocf_cache *cache, ocf_cache_line_t line, uint8_t start, uint8_t stop);
bool ocf_metadata_test_and_set_dirty(struct ocf_cache *cache, ocf_cache_line_t line, uint8_t start, uint8_t stop, bool all);
bool ocf_metadata_test_and_clear_dirty(struct ocf_cache *cache, ocf_cache_line_t line, uint8_t start, uint8_t stop, bool all);
bool ocf_metadata_test_valid(struct ocf_cache *cache, ocf_cache_line_t line, uint8_t start, uint8_t stop, bool all);
bool ocf_metadata_test_out_valid(struct ocf_cache *cache, ocf_cache_line_t line, uint8_t start, uint8_t stop);
bool ocf_metadata_clear_valid(struct ocf_cache *cache, ocf_cache_line_t line, uint8_t start, uint8_t stop);
bool ocf_metadata_set_valid(struct ocf_cache *cache, ocf_cache_line_t line, uint8_t start, uint8_t stop);
bool ocf_metadata_test_and_set_valid(struct ocf_cache *cache, ocf_cache_line_t line, uint8_t start, uint8_t stop, bool all);
bool ocf_metadata_test_and_clear_valid(struct ocf_cache *cache, ocf_cache_line_t line, uint8_t start, uint8_t stop, bool all);
static inline void metadata_init_status_bits(struct ocf_cache *cache,
ocf_cache_line_t line)
{
OCF_METADATA_BITS_LOCK_WR();
cache->metadata.iface.clear_dirty(cache, line,
ocf_metadata_clear_dirty(cache, line,
cache->metadata.settings.sector_start,
cache->metadata.settings.sector_end);
cache->metadata.iface.clear_valid(cache, line,
ocf_metadata_clear_valid(cache, line,
cache->metadata.settings.sector_start,
cache->metadata.settings.sector_end);
@ -33,7 +47,7 @@ static inline bool metadata_test_dirty_all(struct ocf_cache *cache,
bool test;
OCF_METADATA_BITS_LOCK_RD();
test = cache->metadata.iface.test_dirty(cache, line,
test = ocf_metadata_test_dirty(cache, line,
cache->metadata.settings.sector_start,
cache->metadata.settings.sector_end, true);
OCF_METADATA_BITS_UNLOCK_RD();
@ -47,7 +61,7 @@ static inline bool metadata_test_dirty(struct ocf_cache *cache,
bool test;
OCF_METADATA_BITS_LOCK_RD();
test = cache->metadata.iface.test_dirty(cache, line,
test = ocf_metadata_test_dirty(cache, line,
cache->metadata.settings.sector_start,
cache->metadata.settings.sector_end, false);
OCF_METADATA_BITS_UNLOCK_RD();
@ -59,7 +73,7 @@ static inline void metadata_set_dirty(struct ocf_cache *cache,
ocf_cache_line_t line)
{
OCF_METADATA_BITS_LOCK_WR();
cache->metadata.iface.set_dirty(cache, line,
ocf_metadata_set_dirty(cache, line,
cache->metadata.settings.sector_start,
cache->metadata.settings.sector_end);
OCF_METADATA_BITS_UNLOCK_WR();
@ -69,7 +83,7 @@ static inline void metadata_clear_dirty(struct ocf_cache *cache,
ocf_cache_line_t line)
{
OCF_METADATA_BITS_LOCK_WR();
cache->metadata.iface.clear_dirty(cache, line,
ocf_metadata_clear_dirty(cache, line,
cache->metadata.settings.sector_start,
cache->metadata.settings.sector_end);
OCF_METADATA_BITS_UNLOCK_WR();
@ -81,7 +95,7 @@ static inline bool metadata_test_and_clear_dirty(
bool test;
OCF_METADATA_BITS_LOCK_WR();
test = cache->metadata.iface.test_and_clear_dirty(cache, line,
test = ocf_metadata_test_and_clear_dirty(cache, line,
cache->metadata.settings.sector_start,
cache->metadata.settings.sector_end, false);
OCF_METADATA_BITS_UNLOCK_WR();
@ -95,7 +109,7 @@ static inline bool metadata_test_and_set_dirty(struct ocf_cache *cache,
bool test;
OCF_METADATA_BITS_LOCK_WR();
test = cache->metadata.iface.test_and_set_dirty(cache, line,
test = ocf_metadata_test_and_set_dirty(cache, line,
cache->metadata.settings.sector_start,
cache->metadata.settings.sector_end, false);
OCF_METADATA_BITS_UNLOCK_WR();
@ -113,7 +127,7 @@ static inline bool metadata_test_dirty_sec(struct ocf_cache *cache,
bool test;
OCF_METADATA_BITS_LOCK_RD();
test = cache->metadata.iface.test_dirty(cache, line,
test = ocf_metadata_test_dirty(cache, line,
start, stop, false);
OCF_METADATA_BITS_UNLOCK_RD();
@ -126,7 +140,7 @@ static inline bool metadata_test_dirty_all_sec(struct ocf_cache *cache,
bool test;
OCF_METADATA_BITS_LOCK_RD();
test = cache->metadata.iface.test_dirty(cache, line,
test = ocf_metadata_test_dirty(cache, line,
start, stop, true);
OCF_METADATA_BITS_UNLOCK_RD();
@ -145,7 +159,7 @@ static inline bool metadata_test_dirty_out_sec(struct ocf_cache *cache,
bool test;
OCF_METADATA_BITS_LOCK_RD();
test = cache->metadata.iface.test_out_dirty(cache, line, start, stop);
test = ocf_metadata_test_out_dirty(cache, line, start, stop);
OCF_METADATA_BITS_UNLOCK_RD();
return test;
@ -155,7 +169,7 @@ static inline void metadata_set_dirty_sec(struct ocf_cache *cache,
ocf_cache_line_t line, uint8_t start, uint8_t stop)
{
OCF_METADATA_BITS_LOCK_WR();
cache->metadata.iface.set_dirty(cache, line, start, stop);
ocf_metadata_set_dirty(cache, line, start, stop);
OCF_METADATA_BITS_UNLOCK_WR();
}
@ -163,7 +177,7 @@ static inline void metadata_clear_dirty_sec(struct ocf_cache *cache,
ocf_cache_line_t line, uint8_t start, uint8_t stop)
{
OCF_METADATA_BITS_LOCK_WR();
cache->metadata.iface.clear_dirty(cache, line, start, stop);
ocf_metadata_clear_dirty(cache, line, start, stop);
OCF_METADATA_BITS_UNLOCK_WR();
}
@ -171,7 +185,7 @@ static inline void metadata_set_dirty_sec_one(struct ocf_cache *cache,
ocf_cache_line_t line, uint8_t pos)
{
OCF_METADATA_BITS_LOCK_WR();
cache->metadata.iface.set_dirty(cache, line, pos, pos);
ocf_metadata_set_dirty(cache, line, pos, pos);
OCF_METADATA_BITS_UNLOCK_WR();
}
@ -179,7 +193,7 @@ static inline void metadata_clear_dirty_sec_one(struct ocf_cache *cache,
ocf_cache_line_t line, uint8_t pos)
{
OCF_METADATA_BITS_LOCK_WR();
cache->metadata.iface.clear_dirty(cache, line, pos, pos);
ocf_metadata_clear_dirty(cache, line, pos, pos);
OCF_METADATA_BITS_UNLOCK_WR();
}
@ -190,7 +204,7 @@ static inline bool metadata_test_and_clear_dirty_sec(
bool test = false;
OCF_METADATA_BITS_LOCK_WR();
test = cache->metadata.iface.test_and_clear_dirty(cache, line,
test = ocf_metadata_test_and_clear_dirty(cache, line,
start, stop, false);
OCF_METADATA_BITS_UNLOCK_WR();
@ -211,9 +225,9 @@ static inline bool metadata_clear_dirty_sec_changed(
OCF_METADATA_BITS_LOCK_WR();
sec_changed = cache->metadata.iface.test_dirty(cache, line,
sec_changed = ocf_metadata_test_dirty(cache, line,
start, stop, false);
*line_is_clean = !cache->metadata.iface.clear_dirty(cache, line,
*line_is_clean = !ocf_metadata_clear_dirty(cache, line,
start, stop);
OCF_METADATA_BITS_UNLOCK_WR();
@ -234,9 +248,9 @@ static inline bool metadata_set_dirty_sec_changed(
bool sec_changed;
OCF_METADATA_BITS_LOCK_WR();
sec_changed = !cache->metadata.iface.test_dirty(cache, line,
sec_changed = !ocf_metadata_test_dirty(cache, line,
start, stop, true);
*line_was_dirty = cache->metadata.iface.set_dirty(cache, line, start,
*line_was_dirty = ocf_metadata_set_dirty(cache, line, start,
stop);
OCF_METADATA_BITS_UNLOCK_WR();
@ -253,7 +267,7 @@ static inline bool metadata_test_valid_any(struct ocf_cache *cache,
bool test;
OCF_METADATA_BITS_LOCK_RD();
test = cache->metadata.iface.test_valid(cache, line,
test = ocf_metadata_test_valid(cache, line,
cache->metadata.settings.sector_start,
cache->metadata.settings.sector_end, false);
OCF_METADATA_BITS_UNLOCK_RD();
@ -267,7 +281,7 @@ static inline bool metadata_test_valid(struct ocf_cache *cache,
bool test;
OCF_METADATA_BITS_LOCK_RD();
test = cache->metadata.iface.test_valid(cache, line,
test = ocf_metadata_test_valid(cache, line,
cache->metadata.settings.sector_start,
cache->metadata.settings.sector_end, true);
OCF_METADATA_BITS_UNLOCK_RD();
@ -279,7 +293,7 @@ static inline void metadata_set_valid(struct ocf_cache *cache,
ocf_cache_line_t line)
{
OCF_METADATA_BITS_LOCK_WR();
cache->metadata.iface.set_valid(cache, line,
ocf_metadata_set_valid(cache, line,
cache->metadata.settings.sector_start,
cache->metadata.settings.sector_end);
OCF_METADATA_BITS_UNLOCK_WR();
@ -289,7 +303,7 @@ static inline void metadata_clear_valid(struct ocf_cache *cache,
ocf_cache_line_t line)
{
OCF_METADATA_BITS_LOCK_WR();
cache->metadata.iface.clear_valid(cache, line,
ocf_metadata_clear_valid(cache, line,
cache->metadata.settings.sector_start,
cache->metadata.settings.sector_end);
OCF_METADATA_BITS_UNLOCK_WR();
@ -301,7 +315,7 @@ static inline bool metadata_test_and_clear_valid(
bool test = false;
OCF_METADATA_BITS_LOCK_WR();
test = cache->metadata.iface.test_and_clear_valid(cache, line,
test = ocf_metadata_test_and_clear_valid(cache, line,
cache->metadata.settings.sector_start,
cache->metadata.settings.sector_end, true);
OCF_METADATA_BITS_UNLOCK_WR();
@ -315,7 +329,7 @@ static inline bool metadata_test_and_set_valid(struct ocf_cache *cache,
bool test = false;
OCF_METADATA_BITS_LOCK_WR();
test = cache->metadata.iface.test_and_set_valid(cache, line,
test = ocf_metadata_test_and_set_valid(cache, line,
cache->metadata.settings.sector_start,
cache->metadata.settings.sector_end, true);
OCF_METADATA_BITS_UNLOCK_WR();
@ -333,7 +347,7 @@ static inline bool metadata_test_valid_sec(struct ocf_cache *cache,
bool test;
OCF_METADATA_BITS_LOCK_RD();
test = cache->metadata.iface.test_valid(cache, line,
test = ocf_metadata_test_valid(cache, line,
start, stop, true);
OCF_METADATA_BITS_UNLOCK_RD();
@ -347,7 +361,7 @@ static inline bool metadata_test_valid_any_out_sec(
bool test = false;
OCF_METADATA_BITS_LOCK_RD();
test = cache->metadata.iface.test_out_valid(cache, line,
test = ocf_metadata_test_out_valid(cache, line,
start, stop);
OCF_METADATA_BITS_UNLOCK_RD();
@ -374,7 +388,7 @@ static inline bool metadata_set_valid_sec_changed(
bool was_any_valid;
OCF_METADATA_BITS_LOCK_WR();
was_any_valid = cache->metadata.iface.set_valid(cache, line,
was_any_valid = ocf_metadata_set_valid(cache, line,
start, stop);
OCF_METADATA_BITS_UNLOCK_WR();
@ -385,7 +399,7 @@ static inline void metadata_clear_valid_sec(struct ocf_cache *cache,
ocf_cache_line_t line, uint8_t start, uint8_t stop)
{
OCF_METADATA_BITS_LOCK_WR();
cache->metadata.iface.clear_valid(cache, line, start, stop);
ocf_metadata_clear_valid(cache, line, start, stop);
OCF_METADATA_BITS_UNLOCK_WR();
}
@ -393,7 +407,7 @@ static inline void metadata_clear_valid_sec_one(struct ocf_cache *cache,
ocf_cache_line_t line, uint8_t pos)
{
OCF_METADATA_BITS_LOCK_WR();
cache->metadata.iface.clear_valid(cache, line, pos, pos);
ocf_metadata_clear_valid(cache, line, pos, pos);
OCF_METADATA_BITS_UNLOCK_WR();
}
@ -401,7 +415,7 @@ static inline void metadata_set_valid_sec_one(struct ocf_cache *cache,
ocf_cache_line_t line, uint8_t pos)
{
OCF_METADATA_BITS_LOCK_WR();
cache->metadata.iface.set_valid(cache, line, pos, pos);
ocf_metadata_set_valid(cache, line, pos, pos);
OCF_METADATA_BITS_UNLOCK_WR();
}
/*
@ -419,11 +433,11 @@ static inline bool metadata_clear_valid_sec_changed(
OCF_METADATA_BITS_LOCK_WR();
was_any_valid = cache->metadata.iface.test_valid(cache, line,
was_any_valid = ocf_metadata_test_valid(cache, line,
cache->metadata.settings.sector_start,
cache->metadata.settings.sector_end, false);
*is_valid = cache->metadata.iface.clear_valid(cache, line,
*is_valid = ocf_metadata_clear_valid(cache, line,
start, stop);
OCF_METADATA_BITS_UNLOCK_WR();

View File

@ -315,43 +315,6 @@ struct ocf_metadata_iface {
struct ocf_metadata_status*
(*wr_status_access)(struct ocf_cache *cache,
ocf_cache_line_t line);
bool (*test_dirty)(struct ocf_cache *cache,
ocf_cache_line_t line, uint8_t start, uint8_t stop, bool all);
bool (*test_out_dirty)(struct ocf_cache *cache,
ocf_cache_line_t line, uint8_t start, uint8_t stop);
bool (*clear_dirty)(struct ocf_cache *cache,
ocf_cache_line_t line, uint8_t start, uint8_t stop);
bool (*set_dirty)(struct ocf_cache *cache,
ocf_cache_line_t line, uint8_t start, uint8_t stop);
bool (*test_and_set_dirty)(struct ocf_cache *cache,
ocf_cache_line_t line, uint8_t start, uint8_t stop, bool all);
bool (*test_and_clear_dirty)(struct ocf_cache *cache,
ocf_cache_line_t line, uint8_t start, uint8_t stop, bool all);
bool (*test_valid)(struct ocf_cache *cache,
ocf_cache_line_t line, uint8_t start, uint8_t stop, bool all);
bool (*test_out_valid)(struct ocf_cache *cache,
ocf_cache_line_t line, uint8_t start, uint8_t stop);
bool (*clear_valid)(struct ocf_cache *cache,
ocf_cache_line_t line, uint8_t start, uint8_t stop);
bool (*set_valid)(struct ocf_cache *cache,
ocf_cache_line_t line, uint8_t start, uint8_t stop);
bool (*test_and_set_valid)(struct ocf_cache *cache,
ocf_cache_line_t line, uint8_t start, uint8_t stop, bool all);
bool (*test_and_clear_valid)(struct ocf_cache *cache,
ocf_cache_line_t line, uint8_t start, uint8_t stop, bool all);
};
struct ocf_cache_line_settings {