OSDN Git Service

staging: lustre: simplify waiting in ptlrpc_invalidate_import()
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)
This waiter currently wakes up every second to re-test if
imp_flight is zero.  If we ensure wakeup is called whenever
imp_flight is decremented to zero, we can just have a simple
wait_event_idle_timeout().

So add a wake_up_all to the one place it is missing, and simplify
the wait_event.

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/import.c

index 0ab13f8..81b7a70 100644 (file)
@@ -1588,7 +1588,8 @@ static int ptlrpc_send_new_req(struct ptlrpc_request *req)
                spin_lock(&imp->imp_lock);
                if (!list_empty(&req->rq_list)) {
                        list_del_init(&req->rq_list);
-                       atomic_dec(&req->rq_import->imp_inflight);
+                       if (atomic_dec_and_test(&req->rq_import->imp_inflight))
+                               wake_up_all(&req->rq_import->imp_recovery_waitq);
                }
                spin_unlock(&imp->imp_lock);
                ptlrpc_rqphase_move(req, RQ_PHASE_NEW);
index ed21055..5d62c9d 100644 (file)
@@ -265,7 +265,6 @@ void ptlrpc_invalidate_import(struct obd_import *imp)
 {
        struct list_head *tmp, *n;
        struct ptlrpc_request *req;
-       struct l_wait_info lwi;
        unsigned int timeout;
        int rc;
 
@@ -306,19 +305,15 @@ void ptlrpc_invalidate_import(struct obd_import *imp)
                 * callbacks. Cap it at obd_timeout -- these should all
                 * have been locally cancelled by ptlrpc_abort_inflight.
                 */
-               lwi = LWI_TIMEOUT_INTERVAL(
-                       cfs_timeout_cap(timeout * HZ),
-                       (timeout > 1) ? HZ :
-                       HZ / 2,
-                       NULL, NULL);
-               rc = l_wait_event(imp->imp_recovery_waitq,
-                                 (atomic_read(&imp->imp_inflight) == 0),
-                                 &lwi);
-               if (rc) {
+               rc = wait_event_idle_timeout(imp->imp_recovery_waitq,
+                                            atomic_read(&imp->imp_inflight) == 0,
+                                            obd_timeout * HZ);
+
+               if (rc == 0) {
                        const char *cli_tgt = obd2cli_tgt(imp->imp_obd);
 
-                       CERROR("%s: rc = %d waiting for callback (%d != 0)\n",
-                              cli_tgt, rc,
+                       CERROR("%s: timeout waiting for callback (%d != 0)\n",
+                              cli_tgt,
                               atomic_read(&imp->imp_inflight));
 
                        spin_lock(&imp->imp_lock);
@@ -365,7 +360,7 @@ void ptlrpc_invalidate_import(struct obd_import *imp)
                        }
                        spin_unlock(&imp->imp_lock);
                }
-       } while (rc != 0);
+       } while (rc == 0);
 
        /*
         * Let's additionally check that no new rpcs added to import in