Add entry abstraction

Signed-off-by: Adam Rutkowski <adam.j.rutkowski@intel.com>
This commit is contained in:
Adam Rutkowski 2021-04-03 19:25:13 -05:00 committed by Kozlowski Mateusz
parent 9746df0b1a
commit fae620a070
3 changed files with 25 additions and 13 deletions

View File

@ -43,11 +43,18 @@ static void ocf_cl_lock_line_mark_locked(struct ocf_request *req,
req->map[index].rd_locked = locked;
}
static ocf_cache_line_t ocf_cl_lock_line_get_entry(struct ocf_request *req,
unsigned index)
{
return req->map[index].coll_idx;
}
static struct ocf_alock_lock_cbs ocf_cline_conc_cbs = {
.line_needs_lock = ocf_cl_lock_line_needs_lock,
.line_is_acting = ocf_cl_lock_line_is_acting,
.line_is_locked = ocf_cl_lock_line_is_locked,
.line_mark_locked = ocf_cl_lock_line_mark_locked
.line_mark_locked = ocf_cl_lock_line_mark_locked,
.line_get_entry = ocf_cl_lock_line_get_entry
};
bool ocf_cache_line_try_lock_rd(struct ocf_alock *alock,

View File

@ -640,7 +640,7 @@ static inline void ocf_alock_waitlist_remove_entry(struct ocf_alock *alock,
struct ocf_alock_lock_cbs *cbs,
struct ocf_request *req, int i, int rw)
{
ocf_cache_line_t entry = req->map[i].coll_idx;
ocf_cache_line_t entry = cbs->line_get_entry(req, i);
uint32_t idx = _WAITERS_LIST_ITEM(entry);
struct ocf_alock_waiters_list *lst = &alock->waiters_lsts[idx];
struct list_head *iter, *next;
@ -690,7 +690,7 @@ static int ocf_alock_lock_rd_fast(struct ocf_alock *alock,
continue;
}
entry = req->map[i].coll_idx;
entry = cbs->line_get_entry(req, i);
ENV_BUG_ON(entry >= alock->num_entries);
ENV_BUG_ON(cbs->line_is_locked(req, i, OCF_READ));
ENV_BUG_ON(cbs->line_is_locked(req, i, OCF_WRITE));
@ -715,7 +715,7 @@ static int ocf_alock_lock_rd_fast(struct ocf_alock *alock,
continue;
}
entry = req->map[i].coll_idx;
entry = cbs->line_get_entry(req, i);
if (cbs->line_is_locked(req, i, OCF_READ)) {
ocf_alock_unlock_one_rd(alock, cbs, entry);
@ -752,7 +752,7 @@ static int ocf_alock_lock_rd_slow(struct ocf_alock *alock,
continue;
}
entry = req->map[i].coll_idx;
entry = cbs->line_get_entry(req, i);
ENV_BUG_ON(entry >= alock->num_entries);
ENV_BUG_ON(cbs->line_is_locked(req, i, OCF_READ));
ENV_BUG_ON(cbs->line_is_locked(req, i, OCF_WRITE));
@ -821,7 +821,7 @@ static int ocf_alock_lock_wr_fast(struct ocf_alock *alock,
continue;
}
entry = req->map[i].coll_idx;
entry = cbs->line_get_entry(req, i);
ENV_BUG_ON(entry >= alock->num_entries);
ENV_BUG_ON(cbs->line_is_locked(req, i, OCF_READ));
ENV_BUG_ON(cbs->line_is_locked(req, i, OCF_WRITE));
@ -844,7 +844,7 @@ static int ocf_alock_lock_wr_fast(struct ocf_alock *alock,
if (!cbs->line_needs_lock(req, i))
continue;
entry = req->map[i].coll_idx;
entry = cbs->line_get_entry(req, i);
if (cbs->line_is_locked(req, i, OCF_WRITE)) {
ocf_alock_unlock_one_wr(alock, cbs, entry);
@ -883,7 +883,7 @@ static int ocf_alock_lock_wr_slow(struct ocf_alock *alock,
continue;
}
entry = req->map[i].coll_idx;
entry = cbs->line_get_entry(req, i);
ENV_BUG_ON(entry >= alock->num_entries);
ENV_BUG_ON(cbs->line_is_locked(req, i, OCF_READ));
ENV_BUG_ON(cbs->line_is_locked(req, i, OCF_WRITE));
@ -950,7 +950,7 @@ void ocf_alock_unlock_rd(struct ocf_alock *alock,
if (!cbs->line_is_locked(req, i, OCF_READ))
continue;
entry = req->map[i].coll_idx;
entry = cbs->line_get_entry(req, i);
ENV_BUG_ON(entry >= alock->num_entries);
@ -977,7 +977,7 @@ void ocf_alock_unlock_wr(struct ocf_alock *alock,
if (!cbs->line_is_locked(req, i, OCF_WRITE))
continue;
entry = req->map[i].coll_idx;
entry = cbs->line_get_entry(req, i);
ENV_BUG_ON(entry >= alock->num_entries);
@ -999,7 +999,7 @@ void ocf_alock_unlock(struct ocf_alock *alock,
if (!cbs->line_is_acting(req, i))
continue;
entry = req->map[i].coll_idx;
entry = cbs->line_get_entry(req, i);
ENV_BUG_ON(entry >= alock->num_entries);
if (cbs->line_is_locked(req, i, OCF_READ) &&
@ -1019,16 +1019,18 @@ void ocf_alock_unlock_one(struct ocf_alock *alock,
struct ocf_alock_lock_cbs *cbs,
struct ocf_request *req, uint32_t idx)
{
ocf_cache_line_t entry = cbs->line_get_entry(req, idx);
ENV_BUG_ON(!cbs->line_is_acting(req, idx));
if (cbs->line_is_locked(req, idx, OCF_READ) &&
cbs->line_is_locked(req, idx, OCF_WRITE)) {
ENV_BUG();
} else if (cbs->line_is_locked(req, idx, OCF_READ)) {
ocf_alock_unlock_one_rd(alock, cbs, req->map[idx].coll_idx);
ocf_alock_unlock_one_rd(alock, cbs, entry);
cbs->line_mark_locked(req, idx, OCF_READ, false);
} else if (cbs->line_is_locked(req, idx, OCF_WRITE)) {
ocf_alock_unlock_one_wr(alock, cbs, req->map[idx].coll_idx);
ocf_alock_unlock_one_wr(alock, cbs, entry);
cbs->line_mark_locked(req, idx, OCF_WRITE, false);
} else {
ENV_BUG();

View File

@ -32,6 +32,8 @@ typedef bool (*ocf_cl_lock_line_is_locked_cb)(struct ocf_request *req,
typedef void (*ocf_cl_lock_line_mark_locked_cb)(struct ocf_request *req,
unsigned index, int rw, bool locked);
typedef ocf_cache_line_t (*ocf_cl_lock_line_get_entry_cb)(
struct ocf_request *req, unsigned index);
struct ocf_alock_lock_cbs
{
@ -39,6 +41,7 @@ struct ocf_alock_lock_cbs
ocf_cl_lock_line_is_acting_cb line_is_acting;
ocf_cl_lock_line_is_locked_cb line_is_locked;
ocf_cl_lock_line_mark_locked_cb line_mark_locked;
ocf_cl_lock_line_get_entry_cb line_get_entry;
};
bool ocf_alock_trylock_one_rd(struct ocf_alock *alock,