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;
|
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 = {
|
static struct ocf_alock_lock_cbs ocf_cline_conc_cbs = {
|
||||||
.line_needs_lock = ocf_cl_lock_line_needs_lock,
|
.line_needs_lock = ocf_cl_lock_line_needs_lock,
|
||||||
.line_is_acting = ocf_cl_lock_line_is_acting,
|
.line_is_acting = ocf_cl_lock_line_is_acting,
|
||||||
.line_is_locked = ocf_cl_lock_line_is_locked,
|
.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,
|
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_alock_lock_cbs *cbs,
|
||||||
struct ocf_request *req, int i, int rw)
|
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);
|
uint32_t idx = _WAITERS_LIST_ITEM(entry);
|
||||||
struct ocf_alock_waiters_list *lst = &alock->waiters_lsts[idx];
|
struct ocf_alock_waiters_list *lst = &alock->waiters_lsts[idx];
|
||||||
struct list_head *iter, *next;
|
struct list_head *iter, *next;
|
||||||
@ -690,7 +690,7 @@ static int ocf_alock_lock_rd_fast(struct ocf_alock *alock,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
entry = req->map[i].coll_idx;
|
entry = cbs->line_get_entry(req, i);
|
||||||
ENV_BUG_ON(entry >= alock->num_entries);
|
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_READ));
|
||||||
ENV_BUG_ON(cbs->line_is_locked(req, i, OCF_WRITE));
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
entry = req->map[i].coll_idx;
|
entry = cbs->line_get_entry(req, i);
|
||||||
|
|
||||||
if (cbs->line_is_locked(req, i, OCF_READ)) {
|
if (cbs->line_is_locked(req, i, OCF_READ)) {
|
||||||
ocf_alock_unlock_one_rd(alock, cbs, entry);
|
ocf_alock_unlock_one_rd(alock, cbs, entry);
|
||||||
@ -752,7 +752,7 @@ static int ocf_alock_lock_rd_slow(struct ocf_alock *alock,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
entry = req->map[i].coll_idx;
|
entry = cbs->line_get_entry(req, i);
|
||||||
ENV_BUG_ON(entry >= alock->num_entries);
|
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_READ));
|
||||||
ENV_BUG_ON(cbs->line_is_locked(req, i, OCF_WRITE));
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
entry = req->map[i].coll_idx;
|
entry = cbs->line_get_entry(req, i);
|
||||||
ENV_BUG_ON(entry >= alock->num_entries);
|
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_READ));
|
||||||
ENV_BUG_ON(cbs->line_is_locked(req, i, OCF_WRITE));
|
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))
|
if (!cbs->line_needs_lock(req, i))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
entry = req->map[i].coll_idx;
|
entry = cbs->line_get_entry(req, i);
|
||||||
|
|
||||||
if (cbs->line_is_locked(req, i, OCF_WRITE)) {
|
if (cbs->line_is_locked(req, i, OCF_WRITE)) {
|
||||||
ocf_alock_unlock_one_wr(alock, cbs, entry);
|
ocf_alock_unlock_one_wr(alock, cbs, entry);
|
||||||
@ -883,7 +883,7 @@ static int ocf_alock_lock_wr_slow(struct ocf_alock *alock,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
entry = req->map[i].coll_idx;
|
entry = cbs->line_get_entry(req, i);
|
||||||
ENV_BUG_ON(entry >= alock->num_entries);
|
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_READ));
|
||||||
ENV_BUG_ON(cbs->line_is_locked(req, i, OCF_WRITE));
|
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))
|
if (!cbs->line_is_locked(req, i, OCF_READ))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
entry = req->map[i].coll_idx;
|
entry = cbs->line_get_entry(req, i);
|
||||||
|
|
||||||
ENV_BUG_ON(entry >= alock->num_entries);
|
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))
|
if (!cbs->line_is_locked(req, i, OCF_WRITE))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
entry = req->map[i].coll_idx;
|
entry = cbs->line_get_entry(req, i);
|
||||||
|
|
||||||
ENV_BUG_ON(entry >= alock->num_entries);
|
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))
|
if (!cbs->line_is_acting(req, i))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
entry = req->map[i].coll_idx;
|
entry = cbs->line_get_entry(req, i);
|
||||||
ENV_BUG_ON(entry >= alock->num_entries);
|
ENV_BUG_ON(entry >= alock->num_entries);
|
||||||
|
|
||||||
if (cbs->line_is_locked(req, i, OCF_READ) &&
|
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_alock_lock_cbs *cbs,
|
||||||
struct ocf_request *req, uint32_t idx)
|
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));
|
ENV_BUG_ON(!cbs->line_is_acting(req, idx));
|
||||||
|
|
||||||
if (cbs->line_is_locked(req, idx, OCF_READ) &&
|
if (cbs->line_is_locked(req, idx, OCF_READ) &&
|
||||||
cbs->line_is_locked(req, idx, OCF_WRITE)) {
|
cbs->line_is_locked(req, idx, OCF_WRITE)) {
|
||||||
ENV_BUG();
|
ENV_BUG();
|
||||||
} else if (cbs->line_is_locked(req, idx, OCF_READ)) {
|
} 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);
|
cbs->line_mark_locked(req, idx, OCF_READ, false);
|
||||||
} else if (cbs->line_is_locked(req, idx, OCF_WRITE)) {
|
} 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);
|
cbs->line_mark_locked(req, idx, OCF_WRITE, false);
|
||||||
} else {
|
} else {
|
||||||
ENV_BUG();
|
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,
|
typedef void (*ocf_cl_lock_line_mark_locked_cb)(struct ocf_request *req,
|
||||||
unsigned index, int rw, bool locked);
|
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
|
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_acting_cb line_is_acting;
|
||||||
ocf_cl_lock_line_is_locked_cb line_is_locked;
|
ocf_cl_lock_line_is_locked_cb line_is_locked;
|
||||||
ocf_cl_lock_line_mark_locked_cb line_mark_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,
|
bool ocf_alock_trylock_one_rd(struct ocf_alock *alock,
|
||||||
|
Loading…
Reference in New Issue
Block a user