lkml.org 
[lkml]   [2018]   [Jan]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 14/19] staging: lustre: improve waiting in sptlrpc_req_refresh_ctx

    > Replace l_wait_event with wait_event_idle_timeout() and call the
    > handler function explicitly. This makes it more clear
    > what is happening.

    Reviewed-by: James Simmons <jsimmons@infradead.org>

    > Signed-off-by: NeilBrown <neilb@suse.com>
    > ---
    > drivers/staging/lustre/lustre/ptlrpc/sec.c | 34 ++++++++++++++++++++--------
    > 1 file changed, 24 insertions(+), 10 deletions(-)
    >
    > diff --git a/drivers/staging/lustre/lustre/ptlrpc/sec.c b/drivers/staging/lustre/lustre/ptlrpc/sec.c
    > index 617e004d00f8..90e3b3022106 100644
    > --- a/drivers/staging/lustre/lustre/ptlrpc/sec.c
    > +++ b/drivers/staging/lustre/lustre/ptlrpc/sec.c
    > @@ -554,9 +554,8 @@ int ctx_check_refresh(struct ptlrpc_cli_ctx *ctx)
    > }
    >
    > static
    > -int ctx_refresh_timeout(void *data)
    > +int ctx_refresh_timeout(struct ptlrpc_request *req)
    > {
    > - struct ptlrpc_request *req = data;
    > int rc;
    >
    > /* conn_cnt is needed in expire_one_request */
    > @@ -575,10 +574,8 @@ int ctx_refresh_timeout(void *data)
    > }
    >
    > static
    > -void ctx_refresh_interrupt(void *data)
    > +void ctx_refresh_interrupt(struct ptlrpc_request *req)
    > {
    > - struct ptlrpc_request *req = data;
    > -
    > spin_lock(&req->rq_lock);
    > req->rq_intr = 1;
    > spin_unlock(&req->rq_lock);
    > @@ -611,7 +608,6 @@ int sptlrpc_req_refresh_ctx(struct ptlrpc_request *req, long timeout)
    > {
    > struct ptlrpc_cli_ctx *ctx = req->rq_cli_ctx;
    > struct ptlrpc_sec *sec;
    > - struct l_wait_info lwi;
    > int rc;
    >
    > LASSERT(ctx);
    > @@ -743,10 +739,28 @@ int sptlrpc_req_refresh_ctx(struct ptlrpc_request *req, long timeout)
    > req->rq_restart = 0;
    > spin_unlock(&req->rq_lock);
    >
    > - lwi = LWI_TIMEOUT_INTR(msecs_to_jiffies(timeout * MSEC_PER_SEC),
    > - ctx_refresh_timeout, ctx_refresh_interrupt,
    > - req);
    > - rc = l_wait_event(req->rq_reply_waitq, ctx_check_refresh(ctx), &lwi);
    > + rc = wait_event_idle_timeout(req->rq_reply_waitq,
    > + ctx_check_refresh(ctx),
    > + timeout * HZ);
    > + if (rc == 0 && ctx_refresh_timeout(req) == 0) {
    > + /* Keep waiting, but enable some signals */
    > + rc = l_wait_event_abortable(req->rq_reply_waitq,
    > + ctx_check_refresh(ctx));
    > + if (rc == 0)
    > + rc = 1;
    > + }
    > +
    > + if (rc > 0)
    > + /* condition is true */
    > + rc = 0;
    > + else if (rc == 0)
    > + /* Timed out */
    > + rc = -ETIMEDOUT;
    > + else {
    > + /* Aborted by signal */
    > + rc = -EINTR;
    > + ctx_refresh_interrupt(req);
    > + }
    >
    > /*
    > * following cases could lead us here:
    >
    >
    >

    \
     
     \ /
      Last update: 2018-01-18 00:20    [W:5.805 / U:0.112 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site