Re: [PATCH 10/19] staging: lustre: simplify waiting in ptlrpc_invalidate_import()

From: James Simmons
Date: Wed Jan 17 2018 - 10:32:51 EST



> 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@xxxxxxxxxxxxx>

> Signed-off-by: NeilBrown <neilb@xxxxxxxx>
> ---
> drivers/staging/lustre/lustre/ptlrpc/client.c | 3 ++-
> drivers/staging/lustre/lustre/ptlrpc/import.c | 21 ++++++++-------------
> 2 files changed, 10 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/staging/lustre/lustre/ptlrpc/client.c b/drivers/staging/lustre/lustre/ptlrpc/client.c
> index 0ab13f8e5993..81b7a7046d82 100644
> --- a/drivers/staging/lustre/lustre/ptlrpc/client.c
> +++ b/drivers/staging/lustre/lustre/ptlrpc/client.c
> @@ -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);
> diff --git a/drivers/staging/lustre/lustre/ptlrpc/import.c b/drivers/staging/lustre/lustre/ptlrpc/import.c
> index ed210550f61f..5d62c9de27eb 100644
> --- a/drivers/staging/lustre/lustre/ptlrpc/import.c
> +++ b/drivers/staging/lustre/lustre/ptlrpc/import.c
> @@ -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
>
>
>