diff --git a/lib/bdev/ocf/utils.c b/lib/bdev/ocf/utils.c index 4b56cb38b..581f3b498 100644 --- a/lib/bdev/ocf/utils.c +++ b/lib/bdev/ocf/utils.c @@ -74,7 +74,12 @@ mngt_poll_fn(void *opaque) struct vbdev_ocf *vbdev = opaque; if (vbdev->mngt_ctx.poller_fn) { - vbdev->mngt_ctx.poller_fn(vbdev); + if (vbdev->mngt_ctx.timeout_ts && + spdk_get_ticks() >= vbdev->mngt_ctx.timeout_ts) { + vbdev_ocf_mngt_continue(vbdev, -ETIMEDOUT); + } else { + vbdev->mngt_ctx.poller_fn(vbdev); + } } return 0; @@ -104,11 +109,22 @@ vbdev_ocf_mngt_start(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_fn *path, return 0; } + +static void +vbdev_ocf_mngt_poll_set_timeout(struct vbdev_ocf *vbdev, uint64_t millisec) +{ + uint64_t ticks; + + ticks = millisec * spdk_get_ticks_hz() / 1000; + vbdev->mngt_ctx.timeout_ts = spdk_get_ticks() + ticks; +} + void vbdev_ocf_mngt_poll(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_fn fn) { assert(vbdev->mngt_ctx.poller != NULL); vbdev->mngt_ctx.poller_fn = fn; + vbdev_ocf_mngt_poll_set_timeout(vbdev, 5000); } void diff --git a/lib/bdev/ocf/utils.h b/lib/bdev/ocf/utils.h index 49ea8fe7e..54ce4be2a 100644 --- a/lib/bdev/ocf/utils.h +++ b/lib/bdev/ocf/utils.h @@ -49,7 +49,8 @@ int vbdev_ocf_mngt_start(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_fn *path, vbdev_ocf_mngt_callback cb, void *cb_arg); /* Continue execution with polling operation (fn) - * fn must invoke vbdev_ocf_mngt_continue() to stop polling */ + * fn must invoke vbdev_ocf_mngt_continue() to stop polling + * Poller has default timeout of 5 seconds */ void vbdev_ocf_mngt_poll(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_fn fn); /* Continue execution with next function that is on path diff --git a/lib/bdev/ocf/vbdev_ocf.h b/lib/bdev/ocf/vbdev_ocf.h index d1cd71d9f..07768a855 100644 --- a/lib/bdev/ocf/vbdev_ocf.h +++ b/lib/bdev/ocf/vbdev_ocf.h @@ -99,6 +99,8 @@ struct vbdev_ocf_mngt_ctx { struct spdk_poller *poller; /* Function that gets invoked by poller on each iteration */ vbdev_ocf_mngt_fn poller_fn; + /* Poller timeout time stamp - when the poller should stop with error */ + uint64_t timeout_ts; /* Status of management operation */ int status;