From c74b4b32ba319e0a1cf8468c521a801c51cc6dd3 Mon Sep 17 00:00:00 2001 From: Marcin Dziegielewski Date: Mon, 14 Oct 2019 14:29:42 +0200 Subject: [PATCH] lib/bdev/ocf: use asynhronous management API from OCF instead of polling New version of OCF library provided full asynhronus management API, therefore this patch changes all uses of polling in management operations in vbdev to asynhronous way. Change-Id: I7bf76fa2919fac4a068ef5c39f5b667b2be68ff7 Signed-off-by: Marcin Dziegielewski Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/470352 Reviewed-by: Tomasz Zawadzki Reviewed-by: Jim Harris Reviewed-by: Vitaliy Mysak Tested-by: SPDK CI Jenkins --- module/bdev/ocf/vbdev_ocf.c | 84 +++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 36 deletions(-) diff --git a/module/bdev/ocf/vbdev_ocf.c b/module/bdev/ocf/vbdev_ocf.c index 412eaebb9..4821523d2 100644 --- a/module/bdev/ocf/vbdev_ocf.c +++ b/module/bdev/ocf/vbdev_ocf.c @@ -199,16 +199,17 @@ remove_core_cmpl(void *priv, int error) /* Try to lock cache, then remove core */ static void -remove_core_poll(struct vbdev_ocf *vbdev) +remove_core_cache_lock_cmpl(ocf_cache_t cache, void *priv, int error) { - int rc; + struct vbdev_ocf *vbdev = (struct vbdev_ocf *)priv; - rc = ocf_mngt_cache_trylock(vbdev->ocf_cache); - if (rc) { + if (error) { + SPDK_ERRLOG("Error %d, can not lock cache instance %s\n", + error, vbdev->name); + vbdev_ocf_mngt_continue(vbdev, error); return; } - vbdev_ocf_mngt_poll(vbdev, NULL); ocf_mngt_cache_remove_core(vbdev->ocf_core, remove_core_cmpl, vbdev); } @@ -217,7 +218,7 @@ static void detach_core(struct vbdev_ocf *vbdev) { if (vbdev->ocf_cache && ocf_cache_is_running(vbdev->ocf_cache)) { - vbdev_ocf_mngt_poll(vbdev, remove_core_poll); + ocf_mngt_cache_lock(vbdev->ocf_cache, remove_core_cache_lock_cmpl, vbdev); } else { vbdev_ocf_mngt_continue(vbdev, 0); } @@ -258,7 +259,24 @@ stop_vbdev_cmpl(ocf_cache_t cache, void *priv, int error) /* Try to lock cache, then stop it */ static void -stop_vbdev_poll(struct vbdev_ocf *vbdev) +stop_vbdev_cache_lock_cmpl(ocf_cache_t cache, void *priv, int error) +{ + struct vbdev_ocf *vbdev = (struct vbdev_ocf *)priv; + + if (error) { + SPDK_ERRLOG("Error %d, can not lock cache instance %s\n", + error, vbdev->name); + vbdev_ocf_mngt_continue(vbdev, error); + return; + } + + ocf_mngt_cache_stop(vbdev->ocf_cache, stop_vbdev_cmpl, vbdev); +} + +/* Stop OCF cache object + * vbdev_ocf is not operational after this */ +static void +stop_vbdev(struct vbdev_ocf *vbdev) { if (!ocf_cache_is_running(vbdev->ocf_cache)) { vbdev_ocf_mngt_continue(vbdev, 0); @@ -273,20 +291,7 @@ stop_vbdev_poll(struct vbdev_ocf *vbdev) return; } - if (ocf_mngt_cache_trylock(vbdev->ocf_cache)) { - return; - } - - vbdev_ocf_mngt_poll(vbdev, NULL); - ocf_mngt_cache_stop(vbdev->ocf_cache, stop_vbdev_cmpl, vbdev); -} - -/* Stop OCF cache object - * vbdev_ocf is not operational after this */ -static void -stop_vbdev(struct vbdev_ocf *vbdev) -{ - vbdev_ocf_mngt_poll(vbdev, stop_vbdev_poll); + ocf_mngt_cache_lock(vbdev->ocf_cache, stop_vbdev_cache_lock_cmpl, vbdev); } static void @@ -299,25 +304,29 @@ flush_vbdev_cmpl(ocf_cache_t cache, void *priv, int error) } static void -flush_vbdev_poll(struct vbdev_ocf *vbdev) +flush_vbdev_cache_lock_cmpl(ocf_cache_t cache, void *priv, int error) { - if (!ocf_cache_is_running(vbdev->ocf_cache)) { - vbdev_ocf_mngt_continue(vbdev, -EINVAL); + struct vbdev_ocf *vbdev = (struct vbdev_ocf *)priv; + + if (error) { + SPDK_ERRLOG("Error %d, can not lock cache instance %s\n", + error, vbdev->name); + vbdev_ocf_mngt_continue(vbdev, error); return; } - if (ocf_mngt_cache_trylock(vbdev->ocf_cache)) { - return; - } - - vbdev_ocf_mngt_poll(vbdev, NULL); ocf_mngt_cache_flush(vbdev->ocf_cache, flush_vbdev_cmpl, vbdev); } static void flush_vbdev(struct vbdev_ocf *vbdev) { - vbdev_ocf_mngt_poll(vbdev, flush_vbdev_poll); + if (!ocf_cache_is_running(vbdev->ocf_cache)) { + vbdev_ocf_mngt_continue(vbdev, -EINVAL); + return; + } + + ocf_mngt_cache_lock(vbdev->ocf_cache, flush_vbdev_cache_lock_cmpl, vbdev); } /* Procedures called during dirty unregister */ @@ -941,13 +950,16 @@ add_core_cmpl(ocf_cache_t cache, ocf_core_t core, void *priv, int error) /* Try to lock cache, then add core */ static void -add_core_poll(struct vbdev_ocf *vbdev) +add_core_cache_lock_cmpl(ocf_cache_t cache, void *priv, int error) { - if (ocf_mngt_cache_trylock(vbdev->ocf_cache)) { - return; - } + struct vbdev_ocf *vbdev = (struct vbdev_ocf *)priv; - vbdev_ocf_mngt_poll(vbdev, NULL); + if (error) { + SPDK_ERRLOG("Error %d, can not lock cache instance %s," + "starting rollback\n", error, vbdev->name); + clear_starting_indicator_vbdev(vbdev); + vbdev_ocf_mngt_stop(vbdev, unregister_path_dirty, error); + } ocf_mngt_cache_add_core(vbdev->ocf_cache, &vbdev->cfg.core, add_core_cmpl, vbdev); } @@ -955,7 +967,7 @@ add_core_poll(struct vbdev_ocf *vbdev) static void add_core(struct vbdev_ocf *vbdev) { - vbdev_ocf_mngt_poll(vbdev, add_core_poll); + ocf_mngt_cache_lock(vbdev->ocf_cache, add_core_cache_lock_cmpl, vbdev); } static void