Add entry abstraction
Signed-off-by: Adam Rutkowski <adam.j.rutkowski@intel.com>
This commit is contained in:
parent
9746df0b1a
commit
fae620a070
@ -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,
|
||||
|
@ -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();
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user