From fae620a07090eda68310f1555ac42411305694d2 Mon Sep 17 00:00:00 2001 From: Adam Rutkowski Date: Sat, 3 Apr 2021 19:25:13 -0500 Subject: [PATCH] Add entry abstraction Signed-off-by: Adam Rutkowski --- src/concurrency/ocf_cache_line_concurrency.c | 9 ++++++- src/utils/utils_alock.c | 26 +++++++++++--------- src/utils/utils_alock.h | 3 +++ 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/concurrency/ocf_cache_line_concurrency.c b/src/concurrency/ocf_cache_line_concurrency.c index 9dea2dd..572946d 100644 --- a/src/concurrency/ocf_cache_line_concurrency.c +++ b/src/concurrency/ocf_cache_line_concurrency.c @@ -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, diff --git a/src/utils/utils_alock.c b/src/utils/utils_alock.c index eff5666..30b11e2 100644 --- a/src/utils/utils_alock.c +++ b/src/utils/utils_alock.c @@ -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(); diff --git a/src/utils/utils_alock.h b/src/utils/utils_alock.h index 20d6a24..0559ba9 100644 --- a/src/utils/utils_alock.h +++ b/src/utils/utils_alock.h @@ -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,