rename line to entry
Signed-off-by: Adam Rutkowski <adam.j.rutkowski@intel.com>
This commit is contained in:
parent
9a1646c8a1
commit
9746df0b1a
@ -35,10 +35,10 @@
|
||||
#define _WAITERS_LIST_ENTRIES \
|
||||
(_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 {
|
||||
ocf_cache_line_t line;
|
||||
ocf_cache_line_t entry;
|
||||
uint32_t idx;
|
||||
struct ocf_request *req;
|
||||
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,
|
||||
ocf_cache_line_t line)
|
||||
ocf_cache_line_t entry)
|
||||
{
|
||||
bool are = false;
|
||||
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_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))
|
||||
return true;
|
||||
|
||||
list_for_each(iter, &lst->head) {
|
||||
waiter = list_entry(iter, struct ocf_alock_waiter, item);
|
||||
|
||||
if (waiter->line == line) {
|
||||
if (waiter->entry == entry) {
|
||||
are = true;
|
||||
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,
|
||||
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];
|
||||
|
||||
list_add_tail(&waiter->item, &lst->head);
|
||||
}
|
||||
|
||||
|
||||
#define ocf_alock_waitlist_lock(cncrrncy, line, flags) \
|
||||
#define ocf_alock_waitlist_lock(cncrrncy, entry, flags) \
|
||||
do { \
|
||||
uint32_t list = _WAITERS_LIST_ITEM(line); \
|
||||
struct ocf_alock_waiters_list *lst = &cncrrncy->waiters_lsts[list]; \
|
||||
uint32_t idx = _WAITERS_LIST_ITEM(entry); \
|
||||
struct ocf_alock_waiters_list *lst = &cncrrncy->waiters_lsts[idx]; \
|
||||
env_spinlock_lock_irqsave(&lst->lock, flags); \
|
||||
} while (0)
|
||||
|
||||
#define ocf_alock_waitlist_unlock(cncrrncy, line, flags) \
|
||||
#define ocf_alock_waitlist_unlock(cncrrncy, entry, flags) \
|
||||
do { \
|
||||
uint32_t list = _WAITERS_LIST_ITEM(line); \
|
||||
struct ocf_alock_waiters_list *lst = &cncrrncy->waiters_lsts[list]; \
|
||||
uint32_t idx = _WAITERS_LIST_ITEM(entry); \
|
||||
struct ocf_alock_waiters_list *lst = &cncrrncy->waiters_lsts[idx]; \
|
||||
env_spinlock_unlock_irqrestore(&lst->lock, flags); \
|
||||
} while (0)
|
||||
|
||||
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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);
|
||||
}
|
||||
|
||||
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_atomic_set(access, OCF_CACHE_LINE_ACCESS_IDLE);
|
||||
}
|
||||
|
||||
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) == 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,
|
||||
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);
|
||||
return true;
|
||||
}
|
||||
|
||||
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_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,
|
||||
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);
|
||||
|
||||
@ -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,
|
||||
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);
|
||||
|
||||
@ -326,7 +326,7 @@ static void ocf_alock_entry_locked(struct ocf_alock *alock,
|
||||
struct ocf_request *req, ocf_req_async_lock_cb cmpl)
|
||||
{
|
||||
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");
|
||||
ENV_BUG_ON(!cmpl);
|
||||
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,
|
||||
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)
|
||||
{
|
||||
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);
|
||||
|
||||
if (ocf_alock_trylock_entry_wr(alock, line)) {
|
||||
if (ocf_alock_trylock_entry_wr(alock, entry)) {
|
||||
/* lock was not owned by anyone */
|
||||
cbs->line_mark_locked(req, idx, OCF_WRITE, true);
|
||||
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)
|
||||
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
|
||||
*/
|
||||
if (ocf_alock_trylock_entry_wr(alock, line))
|
||||
if (ocf_alock_trylock_entry_wr(alock, entry))
|
||||
goto unlock;
|
||||
|
||||
/* Setup waiters filed */
|
||||
waiter->line = line;
|
||||
waiter->entry = entry;
|
||||
waiter->req = req;
|
||||
waiter->idx = idx;
|
||||
waiter->cmpl = cmpl;
|
||||
@ -373,11 +373,11 @@ static inline bool ocf_alock_lock_one_wr(struct ocf_alock *alock,
|
||||
INIT_LIST_HEAD(&waiter->item);
|
||||
|
||||
/* Add to waiters list */
|
||||
ocf_alock_waitlist_add(alock, line, waiter);
|
||||
ocf_alock_waitlist_add(alock, entry, waiter);
|
||||
waiting = true;
|
||||
|
||||
unlock:
|
||||
ocf_alock_waitlist_unlock(alock, line, flags);
|
||||
ocf_alock_waitlist_unlock(alock, entry, flags);
|
||||
|
||||
if (!waiting) {
|
||||
cbs->line_mark_locked(req, idx, OCF_WRITE, true);
|
||||
@ -389,12 +389,12 @@ unlock:
|
||||
}
|
||||
|
||||
/*
|
||||
* Attempt to lock cache line for read.
|
||||
* In case cache line is locked, attempt to add caller on wait list.
|
||||
* Attempt to lock cache entry for read.
|
||||
* 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,
|
||||
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)
|
||||
{
|
||||
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);
|
||||
|
||||
if( ocf_alock_trylock_entry_rd_idle(alock, line)) {
|
||||
if( ocf_alock_trylock_entry_rd_idle(alock, entry)) {
|
||||
/* lock was not owned by anyone */
|
||||
cbs->line_mark_locked(req, idx, OCF_READ, true);
|
||||
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;
|
||||
|
||||
/* 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 */
|
||||
|
||||
/* Check if read lock can be obtained */
|
||||
if (ocf_alock_trylock_entry_rd(alock, line)) {
|
||||
/* Cache line locked */
|
||||
if (ocf_alock_trylock_entry_rd(alock, entry)) {
|
||||
/* Cache entry locked */
|
||||
goto unlock;
|
||||
}
|
||||
}
|
||||
|
||||
/* Setup waiters field */
|
||||
waiter->line = line;
|
||||
waiter->entry = entry;
|
||||
waiter->req = req;
|
||||
waiter->idx = idx;
|
||||
waiter->cmpl = cmpl;
|
||||
@ -436,11 +436,11 @@ static inline bool ocf_alock_lock_one_rd(struct ocf_alock *alock,
|
||||
INIT_LIST_HEAD(&waiter->item);
|
||||
|
||||
/* Add to waiters list */
|
||||
ocf_alock_waitlist_add(alock, line, waiter);
|
||||
ocf_alock_waitlist_add(alock, entry, waiter);
|
||||
waiting = true;
|
||||
|
||||
unlock:
|
||||
ocf_alock_waitlist_unlock(alock, line, flags);
|
||||
ocf_alock_waitlist_unlock(alock, entry, flags);
|
||||
|
||||
if (!waiting) {
|
||||
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,
|
||||
struct ocf_alock_lock_cbs *cbs,
|
||||
const ocf_cache_line_t line)
|
||||
const ocf_cache_line_t entry)
|
||||
{
|
||||
bool locked = false;
|
||||
bool exchanged = true;
|
||||
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_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) {
|
||||
waiter = list_entry(iter, struct ocf_alock_waiter, item);
|
||||
|
||||
if (line != waiter->line)
|
||||
if (entry != waiter->entry)
|
||||
continue;
|
||||
|
||||
if (exchanged) {
|
||||
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)
|
||||
locked = ocf_alock_trylock_entry_rd2rd(alock, line);
|
||||
locked = ocf_alock_trylock_entry_rd2rd(alock, entry);
|
||||
else
|
||||
ENV_BUG();
|
||||
} else {
|
||||
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)
|
||||
locked = ocf_alock_trylock_entry_rd(alock, line);
|
||||
locked = ocf_alock_trylock_entry_rd(alock, entry);
|
||||
else
|
||||
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
|
||||
* 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,
|
||||
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,
|
||||
struct ocf_alock_lock_cbs *cbs,
|
||||
const ocf_cache_line_t line)
|
||||
const ocf_cache_line_t entry)
|
||||
{
|
||||
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 */
|
||||
ocf_alock_waitlist_lock(alock, line, flags);
|
||||
ocf_alock_unlock_one_rd_common(alock, cbs, line);
|
||||
ocf_alock_waitlist_unlock(alock, line, flags);
|
||||
ocf_alock_waitlist_lock(alock, entry, flags);
|
||||
ocf_alock_unlock_one_rd_common(alock, cbs, entry);
|
||||
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,
|
||||
struct ocf_alock_lock_cbs *cbs,
|
||||
const ocf_cache_line_t line)
|
||||
const ocf_cache_line_t entry)
|
||||
{
|
||||
uint32_t i = 0;
|
||||
bool locked = false;
|
||||
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_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) {
|
||||
waiter = list_entry(iter, struct ocf_alock_waiter, item);
|
||||
|
||||
if (line != waiter->line)
|
||||
if (entry != waiter->entry)
|
||||
continue;
|
||||
|
||||
if (exchanged) {
|
||||
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)
|
||||
locked = ocf_alock_trylock_entry_wr2rd(alock, line);
|
||||
locked = ocf_alock_trylock_entry_wr2rd(alock, entry);
|
||||
else
|
||||
ENV_BUG();
|
||||
} else {
|
||||
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)
|
||||
locked = ocf_alock_trylock_entry_rd(alock, line);
|
||||
locked = ocf_alock_trylock_entry_rd(alock, entry);
|
||||
else
|
||||
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
|
||||
* 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,
|
||||
struct ocf_alock_lock_cbs *cbs,
|
||||
const ocf_cache_line_t line)
|
||||
const ocf_cache_line_t entry)
|
||||
{
|
||||
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 */
|
||||
ocf_alock_waitlist_lock(alock, line, flags);
|
||||
ocf_alock_unlock_one_wr_common(alock, cbs, line);
|
||||
ocf_alock_waitlist_unlock(alock, line, flags);
|
||||
ocf_alock_waitlist_lock(alock, entry, flags);
|
||||
ocf_alock_unlock_one_wr_common(alock, cbs, entry);
|
||||
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,
|
||||
* 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_request *req, int i, int rw)
|
||||
{
|
||||
ocf_cache_line_t line = req->map[i].coll_idx;
|
||||
uint32_t idx = _WAITERS_LIST_ITEM(line);
|
||||
ocf_cache_line_t entry = req->map[i].coll_idx;
|
||||
uint32_t idx = _WAITERS_LIST_ITEM(entry);
|
||||
struct ocf_alock_waiters_list *lst = &alock->waiters_lsts[idx];
|
||||
struct list_head *iter, *next;
|
||||
struct ocf_alock_waiter *waiter;
|
||||
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 (rw == OCF_READ)
|
||||
ocf_alock_unlock_one_rd_common(alock, cbs, line);
|
||||
ocf_alock_unlock_one_rd_common(alock, cbs, entry);
|
||||
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);
|
||||
} else {
|
||||
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
|
||||
@ -677,7 +677,7 @@ static int ocf_alock_lock_rd_fast(struct ocf_alock *alock,
|
||||
struct ocf_request *req)
|
||||
{
|
||||
int32_t i;
|
||||
ocf_cache_line_t line;
|
||||
ocf_cache_line_t entry;
|
||||
int ret = OCF_LOCK_ACQUIRED;
|
||||
|
||||
OCF_DEBUG_RQ(req, "Lock");
|
||||
@ -690,18 +690,18 @@ static int ocf_alock_lock_rd_fast(struct ocf_alock *alock,
|
||||
continue;
|
||||
}
|
||||
|
||||
line = req->map[i].coll_idx;
|
||||
ENV_BUG_ON(line >= alock->num_entries);
|
||||
entry = req->map[i].coll_idx;
|
||||
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));
|
||||
|
||||
if( ocf_alock_trylock_entry_rd_idle(alock, line)) {
|
||||
/* cache line locked */
|
||||
if( ocf_alock_trylock_entry_rd_idle(alock, entry)) {
|
||||
/* cache entry locked */
|
||||
cbs->line_mark_locked(req, i, OCF_READ, true);
|
||||
} else {
|
||||
/* Not possible to lock all cachelines */
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -715,10 +715,10 @@ static int ocf_alock_lock_rd_fast(struct ocf_alock *alock,
|
||||
continue;
|
||||
}
|
||||
|
||||
line = req->map[i].coll_idx;
|
||||
entry = req->map[i].coll_idx;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
@ -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)
|
||||
{
|
||||
int32_t i;
|
||||
ocf_cache_line_t line;
|
||||
ocf_cache_line_t entry;
|
||||
int ret = OCF_LOCK_NOT_ACQUIRED;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
line = req->map[i].coll_idx;
|
||||
ENV_BUG_ON(line >= alock->num_entries);
|
||||
entry = req->map[i].coll_idx;
|
||||
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));
|
||||
|
||||
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 */
|
||||
ret = -OCF_ERR_NO_MEM;
|
||||
goto err;
|
||||
@ -810,7 +810,7 @@ static int ocf_alock_lock_wr_fast(struct ocf_alock *alock,
|
||||
struct ocf_request *req)
|
||||
{
|
||||
int32_t i;
|
||||
ocf_cache_line_t line;
|
||||
ocf_cache_line_t entry;
|
||||
int ret = OCF_LOCK_ACQUIRED;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
line = req->map[i].coll_idx;
|
||||
ENV_BUG_ON(line >= alock->num_entries);
|
||||
entry = req->map[i].coll_idx;
|
||||
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));
|
||||
|
||||
if (ocf_alock_trylock_entry_wr(alock, line)) {
|
||||
/* cache line locked */
|
||||
if (ocf_alock_trylock_entry_wr(alock, entry)) {
|
||||
/* cache entry locked */
|
||||
cbs->line_mark_locked(req, i, OCF_WRITE, true);
|
||||
} else {
|
||||
/* Not possible to lock all cachelines */
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -844,10 +844,10 @@ static int ocf_alock_lock_wr_fast(struct ocf_alock *alock,
|
||||
if (!cbs->line_needs_lock(req, i))
|
||||
continue;
|
||||
|
||||
line = req->map[i].coll_idx;
|
||||
entry = req->map[i].coll_idx;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
@ -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)
|
||||
{
|
||||
int32_t i;
|
||||
ocf_cache_line_t line;
|
||||
ocf_cache_line_t entry;
|
||||
int ret = OCF_LOCK_NOT_ACQUIRED;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
line = req->map[i].coll_idx;
|
||||
ENV_BUG_ON(line >= alock->num_entries);
|
||||
entry = req->map[i].coll_idx;
|
||||
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));
|
||||
|
||||
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 */
|
||||
ret = -OCF_ERR_NO_MEM;
|
||||
goto err;
|
||||
@ -937,7 +937,7 @@ void ocf_alock_unlock_rd(struct ocf_alock *alock,
|
||||
struct ocf_request *req)
|
||||
{
|
||||
int32_t i;
|
||||
ocf_cache_line_t line;
|
||||
ocf_cache_line_t entry;
|
||||
|
||||
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))
|
||||
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);
|
||||
}
|
||||
}
|
||||
@ -964,7 +964,7 @@ void ocf_alock_unlock_wr(struct ocf_alock *alock,
|
||||
struct ocf_request *req)
|
||||
{
|
||||
int32_t i;
|
||||
ocf_cache_line_t line;
|
||||
ocf_cache_line_t entry;
|
||||
|
||||
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))
|
||||
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);
|
||||
}
|
||||
}
|
||||
@ -991,7 +991,7 @@ void ocf_alock_unlock(struct ocf_alock *alock,
|
||||
struct ocf_request *req)
|
||||
{
|
||||
int32_t i;
|
||||
ocf_cache_line_t line;
|
||||
ocf_cache_line_t entry;
|
||||
|
||||
OCF_DEBUG_RQ(req, "Unlock");
|
||||
|
||||
@ -999,17 +999,17 @@ void ocf_alock_unlock(struct ocf_alock *alock,
|
||||
if (!cbs->line_is_acting(req, i))
|
||||
continue;
|
||||
|
||||
line = req->map[i].coll_idx;
|
||||
ENV_BUG_ON(line >= alock->num_entries);
|
||||
entry = req->map[i].coll_idx;
|
||||
ENV_BUG_ON(entry >= alock->num_entries);
|
||||
|
||||
if (cbs->line_is_locked(req, i, OCF_READ) &&
|
||||
cbs->line_is_locked(req, i, OCF_WRITE)) {
|
||||
ENV_BUG();
|
||||
} 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);
|
||||
} 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);
|
||||
}
|
||||
}
|
||||
@ -1017,49 +1017,49 @@ void ocf_alock_unlock(struct ocf_alock *alock,
|
||||
|
||||
void ocf_alock_unlock_one(struct ocf_alock *alock,
|
||||
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) &&
|
||||
cbs->line_is_locked(req, entry, OCF_WRITE)) {
|
||||
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, entry, OCF_READ)) {
|
||||
ocf_alock_unlock_one_rd(alock, cbs, req->map[entry].coll_idx);
|
||||
cbs->line_mark_locked(req, entry, OCF_READ, false);
|
||||
} else if (cbs->line_is_locked(req, entry, OCF_WRITE)) {
|
||||
ocf_alock_unlock_one_wr(alock, cbs, req->map[entry].coll_idx);
|
||||
cbs->line_mark_locked(req, entry, OCF_WRITE, false);
|
||||
} else if (cbs->line_is_locked(req, idx, OCF_READ)) {
|
||||
ocf_alock_unlock_one_rd(alock, cbs, req->map[idx].coll_idx);
|
||||
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);
|
||||
cbs->line_mark_locked(req, idx, OCF_WRITE, false);
|
||||
} else {
|
||||
ENV_BUG();
|
||||
}
|
||||
}
|
||||
|
||||
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 !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,
|
||||
ocf_cache_line_t line)
|
||||
ocf_cache_line_t entry)
|
||||
{
|
||||
bool empty;
|
||||
unsigned long flags = 0;
|
||||
|
||||
ENV_BUG_ON(line >= alock->num_entries);
|
||||
ENV_BUG_ON(entry >= alock->num_entries);
|
||||
|
||||
/* 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;
|
||||
}
|
||||
@ -1067,14 +1067,14 @@ bool ocf_alock_waitlist_is_empty(struct ocf_alock *alock,
|
||||
/* NOTE: it is caller responsibility to assure that noone acquires
|
||||
* a lock in background */
|
||||
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);
|
||||
|
||||
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 val == OCF_CACHE_LINE_ACCESS_ONE_RD ||
|
||||
|
@ -42,14 +42,14 @@ struct ocf_alock_lock_cbs
|
||||
};
|
||||
|
||||
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,
|
||||
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,
|
||||
ocf_cache_line_t line);
|
||||
ocf_cache_line_t entry);
|
||||
|
||||
void ocf_alock_unlock_one_wr(struct ocf_alock *alock,
|
||||
struct ocf_alock_lock_cbs *cbs,
|
||||
@ -76,10 +76,10 @@ void ocf_alock_unlock(struct ocf_alock *alock,
|
||||
struct ocf_request *req);
|
||||
|
||||
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,
|
||||
ocf_cache_line_t line);
|
||||
ocf_cache_line_t entry);
|
||||
|
||||
uint32_t ocf_alock_waitlist_count(struct ocf_alock *alock);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user