cleaner: Simplify master request life cycle management
Signed-off-by: Robert Baldyga <robert.baldyga@huawei.com>
This commit is contained in:
parent
3300dbd4e7
commit
db6b009ef5
@ -109,6 +109,9 @@ static struct ocf_request *_ocf_cleaner_alloc_master_req(
|
|||||||
/* The count of all requests */
|
/* The count of all requests */
|
||||||
env_atomic_set(&req->master_remaining, 1);
|
env_atomic_set(&req->master_remaining, 1);
|
||||||
|
|
||||||
|
/* Keep master alive till all sub-requests complete */
|
||||||
|
ocf_req_get(req);
|
||||||
|
|
||||||
OCF_DEBUG_PARAM(cache, "New master request, count = %u", count);
|
OCF_DEBUG_PARAM(cache, "New master request, count = %u", count);
|
||||||
|
|
||||||
return req;
|
return req;
|
||||||
@ -133,9 +136,6 @@ static struct ocf_request *_ocf_cleaner_alloc_slave_req(
|
|||||||
/* Set type of cleaning request */
|
/* Set type of cleaning request */
|
||||||
req->master_io_req_type = ocf_cleaner_req_type_slave;
|
req->master_io_req_type = ocf_cleaner_req_type_slave;
|
||||||
|
|
||||||
/* Slave refers to master request, get its reference counter */
|
|
||||||
ocf_req_get(master);
|
|
||||||
|
|
||||||
/* Slave request contains reference to master */
|
/* Slave request contains reference to master */
|
||||||
req->master_io_req = master;
|
req->master_io_req = master;
|
||||||
|
|
||||||
@ -153,22 +153,6 @@ static struct ocf_request *_ocf_cleaner_alloc_slave_req(
|
|||||||
|
|
||||||
static void _ocf_cleaner_dealloc_req(struct ocf_request *req)
|
static void _ocf_cleaner_dealloc_req(struct ocf_request *req)
|
||||||
{
|
{
|
||||||
if (ocf_cleaner_req_type_slave == req->master_io_req_type) {
|
|
||||||
/* Slave contains reference to the master request,
|
|
||||||
* release reference counter
|
|
||||||
*/
|
|
||||||
struct ocf_request *master = req->master_io_req;
|
|
||||||
|
|
||||||
OCF_DEBUG_MSG(req->cache, "Put master request by slave");
|
|
||||||
ocf_req_put(master);
|
|
||||||
|
|
||||||
OCF_DEBUG_MSG(req->cache, "Free slave request");
|
|
||||||
} else if (ocf_cleaner_req_type_master == req->master_io_req_type) {
|
|
||||||
OCF_DEBUG_MSG(req->cache, "Free master request");
|
|
||||||
} else {
|
|
||||||
ENV_BUG();
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx_data_secure_erase(req->cache->owner, req->data);
|
ctx_data_secure_erase(req->cache->owner, req->data);
|
||||||
ctx_data_munlock(req->cache->owner, req->data);
|
ctx_data_munlock(req->cache->owner, req->data);
|
||||||
ctx_data_free(req->cache->owner, req->data);
|
ctx_data_free(req->cache->owner, req->data);
|
||||||
@ -239,6 +223,9 @@ static void _ocf_cleaner_complete_req(struct ocf_request *req)
|
|||||||
/* Only master contains completion function and priv */
|
/* Only master contains completion function and priv */
|
||||||
cmpl = master->master_io_req;
|
cmpl = master->master_io_req;
|
||||||
cmpl(master->priv, master->error);
|
cmpl(master->priv, master->error);
|
||||||
|
|
||||||
|
/* For additional get on master allocation */
|
||||||
|
ocf_req_put(master);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -846,10 +833,7 @@ void ocf_cleaner_fire(struct ocf_cache *cache,
|
|||||||
|
|
||||||
req = master;
|
req = master;
|
||||||
|
|
||||||
/* prevent cleaning completion race */
|
|
||||||
ocf_req_get(master);
|
|
||||||
env_atomic_inc(&master->master_remaining);
|
env_atomic_inc(&master->master_remaining);
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
/* when request hasn't yet been allocated or is just issued */
|
/* when request hasn't yet been allocated or is just issued */
|
||||||
if (unlikely(!req)) {
|
if (unlikely(!req)) {
|
||||||
@ -907,9 +891,7 @@ void ocf_cleaner_fire(struct ocf_cache *cache,
|
|||||||
req = NULL;
|
req = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* prevent cleaning completion race */
|
|
||||||
_ocf_cleaner_complete_req(master);
|
_ocf_cleaner_complete_req(master);
|
||||||
ocf_req_put(master);
|
|
||||||
|
|
||||||
if (req && !i_out)
|
if (req && !i_out)
|
||||||
_ocf_cleaner_dealloc_req(req);
|
_ocf_cleaner_dealloc_req(req);
|
||||||
|
Loading…
Reference in New Issue
Block a user