@@ -64,7 +64,6 @@ struct directio_context {
int reset_flags;
struct aio_group *aio_grp;
struct async_req *req;
- struct timespec endtime;
bool waited_for;
};
@@ -291,18 +290,17 @@ get_events(struct aio_group *aio_grp, struct timespec *timeout)
}
static void
-check_pending(struct directio_context *ct, struct timespec endtime)
+check_pending(struct directio_context *ct, struct timespec timeout)
{
int r;
- struct timespec currtime, timeout;
+ struct timespec endtime, currtime;
ct->waited_for = true;
+ get_monotonic_time(&endtime);
+ endtime.tv_sec += timeout.tv_sec;
+ endtime.tv_nsec += timeout.tv_nsec;
+ normalize_timespec(&endtime);
while(1) {
- get_monotonic_time(&currtime);
- timespecsub(&endtime, &currtime, &timeout);
- if (timeout.tv_sec < 0)
- timeout.tv_sec = timeout.tv_nsec = 0;
-
r = get_events(ct->aio_grp, &timeout);
if (ct->req->state != PATH_PENDING) {
@@ -311,6 +309,10 @@ check_pending(struct directio_context *ct, struct timespec endtime)
} else if (r == 0 ||
(timeout.tv_sec == 0 && timeout.tv_nsec == 0))
return;
+ get_monotonic_time(&currtime);
+ timespecsub(&endtime, &currtime, &timeout);
+ if (timeout.tv_sec < 0)
+ timeout.tv_sec = timeout.tv_nsec = 0;
}
}
@@ -320,7 +322,7 @@ check_state(int fd, struct directio_context *ct, int sync, int timeout_secs)
struct stat sb;
int rc;
struct io_event event;
- struct timespec endtime;
+ struct timespec timeout = { .tv_sec = timeout_secs };
if (fstat(fd, &sb) == 0) {
LOG(4, "called for %x", (unsigned) sb.st_rdev);
@@ -345,20 +347,13 @@ check_state(int fd, struct directio_context *ct, int sync, int timeout_secs)
LOG(3, "io_submit error %i", -rc);
return PATH_UNCHECKED;
}
- get_monotonic_time(&ct->endtime);
- ct->endtime.tv_nsec += 1000 * 1000;
- normalize_timespec(&ct->endtime);
ct->waited_for = false;
}
ct->running++;
if (!sync)
return PATH_PENDING;
- get_monotonic_time(&endtime);
- endtime.tv_sec += timeout_secs;
- normalize_timespec(&endtime);
-
- check_pending(ct, endtime);
+ check_pending(ct, timeout);
if (ct->req->state != PATH_PENDING)
return ct->req->state;
@@ -401,13 +396,16 @@ int libcheck_pending(struct checker *c)
int rc;
struct io_event event;
struct directio_context *ct = (struct directio_context *)c->context;
+ struct timespec no_wait = { .tv_sec = 0 };
/* The if path checker isn't running, just return the exiting value. */
- if (!ct || !ct->running)
- return c->path_state;
+ if (!ct || !ct->running) {
+ rc = c->path_state;
+ goto out;
+ }
if (ct->req->state == PATH_PENDING)
- check_pending(ct, ct->endtime);
+ check_pending(ct, no_wait);
else
ct->running = 0;
rc = ct->req->state;
@@ -420,8 +418,9 @@ int libcheck_pending(struct checker *c)
else
LOG(4, "async io pending");
}
- set_msgid(c, rc);
+out:
+ set_msgid(c, rc);
return rc;
}
@@ -58,7 +58,6 @@ struct tur_checker_context {
int msgid;
struct checker_context ctx;
unsigned int nr_timeouts;
- struct timespec endtime;
bool waited_for;
};
@@ -299,14 +298,6 @@ void *libcheck_thread(struct checker_context *ctx)
return ((void *)0);
}
-
-static void tur_timeout(struct timespec *tsp)
-{
- get_monotonic_time(tsp);
- tsp->tv_nsec += 1000 * 1000; /* 1 millisecond */
- normalize_timespec(tsp);
-}
-
static void tur_set_async_timeout(struct checker *c)
{
struct tur_checker_context *ct = c->context;
@@ -328,16 +319,12 @@ static int tur_check_async_timeout(struct checker *c)
int check_pending(struct checker *c)
{
struct tur_checker_context *ct = c->context;
- int r, tur_status = PATH_PENDING;
+ int tur_status = PATH_PENDING;
pthread_mutex_lock(&ct->lock);
- for (r = 0;
- r == 0 && ct->state == PATH_PENDING &&
- ct->msgid == MSG_TUR_RUNNING;
- r = pthread_cond_timedwait(&ct->active, &ct->lock, &ct->endtime));
-
- if (!r) {
+ if (ct->state != PATH_PENDING || ct->msgid != MSG_TUR_RUNNING)
+ {
tur_status = ct->state;
c->msgid = ct->msgid;
}
@@ -487,7 +474,6 @@ int libcheck_check(struct checker * c)
" sync mode", major(ct->devt), minor(ct->devt));
return tur_check(c->fd, c->timeout, &c->msgid);
}
- tur_timeout(&ct->endtime);
}
return tur_status;
Disable waiting in the libcheck_pending() checker class functions. Instead, they now just check if the checker has already completed. A future patch will re-add waiting outside of libcheck_pending(). Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> --- libmultipath/checkers/directio.c | 41 ++++++++++++++++---------------- libmultipath/checkers/tur.c | 20 +++------------- 2 files changed, 23 insertions(+), 38 deletions(-)