]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
staging: lustre: use wait_event_idle_timeout in ptlrpcd()
authorNeilBrown <neilb@suse.com>
Mon, 12 Feb 2018 23:47:59 +0000 (10:47 +1100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 16 Feb 2018 14:19:11 +0000 (15:19 +0100)
We can replace l_wait_event() with
wait_event_idle_timeout() here providing we call the
timeout function when wait_event_idle_timeout() returns zero.

As ptlrpc_expired_set() returns 1, the l_wait_event() aborts of the
first timeout.

Reviewed-by: James Simmons <jsimmons@infradead.org>
Signed-off-by: NeilBrown <neilb@suse.com>
Reviewed-by: Patrick Farrell <paf@cray.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/lustre/lustre/ptlrpc/client.c
drivers/staging/lustre/lustre/ptlrpc/ptlrpc_internal.h
drivers/staging/lustre/lustre/ptlrpc/ptlrpcd.c

index 81b7a7046d82ae0cb38105d1227f225ffd908fb5..f70176c6db089e8d8b35a89505d8fc5b101583c0 100644 (file)
@@ -2125,9 +2125,8 @@ int ptlrpc_expire_one_request(struct ptlrpc_request *req, int async_unlink)
  * Callback used when waiting on sets with l_wait_event.
  * Always returns 1.
  */
-int ptlrpc_expired_set(void *data)
+void ptlrpc_expired_set(struct ptlrpc_request_set *set)
 {
-       struct ptlrpc_request_set *set = data;
        struct list_head *tmp;
        time64_t now = ktime_get_real_seconds();
 
@@ -2156,7 +2155,12 @@ int ptlrpc_expired_set(void *data)
                 */
                ptlrpc_expire_one_request(req, 1);
        }
+}
+static int ptlrpc_expired_set_void(void *data)
+{
+       struct ptlrpc_request_set *set = data;
 
+       ptlrpc_expired_set(set);
        /*
         * When waiting for a whole set, we always break out of the
         * sleep so we can recalculate the timeout, or enable interrupts
@@ -2286,7 +2290,7 @@ int ptlrpc_set_wait(struct ptlrpc_request_set *set)
                         * so we allow interrupts during the timeout.
                         */
                        lwi = LWI_TIMEOUT_INTR_ALL(HZ,
-                                                  ptlrpc_expired_set,
+                                                  ptlrpc_expired_set_void,
                                                   ptlrpc_interrupted_set, set);
                else
                        /*
@@ -2295,7 +2299,7 @@ int ptlrpc_set_wait(struct ptlrpc_request_set *set)
                         * complete, or an in-flight req times out.
                         */
                        lwi = LWI_TIMEOUT((timeout ? timeout : 1) * HZ,
-                                         ptlrpc_expired_set, set);
+                                         ptlrpc_expired_set_void, set);
 
                rc = l_wait_event(set->set_waitq, ptlrpc_check_set(NULL, set), &lwi);
 
index f9decbd1459d2a5bdb3454b0d0747511719576ec..b7a8d7537a6687dba9395f4c7d678eb5b63a926c 100644 (file)
@@ -68,7 +68,7 @@ void ptlrpc_request_cache_free(struct ptlrpc_request *req);
 void ptlrpc_init_xid(void);
 void ptlrpc_set_add_new_req(struct ptlrpcd_ctl *pc,
                            struct ptlrpc_request *req);
-int ptlrpc_expired_set(void *data);
+void ptlrpc_expired_set(struct ptlrpc_request_set *set);
 int ptlrpc_set_next_timeout(struct ptlrpc_request_set *set);
 void ptlrpc_resend_req(struct ptlrpc_request *request);
 void ptlrpc_set_bulk_mbits(struct ptlrpc_request *req);
index 437b4b2a9072d63d18a1be1672f78c8dc8eb0a00..6ed77521d025cb75a1bf0e22499b79e8eb43d9de 100644 (file)
@@ -435,16 +435,17 @@ static int ptlrpcd(void *arg)
         * new_req_list and ptlrpcd_check() moves them into the set.
         */
        do {
-               struct l_wait_info lwi;
                int timeout;
 
                timeout = ptlrpc_set_next_timeout(set);
-               lwi = LWI_TIMEOUT((timeout ? timeout : 1) * HZ,
-                                 ptlrpc_expired_set, set);
 
                lu_context_enter(&env.le_ctx);
                lu_context_enter(env.le_ses);
-               l_wait_event(set->set_waitq, ptlrpcd_check(&env, pc), &lwi);
+               if (wait_event_idle_timeout(set->set_waitq,
+                                           ptlrpcd_check(&env, pc),
+                                           (timeout ? timeout : 1) * HZ) == 0)
+                       ptlrpc_expired_set(set);
+
                lu_context_exit(&env.le_ctx);
                lu_context_exit(env.le_ses);