rename line to entry

Signed-off-by: Adam Rutkowski <adam.j.rutkowski@intel.com>
This commit is contained in:
Adam Rutkowski 2021-04-03 19:08:26 -05:00 committed by Kozlowski Mateusz
parent 9a1646c8a1
commit 9746df0b1a
2 changed files with 151 additions and 151 deletions

View File

@ -35,10 +35,10 @@
#define _WAITERS_LIST_ENTRIES \ #define _WAITERS_LIST_ENTRIES \
(_WAITERS_LIST_SIZE / sizeof(struct ocf_alock_waiters_list)) (_WAITERS_LIST_SIZE / sizeof(struct ocf_alock_waiters_list))
#define _WAITERS_LIST_ITEM(cache_line) ((cache_line) % _WAITERS_LIST_ENTRIES) #define _WAITERS_LIST_ITEM(entry) ((entry) % _WAITERS_LIST_ENTRIES)
struct ocf_alock_waiter { struct ocf_alock_waiter {
ocf_cache_line_t line; ocf_cache_line_t entry;
uint32_t idx; uint32_t idx;
struct ocf_request *req; struct ocf_request *req;
ocf_req_async_lock_cb cmpl; ocf_req_async_lock_cb cmpl;
@ -175,22 +175,22 @@ size_t ocf_alock_size(unsigned num_entries)
} }
static inline bool ocf_alock_waitlist_is_empty_locked(struct ocf_alock *alock, static inline bool ocf_alock_waitlist_is_empty_locked(struct ocf_alock *alock,
ocf_cache_line_t line) ocf_cache_line_t entry)
{ {
bool are = false; bool are = false;
struct list_head *iter; struct list_head *iter;
uint32_t idx = _WAITERS_LIST_ITEM(line); 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 ocf_alock_waiter *waiter; struct ocf_alock_waiter *waiter;
/* If list empty that means there are no waiters on cache line */ /* If list empty that means there are no waiters on cache entry */
if (list_empty(&lst->head)) if (list_empty(&lst->head))
return true; return true;
list_for_each(iter, &lst->head) { list_for_each(iter, &lst->head) {
waiter = list_entry(iter, struct ocf_alock_waiter, item); waiter = list_entry(iter, struct ocf_alock_waiter, item);
if (waiter->line == line) { if (waiter->entry == entry) {
are = true; are = true;
break; break;
} }
@ -200,34 +200,34 @@ static inline bool ocf_alock_waitlist_is_empty_locked(struct ocf_alock *alock,
} }
static inline void ocf_alock_waitlist_add(struct ocf_alock *alock, static inline void ocf_alock_waitlist_add(struct ocf_alock *alock,
ocf_cache_line_t line, struct ocf_alock_waiter *waiter) ocf_cache_line_t entry, struct ocf_alock_waiter *waiter)
{ {
uint32_t idx = _WAITERS_LIST_ITEM(line); 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];
list_add_tail(&waiter->item, &lst->head); list_add_tail(&waiter->item, &lst->head);
} }
#define ocf_alock_waitlist_lock(cncrrncy, line, flags) \ #define ocf_alock_waitlist_lock(cncrrncy, entry, flags) \
do { \ do { \
uint32_t list = _WAITERS_LIST_ITEM(line); \ uint32_t idx = _WAITERS_LIST_ITEM(entry); \
struct ocf_alock_waiters_list *lst = &cncrrncy->waiters_lsts[list]; \ struct ocf_alock_waiters_list *lst = &cncrrncy->waiters_lsts[idx]; \
env_spinlock_lock_irqsave(&lst->lock, flags); \ env_spinlock_lock_irqsave(&lst->lock, flags); \
} while (0) } while (0)
#define ocf_alock_waitlist_unlock(cncrrncy, line, flags) \ #define ocf_alock_waitlist_unlock(cncrrncy, entry, flags) \
do { \ do { \
uint32_t list = _WAITERS_LIST_ITEM(line); \ uint32_t idx = _WAITERS_LIST_ITEM(entry); \
struct ocf_alock_waiters_list *lst = &cncrrncy->waiters_lsts[list]; \ struct ocf_alock_waiters_list *lst = &cncrrncy->waiters_lsts[idx]; \
env_spinlock_unlock_irqrestore(&lst->lock, flags); \ env_spinlock_unlock_irqrestore(&lst->lock, flags); \
} while (0) } while (0)
bool ocf_alock_trylock_entry_wr(struct ocf_alock *alock, bool ocf_alock_trylock_entry_wr(struct ocf_alock *alock,
ocf_cache_line_t line) ocf_cache_line_t entry)
{ {
env_atomic *access = &alock->access[line]; env_atomic *access = &alock->access[entry];
int prev = env_atomic_cmpxchg(access, OCF_CACHE_LINE_ACCESS_IDLE, int prev = env_atomic_cmpxchg(access, OCF_CACHE_LINE_ACCESS_IDLE,
OCF_CACHE_LINE_ACCESS_WR); OCF_CACHE_LINE_ACCESS_WR);
@ -238,9 +238,9 @@ bool ocf_alock_trylock_entry_wr(struct ocf_alock *alock,
} }
static inline bool ocf_alock_trylock_entry_rd_idle(struct ocf_alock *alock, static inline bool ocf_alock_trylock_entry_rd_idle(struct ocf_alock *alock,
ocf_cache_line_t line) ocf_cache_line_t entry)
{ {
env_atomic *access = &alock->access[line]; env_atomic *access = &alock->access[entry];
int prev = env_atomic_cmpxchg(access, OCF_CACHE_LINE_ACCESS_IDLE, int prev = env_atomic_cmpxchg(access, OCF_CACHE_LINE_ACCESS_IDLE,
OCF_CACHE_LINE_ACCESS_ONE_RD); OCF_CACHE_LINE_ACCESS_ONE_RD);
@ -248,26 +248,26 @@ static inline bool ocf_alock_trylock_entry_rd_idle(struct ocf_alock *alock,
} }
static inline bool ocf_alock_trylock_entry_rd(struct ocf_alock *alock, static inline bool ocf_alock_trylock_entry_rd(struct ocf_alock *alock,
ocf_cache_line_t line) ocf_cache_line_t entry)
{ {
env_atomic *access = &alock->access[line]; env_atomic *access = &alock->access[entry];
return !!env_atomic_add_unless(access, 1, OCF_CACHE_LINE_ACCESS_WR); return !!env_atomic_add_unless(access, 1, OCF_CACHE_LINE_ACCESS_WR);
} }
static inline void ocf_alock_unlock_entry_wr(struct ocf_alock *alock, static inline void ocf_alock_unlock_entry_wr(struct ocf_alock *alock,
ocf_cache_line_t line) ocf_cache_line_t entry)
{ {
env_atomic *access = &alock->access[line]; env_atomic *access = &alock->access[entry];
ENV_BUG_ON(env_atomic_read(access) != OCF_CACHE_LINE_ACCESS_WR); ENV_BUG_ON(env_atomic_read(access) != OCF_CACHE_LINE_ACCESS_WR);
env_atomic_set(access, OCF_CACHE_LINE_ACCESS_IDLE); env_atomic_set(access, OCF_CACHE_LINE_ACCESS_IDLE);
} }
static inline void ocf_alock_unlock_entry_rd(struct ocf_alock *alock, static inline void ocf_alock_unlock_entry_rd(struct ocf_alock *alock,
ocf_cache_line_t line) ocf_cache_line_t entry)
{ {
env_atomic *access = &alock->access[line]; env_atomic *access = &alock->access[entry];
ENV_BUG_ON(env_atomic_read(access) == 0); ENV_BUG_ON(env_atomic_read(access) == 0);
ENV_BUG_ON(env_atomic_read(access) == OCF_CACHE_LINE_ACCESS_WR); ENV_BUG_ON(env_atomic_read(access) == OCF_CACHE_LINE_ACCESS_WR);
@ -275,18 +275,18 @@ static inline void ocf_alock_unlock_entry_rd(struct ocf_alock *alock,
} }
static inline bool ocf_alock_trylock_entry_wr2wr(struct ocf_alock *alock, static inline bool ocf_alock_trylock_entry_wr2wr(struct ocf_alock *alock,
ocf_cache_line_t line) ocf_cache_line_t entry)
{ {
env_atomic *access = &alock->access[line]; env_atomic *access = &alock->access[entry];
ENV_BUG_ON(env_atomic_read(access) != OCF_CACHE_LINE_ACCESS_WR); ENV_BUG_ON(env_atomic_read(access) != OCF_CACHE_LINE_ACCESS_WR);
return true; return true;
} }
static inline bool ocf_alock_trylock_entry_wr2rd(struct ocf_alock *alock, static inline bool ocf_alock_trylock_entry_wr2rd(struct ocf_alock *alock,
ocf_cache_line_t line) ocf_cache_line_t entry)
{ {
env_atomic *access = &alock->access[line]; env_atomic *access = &alock->access[entry];
ENV_BUG_ON(env_atomic_read(access) != OCF_CACHE_LINE_ACCESS_WR); ENV_BUG_ON(env_atomic_read(access) != OCF_CACHE_LINE_ACCESS_WR);
env_atomic_set(access, OCF_CACHE_LINE_ACCESS_ONE_RD); env_atomic_set(access, OCF_CACHE_LINE_ACCESS_ONE_RD);
@ -294,9 +294,9 @@ static inline bool ocf_alock_trylock_entry_wr2rd(struct ocf_alock *alock,
} }
static inline bool ocf_alock_trylock_entry_rd2wr(struct ocf_alock *alock, static inline bool ocf_alock_trylock_entry_rd2wr(struct ocf_alock *alock,
ocf_cache_line_t line) ocf_cache_line_t entry)
{ {
env_atomic *access = &alock->access[line]; env_atomic *access = &alock->access[entry];
int v = env_atomic_read(access); int v = env_atomic_read(access);
@ -310,9 +310,9 @@ static inline bool ocf_alock_trylock_entry_rd2wr(struct ocf_alock *alock,
} }
static inline bool ocf_alock_trylock_entry_rd2rd(struct ocf_alock *alock, static inline bool ocf_alock_trylock_entry_rd2rd(struct ocf_alock *alock,
ocf_cache_line_t line) ocf_cache_line_t entry)
{ {
env_atomic *access = &alock->access[line]; env_atomic *access = &alock->access[entry];
int v = env_atomic_read(access); int v = env_atomic_read(access);
@ -326,7 +326,7 @@ static void ocf_alock_entry_locked(struct ocf_alock *alock,
struct ocf_request *req, ocf_req_async_lock_cb cmpl) struct ocf_request *req, ocf_req_async_lock_cb cmpl)
{ {
if (env_atomic_dec_return(&req->lock_remaining) == 0) { if (env_atomic_dec_return(&req->lock_remaining) == 0) {
/* All cache line locked, resume request */ /* All cache entry locked, resume request */
OCF_DEBUG_RQ(req, "Resume"); OCF_DEBUG_RQ(req, "Resume");
ENV_BUG_ON(!cmpl); ENV_BUG_ON(!cmpl);
env_atomic_dec(&alock->waiting); env_atomic_dec(&alock->waiting);
@ -336,7 +336,7 @@ static void ocf_alock_entry_locked(struct ocf_alock *alock,
static inline bool ocf_alock_lock_one_wr(struct ocf_alock *alock, static inline bool ocf_alock_lock_one_wr(struct ocf_alock *alock,
struct ocf_alock_lock_cbs *cbs, struct ocf_alock_lock_cbs *cbs,
const ocf_cache_line_t line, ocf_req_async_lock_cb cmpl, const ocf_cache_line_t entry, ocf_req_async_lock_cb cmpl,
void *req, uint32_t idx) void *req, uint32_t idx)
{ {
struct ocf_alock_waiter *waiter; struct ocf_alock_waiter *waiter;
@ -345,7 +345,7 @@ static inline bool ocf_alock_lock_one_wr(struct ocf_alock *alock,
ENV_BUG_ON(!cmpl); ENV_BUG_ON(!cmpl);
if (ocf_alock_trylock_entry_wr(alock, line)) { if (ocf_alock_trylock_entry_wr(alock, entry)) {
/* lock was not owned by anyone */ /* lock was not owned by anyone */
cbs->line_mark_locked(req, idx, OCF_WRITE, true); cbs->line_mark_locked(req, idx, OCF_WRITE, true);
ocf_alock_entry_locked(alock, req, cmpl); ocf_alock_entry_locked(alock, req, cmpl);
@ -356,16 +356,16 @@ static inline bool ocf_alock_lock_one_wr(struct ocf_alock *alock,
if (!waiter) if (!waiter)
return false; return false;
ocf_alock_waitlist_lock(alock, line, flags); ocf_alock_waitlist_lock(alock, entry, flags);
/* At the moment list is protected, double check if the cache line is /* At the moment list is protected, double check if the cache entry is
* unlocked * unlocked
*/ */
if (ocf_alock_trylock_entry_wr(alock, line)) if (ocf_alock_trylock_entry_wr(alock, entry))
goto unlock; goto unlock;
/* Setup waiters filed */ /* Setup waiters filed */
waiter->line = line; waiter->entry = entry;
waiter->req = req; waiter->req = req;
waiter->idx = idx; waiter->idx = idx;
waiter->cmpl = cmpl; waiter->cmpl = cmpl;
@ -373,11 +373,11 @@ static inline bool ocf_alock_lock_one_wr(struct ocf_alock *alock,
INIT_LIST_HEAD(&waiter->item); INIT_LIST_HEAD(&waiter->item);
/* Add to waiters list */ /* Add to waiters list */
ocf_alock_waitlist_add(alock, line, waiter); ocf_alock_waitlist_add(alock, entry, waiter);
waiting = true; waiting = true;
unlock: unlock:
ocf_alock_waitlist_unlock(alock, line, flags); ocf_alock_waitlist_unlock(alock, entry, flags);
if (!waiting) { if (!waiting) {
cbs->line_mark_locked(req, idx, OCF_WRITE, true); cbs->line_mark_locked(req, idx, OCF_WRITE, true);
@ -389,12 +389,12 @@ unlock:
} }
/* /*
* Attempt to lock cache line for read. * Attempt to lock cache entry for read.
* In case cache line is locked, attempt to add caller on wait list. * In case cache entry is locked, attempt to add caller on wait list.
*/ */
static inline bool ocf_alock_lock_one_rd(struct ocf_alock *alock, static inline bool ocf_alock_lock_one_rd(struct ocf_alock *alock,
struct ocf_alock_lock_cbs *cbs, struct ocf_alock_lock_cbs *cbs,
const ocf_cache_line_t line, ocf_req_async_lock_cb cmpl, const ocf_cache_line_t entry, ocf_req_async_lock_cb cmpl,
void *req, uint32_t idx) void *req, uint32_t idx)
{ {
struct ocf_alock_waiter *waiter; struct ocf_alock_waiter *waiter;
@ -403,7 +403,7 @@ static inline bool ocf_alock_lock_one_rd(struct ocf_alock *alock,
ENV_BUG_ON(!cmpl); ENV_BUG_ON(!cmpl);
if( ocf_alock_trylock_entry_rd_idle(alock, line)) { if( ocf_alock_trylock_entry_rd_idle(alock, entry)) {
/* lock was not owned by anyone */ /* lock was not owned by anyone */
cbs->line_mark_locked(req, idx, OCF_READ, true); cbs->line_mark_locked(req, idx, OCF_READ, true);
ocf_alock_entry_locked(alock, req, cmpl); ocf_alock_entry_locked(alock, req, cmpl);
@ -415,20 +415,20 @@ static inline bool ocf_alock_lock_one_rd(struct ocf_alock *alock,
return false; return false;
/* Lock waiters list */ /* Lock waiters list */
ocf_alock_waitlist_lock(alock, line, flags); ocf_alock_waitlist_lock(alock, entry, flags);
if (!ocf_alock_waitlist_is_empty_locked(alock, line)) { if (!ocf_alock_waitlist_is_empty_locked(alock, entry)) {
/* No waiters at the moment */ /* No waiters at the moment */
/* Check if read lock can be obtained */ /* Check if read lock can be obtained */
if (ocf_alock_trylock_entry_rd(alock, line)) { if (ocf_alock_trylock_entry_rd(alock, entry)) {
/* Cache line locked */ /* Cache entry locked */
goto unlock; goto unlock;
} }
} }
/* Setup waiters field */ /* Setup waiters field */
waiter->line = line; waiter->entry = entry;
waiter->req = req; waiter->req = req;
waiter->idx = idx; waiter->idx = idx;
waiter->cmpl = cmpl; waiter->cmpl = cmpl;
@ -436,11 +436,11 @@ static inline bool ocf_alock_lock_one_rd(struct ocf_alock *alock,
INIT_LIST_HEAD(&waiter->item); INIT_LIST_HEAD(&waiter->item);
/* Add to waiters list */ /* Add to waiters list */
ocf_alock_waitlist_add(alock, line, waiter); ocf_alock_waitlist_add(alock, entry, waiter);
waiting = true; waiting = true;
unlock: unlock:
ocf_alock_waitlist_unlock(alock, line, flags); ocf_alock_waitlist_unlock(alock, entry, flags);
if (!waiting) { if (!waiting) {
cbs->line_mark_locked(req, idx, OCF_READ, true); cbs->line_mark_locked(req, idx, OCF_READ, true);
@ -458,13 +458,13 @@ unlock:
*/ */
static inline void ocf_alock_unlock_one_rd_common(struct ocf_alock *alock, static inline void ocf_alock_unlock_one_rd_common(struct ocf_alock *alock,
struct ocf_alock_lock_cbs *cbs, struct ocf_alock_lock_cbs *cbs,
const ocf_cache_line_t line) const ocf_cache_line_t entry)
{ {
bool locked = false; bool locked = false;
bool exchanged = true; bool exchanged = true;
uint32_t i = 0; uint32_t i = 0;
uint32_t idx = _WAITERS_LIST_ITEM(line); 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 ocf_alock_waiter *waiter; struct ocf_alock_waiter *waiter;
@ -481,21 +481,21 @@ static inline void ocf_alock_unlock_one_rd_common(struct ocf_alock *alock,
list_for_each_safe(iter, next, &lst->head) { list_for_each_safe(iter, next, &lst->head) {
waiter = list_entry(iter, struct ocf_alock_waiter, item); waiter = list_entry(iter, struct ocf_alock_waiter, item);
if (line != waiter->line) if (entry != waiter->entry)
continue; continue;
if (exchanged) { if (exchanged) {
if (waiter->rw == OCF_WRITE) if (waiter->rw == OCF_WRITE)
locked = ocf_alock_trylock_entry_rd2wr(alock, line); locked = ocf_alock_trylock_entry_rd2wr(alock, entry);
else if (waiter->rw == OCF_READ) else if (waiter->rw == OCF_READ)
locked = ocf_alock_trylock_entry_rd2rd(alock, line); locked = ocf_alock_trylock_entry_rd2rd(alock, entry);
else else
ENV_BUG(); ENV_BUG();
} else { } else {
if (waiter->rw == OCF_WRITE) if (waiter->rw == OCF_WRITE)
locked = ocf_alock_trylock_entry_wr(alock, line); locked = ocf_alock_trylock_entry_wr(alock, entry);
else if (waiter->rw == OCF_READ) else if (waiter->rw == OCF_READ)
locked = ocf_alock_trylock_entry_rd(alock, line); locked = ocf_alock_trylock_entry_rd(alock, entry);
else else
ENV_BUG(); ENV_BUG();
} }
@ -520,28 +520,28 @@ static inline void ocf_alock_unlock_one_rd_common(struct ocf_alock *alock,
/* No exchange, no waiters on the list, unlock and return /* No exchange, no waiters on the list, unlock and return
* WR -> IDLE * WR -> IDLE
*/ */
ocf_alock_unlock_entry_rd(alock, line); ocf_alock_unlock_entry_rd(alock, entry);
} }
} }
bool ocf_alock_trylock_one_rd(struct ocf_alock *alock, bool ocf_alock_trylock_one_rd(struct ocf_alock *alock,
ocf_cache_line_t line) ocf_cache_line_t entry)
{ {
return ocf_alock_trylock_entry_rd_idle(alock, line); return ocf_alock_trylock_entry_rd_idle(alock, entry);
} }
void ocf_alock_unlock_one_rd(struct ocf_alock *alock, void ocf_alock_unlock_one_rd(struct ocf_alock *alock,
struct ocf_alock_lock_cbs *cbs, struct ocf_alock_lock_cbs *cbs,
const ocf_cache_line_t line) const ocf_cache_line_t entry)
{ {
unsigned long flags = 0; unsigned long flags = 0;
OCF_DEBUG_RQ(alock->cache, "Cache line = %u", line); OCF_DEBUG_RQ(alock->cache, "Cache entry = %u", entry);
/* Lock waiters list */ /* Lock waiters list */
ocf_alock_waitlist_lock(alock, line, flags); ocf_alock_waitlist_lock(alock, entry, flags);
ocf_alock_unlock_one_rd_common(alock, cbs, line); ocf_alock_unlock_one_rd_common(alock, cbs, entry);
ocf_alock_waitlist_unlock(alock, line, flags); ocf_alock_waitlist_unlock(alock, entry, flags);
} }
/* /*
@ -551,13 +551,13 @@ void ocf_alock_unlock_one_rd(struct ocf_alock *alock,
*/ */
static inline void ocf_alock_unlock_one_wr_common(struct ocf_alock *alock, static inline void ocf_alock_unlock_one_wr_common(struct ocf_alock *alock,
struct ocf_alock_lock_cbs *cbs, struct ocf_alock_lock_cbs *cbs,
const ocf_cache_line_t line) const ocf_cache_line_t entry)
{ {
uint32_t i = 0; uint32_t i = 0;
bool locked = false; bool locked = false;
bool exchanged = true; bool exchanged = true;
uint32_t idx = _WAITERS_LIST_ITEM(line); 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 ocf_alock_waiter *waiter; struct ocf_alock_waiter *waiter;
@ -574,21 +574,21 @@ static inline void ocf_alock_unlock_one_wr_common(struct ocf_alock *alock,
list_for_each_safe(iter, next, &lst->head) { list_for_each_safe(iter, next, &lst->head) {
waiter = list_entry(iter, struct ocf_alock_waiter, item); waiter = list_entry(iter, struct ocf_alock_waiter, item);
if (line != waiter->line) if (entry != waiter->entry)
continue; continue;
if (exchanged) { if (exchanged) {
if (waiter->rw == OCF_WRITE) if (waiter->rw == OCF_WRITE)
locked = ocf_alock_trylock_entry_wr2wr(alock, line); locked = ocf_alock_trylock_entry_wr2wr(alock, entry);
else if (waiter->rw == OCF_READ) else if (waiter->rw == OCF_READ)
locked = ocf_alock_trylock_entry_wr2rd(alock, line); locked = ocf_alock_trylock_entry_wr2rd(alock, entry);
else else
ENV_BUG(); ENV_BUG();
} else { } else {
if (waiter->rw == OCF_WRITE) if (waiter->rw == OCF_WRITE)
locked = ocf_alock_trylock_entry_wr(alock, line); locked = ocf_alock_trylock_entry_wr(alock, entry);
else if (waiter->rw == OCF_READ) else if (waiter->rw == OCF_READ)
locked = ocf_alock_trylock_entry_rd(alock, line); locked = ocf_alock_trylock_entry_rd(alock, entry);
else else
ENV_BUG(); ENV_BUG();
} }
@ -613,26 +613,26 @@ static inline void ocf_alock_unlock_one_wr_common(struct ocf_alock *alock,
/* No exchange, no waiters on the list, unlock and return /* No exchange, no waiters on the list, unlock and return
* WR -> IDLE * WR -> IDLE
*/ */
ocf_alock_unlock_entry_wr(alock, line); ocf_alock_unlock_entry_wr(alock, entry);
} }
} }
void ocf_alock_unlock_one_wr(struct ocf_alock *alock, void ocf_alock_unlock_one_wr(struct ocf_alock *alock,
struct ocf_alock_lock_cbs *cbs, struct ocf_alock_lock_cbs *cbs,
const ocf_cache_line_t line) const ocf_cache_line_t entry)
{ {
unsigned long flags = 0; unsigned long flags = 0;
OCF_DEBUG_RQ(alock->cache, "Cache line = %u", line); OCF_DEBUG_RQ(alock->cache, "Cache entry = %u", entry);
/* Lock waiters list */ /* Lock waiters list */
ocf_alock_waitlist_lock(alock, line, flags); ocf_alock_waitlist_lock(alock, entry, flags);
ocf_alock_unlock_one_wr_common(alock, cbs, line); ocf_alock_unlock_one_wr_common(alock, cbs, entry);
ocf_alock_waitlist_unlock(alock, line, flags); ocf_alock_waitlist_unlock(alock, entry, flags);
} }
/* /*
* Safely remove cache line lock waiter from waiting list. * Safely remove cache entry lock waiter from waiting list.
* Request can be assigned with lock asynchronously at any point of time, * Request can be assigned with lock asynchronously at any point of time,
* so need to check lock state under a common lock. * so need to check lock state under a common lock.
*/ */
@ -640,20 +640,20 @@ 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 line = req->map[i].coll_idx; ocf_cache_line_t entry = req->map[i].coll_idx;
uint32_t idx = _WAITERS_LIST_ITEM(line); 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;
struct ocf_alock_waiter *waiter; struct ocf_alock_waiter *waiter;
unsigned long flags = 0; unsigned long flags = 0;
ocf_alock_waitlist_lock(alock, line, flags); ocf_alock_waitlist_lock(alock, entry, flags);
if (cbs->line_is_locked(req, i, rw)) { if (cbs->line_is_locked(req, i, rw)) {
if (rw == OCF_READ) if (rw == OCF_READ)
ocf_alock_unlock_one_rd_common(alock, cbs, line); ocf_alock_unlock_one_rd_common(alock, cbs, entry);
else else
ocf_alock_unlock_one_wr_common(alock, cbs, line); ocf_alock_unlock_one_wr_common(alock, cbs, entry);
cbs->line_mark_locked(req, i, rw, false); cbs->line_mark_locked(req, i, rw, false);
} else { } else {
list_for_each_safe(iter, next, &lst->head) { list_for_each_safe(iter, next, &lst->head) {
@ -665,7 +665,7 @@ static inline void ocf_alock_waitlist_remove_entry(struct ocf_alock *alock,
} }
} }
ocf_alock_waitlist_unlock(alock, line, flags); ocf_alock_waitlist_unlock(alock, entry, flags);
} }
/* Try to read-lock request without adding waiters. Function should be called /* Try to read-lock request without adding waiters. Function should be called
@ -677,7 +677,7 @@ static int ocf_alock_lock_rd_fast(struct ocf_alock *alock,
struct ocf_request *req) struct ocf_request *req)
{ {
int32_t i; int32_t i;
ocf_cache_line_t line; ocf_cache_line_t entry;
int ret = OCF_LOCK_ACQUIRED; int ret = OCF_LOCK_ACQUIRED;
OCF_DEBUG_RQ(req, "Lock"); OCF_DEBUG_RQ(req, "Lock");
@ -690,18 +690,18 @@ static int ocf_alock_lock_rd_fast(struct ocf_alock *alock,
continue; continue;
} }
line = req->map[i].coll_idx; entry = req->map[i].coll_idx;
ENV_BUG_ON(line >= 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));
if( ocf_alock_trylock_entry_rd_idle(alock, line)) { if( ocf_alock_trylock_entry_rd_idle(alock, entry)) {
/* cache line locked */ /* cache entry locked */
cbs->line_mark_locked(req, i, OCF_READ, true); cbs->line_mark_locked(req, i, OCF_READ, true);
} else { } else {
/* Not possible to lock all cachelines */ /* Not possible to lock all cachelines */
ret = OCF_LOCK_NOT_ACQUIRED; ret = OCF_LOCK_NOT_ACQUIRED;
OCF_DEBUG_RQ(req, "NO Lock, cache line = %u", line); OCF_DEBUG_RQ(req, "NO Lock, cache entry = %u", entry);
break; break;
} }
} }
@ -715,10 +715,10 @@ static int ocf_alock_lock_rd_fast(struct ocf_alock *alock,
continue; continue;
} }
line = req->map[i].coll_idx; entry = req->map[i].coll_idx;
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, line); ocf_alock_unlock_one_rd(alock, cbs, entry);
cbs->line_mark_locked(req, i, OCF_READ, false); cbs->line_mark_locked(req, i, OCF_READ, false);
} }
} }
@ -736,7 +736,7 @@ static int ocf_alock_lock_rd_slow(struct ocf_alock *alock,
struct ocf_request *req, ocf_req_async_lock_cb cmpl) struct ocf_request *req, ocf_req_async_lock_cb cmpl)
{ {
int32_t i; int32_t i;
ocf_cache_line_t line; ocf_cache_line_t entry;
int ret = OCF_LOCK_NOT_ACQUIRED; int ret = OCF_LOCK_NOT_ACQUIRED;
ENV_BUG_ON(env_atomic_read(&req->lock_remaining)); ENV_BUG_ON(env_atomic_read(&req->lock_remaining));
@ -752,12 +752,12 @@ static int ocf_alock_lock_rd_slow(struct ocf_alock *alock,
continue; continue;
} }
line = req->map[i].coll_idx; entry = req->map[i].coll_idx;
ENV_BUG_ON(line >= 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));
if (!ocf_alock_lock_one_rd(alock, cbs, line, cmpl, req, i)) { if (!ocf_alock_lock_one_rd(alock, cbs, entry, cmpl, req, i)) {
/* lock not acquired and not added to wait list */ /* lock not acquired and not added to wait list */
ret = -OCF_ERR_NO_MEM; ret = -OCF_ERR_NO_MEM;
goto err; goto err;
@ -810,7 +810,7 @@ static int ocf_alock_lock_wr_fast(struct ocf_alock *alock,
struct ocf_request *req) struct ocf_request *req)
{ {
int32_t i; int32_t i;
ocf_cache_line_t line; ocf_cache_line_t entry;
int ret = OCF_LOCK_ACQUIRED; int ret = OCF_LOCK_ACQUIRED;
ENV_BUG_ON(env_atomic_read(&req->lock_remaining)); ENV_BUG_ON(env_atomic_read(&req->lock_remaining));
@ -821,18 +821,18 @@ static int ocf_alock_lock_wr_fast(struct ocf_alock *alock,
continue; continue;
} }
line = req->map[i].coll_idx; entry = req->map[i].coll_idx;
ENV_BUG_ON(line >= 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));
if (ocf_alock_trylock_entry_wr(alock, line)) { if (ocf_alock_trylock_entry_wr(alock, entry)) {
/* cache line locked */ /* cache entry locked */
cbs->line_mark_locked(req, i, OCF_WRITE, true); cbs->line_mark_locked(req, i, OCF_WRITE, true);
} else { } else {
/* Not possible to lock all cachelines */ /* Not possible to lock all cachelines */
ret = OCF_LOCK_NOT_ACQUIRED; ret = OCF_LOCK_NOT_ACQUIRED;
OCF_DEBUG_RQ(req, "NO Lock, cache line = %u", line); OCF_DEBUG_RQ(req, "NO Lock, cache entry = %u", entry);
break; break;
} }
} }
@ -844,10 +844,10 @@ 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;
line = req->map[i].coll_idx; entry = req->map[i].coll_idx;
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, line); ocf_alock_unlock_one_wr(alock, cbs, entry);
cbs->line_mark_locked(req, i, OCF_WRITE, false); cbs->line_mark_locked(req, i, OCF_WRITE, false);
} }
} }
@ -865,7 +865,7 @@ static int ocf_alock_lock_wr_slow(struct ocf_alock *alock,
struct ocf_request *req, ocf_req_async_lock_cb cmpl) struct ocf_request *req, ocf_req_async_lock_cb cmpl)
{ {
int32_t i; int32_t i;
ocf_cache_line_t line; ocf_cache_line_t entry;
int ret = OCF_LOCK_NOT_ACQUIRED; int ret = OCF_LOCK_NOT_ACQUIRED;
ENV_BUG_ON(env_atomic_read(&req->lock_remaining)); ENV_BUG_ON(env_atomic_read(&req->lock_remaining));
@ -883,12 +883,12 @@ static int ocf_alock_lock_wr_slow(struct ocf_alock *alock,
continue; continue;
} }
line = req->map[i].coll_idx; entry = req->map[i].coll_idx;
ENV_BUG_ON(line >= 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));
if (!ocf_alock_lock_one_wr(alock, cbs, line, cmpl, req, i)) { if (!ocf_alock_lock_one_wr(alock, cbs, entry, cmpl, req, i)) {
/* lock not acquired and not added to wait list */ /* lock not acquired and not added to wait list */
ret = -OCF_ERR_NO_MEM; ret = -OCF_ERR_NO_MEM;
goto err; goto err;
@ -937,7 +937,7 @@ void ocf_alock_unlock_rd(struct ocf_alock *alock,
struct ocf_request *req) struct ocf_request *req)
{ {
int32_t i; int32_t i;
ocf_cache_line_t line; ocf_cache_line_t entry;
OCF_DEBUG_RQ(req, "Unlock"); OCF_DEBUG_RQ(req, "Unlock");
@ -950,11 +950,11 @@ 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;
line = req->map[i].coll_idx; entry = req->map[i].coll_idx;
ENV_BUG_ON(line >= alock->num_entries); ENV_BUG_ON(entry >= alock->num_entries);
ocf_alock_unlock_one_rd(alock, cbs, line); ocf_alock_unlock_one_rd(alock, cbs, entry);
cbs->line_mark_locked(req, i, OCF_READ, false); cbs->line_mark_locked(req, i, OCF_READ, false);
} }
} }
@ -964,7 +964,7 @@ void ocf_alock_unlock_wr(struct ocf_alock *alock,
struct ocf_request *req) struct ocf_request *req)
{ {
int32_t i; int32_t i;
ocf_cache_line_t line; ocf_cache_line_t entry;
OCF_DEBUG_RQ(req, "Unlock"); OCF_DEBUG_RQ(req, "Unlock");
@ -977,11 +977,11 @@ 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;
line = req->map[i].coll_idx; entry = req->map[i].coll_idx;
ENV_BUG_ON(line >= alock->num_entries); ENV_BUG_ON(entry >= alock->num_entries);
ocf_alock_unlock_one_wr(alock, cbs, line); ocf_alock_unlock_one_wr(alock, cbs, entry);
cbs->line_mark_locked(req, i, OCF_WRITE, false); cbs->line_mark_locked(req, i, OCF_WRITE, false);
} }
} }
@ -991,7 +991,7 @@ void ocf_alock_unlock(struct ocf_alock *alock,
struct ocf_request *req) struct ocf_request *req)
{ {
int32_t i; int32_t i;
ocf_cache_line_t line; ocf_cache_line_t entry;
OCF_DEBUG_RQ(req, "Unlock"); OCF_DEBUG_RQ(req, "Unlock");
@ -999,17 +999,17 @@ void ocf_alock_unlock(struct ocf_alock *alock,
if (!cbs->line_is_acting(req, i)) if (!cbs->line_is_acting(req, i))
continue; continue;
line = req->map[i].coll_idx; entry = req->map[i].coll_idx;
ENV_BUG_ON(line >= 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) &&
cbs->line_is_locked(req, i, OCF_WRITE)) { cbs->line_is_locked(req, i, OCF_WRITE)) {
ENV_BUG(); ENV_BUG();
} else if (cbs->line_is_locked(req, i, OCF_READ)) { } else if (cbs->line_is_locked(req, i, OCF_READ)) {
ocf_alock_unlock_one_rd(alock, cbs, line); ocf_alock_unlock_one_rd(alock, cbs, entry);
cbs->line_mark_locked(req, i, OCF_READ, false); cbs->line_mark_locked(req, i, OCF_READ, false);
} else if (cbs->line_is_locked(req, i, OCF_WRITE)) { } else if (cbs->line_is_locked(req, i, OCF_WRITE)) {
ocf_alock_unlock_one_wr(alock, cbs, line); ocf_alock_unlock_one_wr(alock, cbs, entry);
cbs->line_mark_locked(req, i, OCF_WRITE, false); cbs->line_mark_locked(req, i, OCF_WRITE, false);
} }
} }
@ -1017,49 +1017,49 @@ void ocf_alock_unlock(struct ocf_alock *alock,
void ocf_alock_unlock_one(struct ocf_alock *alock, 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 entry) struct ocf_request *req, uint32_t idx)
{ {
ENV_BUG_ON(!cbs->line_is_acting(req, entry)); ENV_BUG_ON(!cbs->line_is_acting(req, idx));
if (cbs->line_is_locked(req, entry, OCF_READ) && if (cbs->line_is_locked(req, idx, OCF_READ) &&
cbs->line_is_locked(req, entry, OCF_WRITE)) { cbs->line_is_locked(req, idx, OCF_WRITE)) {
ENV_BUG(); ENV_BUG();
} else if (cbs->line_is_locked(req, entry, OCF_READ)) { } else if (cbs->line_is_locked(req, idx, OCF_READ)) {
ocf_alock_unlock_one_rd(alock, cbs, req->map[entry].coll_idx); ocf_alock_unlock_one_rd(alock, cbs, req->map[idx].coll_idx);
cbs->line_mark_locked(req, entry, OCF_READ, false); cbs->line_mark_locked(req, idx, OCF_READ, false);
} else if (cbs->line_is_locked(req, entry, OCF_WRITE)) { } else if (cbs->line_is_locked(req, idx, OCF_WRITE)) {
ocf_alock_unlock_one_wr(alock, cbs, req->map[entry].coll_idx); ocf_alock_unlock_one_wr(alock, cbs, req->map[idx].coll_idx);
cbs->line_mark_locked(req, entry, OCF_WRITE, false); cbs->line_mark_locked(req, idx, OCF_WRITE, false);
} else { } else {
ENV_BUG(); ENV_BUG();
} }
} }
bool ocf_cache_line_is_used(struct ocf_alock *alock, bool ocf_cache_line_is_used(struct ocf_alock *alock,
ocf_cache_line_t line) ocf_cache_line_t entry)
{ {
ENV_BUG_ON(line >= alock->num_entries); ENV_BUG_ON(entry >= alock->num_entries);
if (env_atomic_read(&(alock->access[line]))) if (env_atomic_read(&(alock->access[entry])))
return true; return true;
return !ocf_alock_waitlist_is_empty(alock, line); return !ocf_alock_waitlist_is_empty(alock, entry);
} }
bool ocf_alock_waitlist_is_empty(struct ocf_alock *alock, bool ocf_alock_waitlist_is_empty(struct ocf_alock *alock,
ocf_cache_line_t line) ocf_cache_line_t entry)
{ {
bool empty; bool empty;
unsigned long flags = 0; unsigned long flags = 0;
ENV_BUG_ON(line >= alock->num_entries); ENV_BUG_ON(entry >= alock->num_entries);
/* Lock waiters list */ /* Lock waiters list */
ocf_alock_waitlist_lock(alock, line, flags); ocf_alock_waitlist_lock(alock, entry, flags);
empty = ocf_alock_waitlist_is_empty_locked(alock, line); empty = ocf_alock_waitlist_is_empty_locked(alock, entry);
ocf_alock_waitlist_unlock(alock, line, flags); ocf_alock_waitlist_unlock(alock, entry, flags);
return empty; return empty;
} }
@ -1067,14 +1067,14 @@ bool ocf_alock_waitlist_is_empty(struct ocf_alock *alock,
/* NOTE: it is caller responsibility to assure that noone acquires /* NOTE: it is caller responsibility to assure that noone acquires
* a lock in background */ * a lock in background */
bool ocf_alock_is_locked_exclusively(struct ocf_alock *alock, bool ocf_alock_is_locked_exclusively(struct ocf_alock *alock,
ocf_cache_line_t line) ocf_cache_line_t entry)
{ {
env_atomic *access = &alock->access[line]; env_atomic *access = &alock->access[entry];
int val = env_atomic_read(access); int val = env_atomic_read(access);
ENV_BUG_ON(val == OCF_CACHE_LINE_ACCESS_IDLE); ENV_BUG_ON(val == OCF_CACHE_LINE_ACCESS_IDLE);
if (!ocf_alock_waitlist_is_empty(alock, line)) if (!ocf_alock_waitlist_is_empty(alock, entry))
return false; return false;
return val == OCF_CACHE_LINE_ACCESS_ONE_RD || return val == OCF_CACHE_LINE_ACCESS_ONE_RD ||

View File

@ -42,14 +42,14 @@ struct ocf_alock_lock_cbs
}; };
bool ocf_alock_trylock_one_rd(struct ocf_alock *alock, bool ocf_alock_trylock_one_rd(struct ocf_alock *alock,
ocf_cache_line_t line); ocf_cache_line_t entry);
void ocf_alock_unlock_one_rd(struct ocf_alock *alock, void ocf_alock_unlock_one_rd(struct ocf_alock *alock,
struct ocf_alock_lock_cbs *cbs, struct ocf_alock_lock_cbs *cbs,
const ocf_cache_line_t line); const ocf_cache_line_t entry);
bool ocf_alock_trylock_entry_wr(struct ocf_alock *alock, bool ocf_alock_trylock_entry_wr(struct ocf_alock *alock,
ocf_cache_line_t line); ocf_cache_line_t entry);
void ocf_alock_unlock_one_wr(struct ocf_alock *alock, void ocf_alock_unlock_one_wr(struct ocf_alock *alock,
struct ocf_alock_lock_cbs *cbs, struct ocf_alock_lock_cbs *cbs,
@ -76,10 +76,10 @@ void ocf_alock_unlock(struct ocf_alock *alock,
struct ocf_request *req); struct ocf_request *req);
bool ocf_alock_waitlist_is_empty(struct ocf_alock *alock, bool ocf_alock_waitlist_is_empty(struct ocf_alock *alock,
ocf_cache_line_t line); ocf_cache_line_t entry);
bool ocf_alock_is_locked_exclusively(struct ocf_alock *alock, bool ocf_alock_is_locked_exclusively(struct ocf_alock *alock,
ocf_cache_line_t line); ocf_cache_line_t entry);
uint32_t ocf_alock_waitlist_count(struct ocf_alock *alock); uint32_t ocf_alock_waitlist_count(struct ocf_alock *alock);