Queue visitor API

Signed-off-by: Michal Mielewczyk <michal.mielewczyk@huawei.com>
This commit is contained in:
Michal Mielewczyk 2024-03-28 11:46:48 +01:00
parent b00ab08473
commit 53756e81be
2 changed files with 42 additions and 0 deletions

View File

@ -72,6 +72,28 @@ int ocf_queue_create(ocf_cache_t cache, ocf_queue_t *queue,
int ocf_queue_create_mngt(ocf_cache_t cache, ocf_queue_t *queue,
const struct ocf_queue_ops *ops);
/**
* @brief Queue visitor function
* @param[in] queue Queue handle
* @param[in] ctx Visitor function context
*
* @return Zero on success, otherwise error code
*/
typedef int (*ocf_cache_queue_visitor_t)(ocf_queue_t queue, void *ctx);
/**
* @brief Call @visitor for every IO queue
*
* @param[in] cache Cache instance
* @param[in] visitor Function to be called on every queue.
* The visitor function is called in atomic context
* @param[in] ctx Context to be passes to @visitor
*
* @return Zero on success, otherwise error code
*/
int ocf_queue_visit(ocf_cache_t cache, ocf_cache_queue_visitor_t visitor,
void *ctx);
/**
* @brief Increase reference counter in queue
*

View File

@ -78,6 +78,26 @@ int ocf_queue_create(ocf_cache_t cache, ocf_queue_t *queue,
return 0;
}
int ocf_queue_visit(ocf_cache_t cache, ocf_cache_queue_visitor_t visitor,
void *ctx)
{
ocf_queue_t queue;
int result = 0;
unsigned long flags = 0;
env_spinlock_lock_irqsave(&cache->io_queues_lock, flags);
list_for_each_entry(queue, &cache->io_queues, list) {
result = visitor(queue, ctx);
if (result)
break;
}
env_spinlock_unlock_irqrestore(&cache->io_queues_lock, flags);
return result;
}
int ocf_queue_create_mngt(ocf_cache_t cache, ocf_queue_t *queue,
const struct ocf_queue_ops *ops)
{