From f62f01b12542ee7c0cf25ad83635ee3e9a33e762 Mon Sep 17 00:00:00 2001 From: Mikhail Pershin Date: Fri, 16 Aug 2013 09:10:33 +0400 Subject: [PATCH] LU-3467 ptlrpc: initialize request session early Initialize request session early to make it available in high-priority handlers Signed-off-by: Mikhail Pershin Change-Id: Ic4f5967d3ba8e723bf90accf20742cb4c6bc801c Reviewed-on: http://review.whamcloud.com/7350 Reviewed-by: Alex Zhuravlev Tested-by: Jenkins Reviewed-by: Fan Yong Reviewed-by: Andreas Dilger Tested-by: Maloo --- lustre/ptlrpc/service.c | 77 +++++++++++++++++++++++++++---------------------- 1 file changed, 43 insertions(+), 34 deletions(-) diff --git a/lustre/ptlrpc/service.c b/lustre/ptlrpc/service.c index 15e4802..4d2ce16 100644 --- a/lustre/ptlrpc/service.c +++ b/lustre/ptlrpc/service.c @@ -1022,6 +1022,11 @@ static void ptlrpc_server_finish_request(struct ptlrpc_service_part *svcpt, { ptlrpc_server_hpreq_fini(req); + if (req->rq_session.lc_thread != NULL) { + lu_context_exit(&req->rq_session); + lu_context_fini(&req->rq_session); + } + ptlrpc_server_drop_request(req); } @@ -1898,11 +1903,25 @@ ptlrpc_server_handle_req_in(struct ptlrpc_service_part *svcpt, goto err_req; } - req->rq_svc_thread = thread; + req->rq_svc_thread = thread; + if (thread != NULL) { + /* initialize request session, it is needed for request + * processing by target */ + rc = lu_context_init(&req->rq_session, LCT_SERVER_SESSION | + LCT_NOREF); + if (rc) { + CERROR("%s: failure to initialize session: rc = %d\n", + thread->t_name, rc); + goto err_req; + } + req->rq_session.lc_thread = thread; + lu_context_enter(&req->rq_session); + req->rq_svc_thread->t_env->le_ses = &req->rq_session; + } - ptlrpc_at_add_timed(req); + ptlrpc_at_add_timed(req); - /* Move it over to the request processing queue */ + /* Move it over to the request processing queue */ rc = ptlrpc_server_request_add(svcpt, req); if (rc) GOTO(err_req, rc); @@ -1924,14 +1943,14 @@ static int ptlrpc_server_handle_request(struct ptlrpc_service_part *svcpt, struct ptlrpc_thread *thread) { - struct ptlrpc_service *svc = svcpt->scp_service; - struct ptlrpc_request *request; - struct timeval work_start; - struct timeval work_end; - long timediff; - int rc; - int fail_opc = 0; - ENTRY; + struct ptlrpc_service *svc = svcpt->scp_service; + struct ptlrpc_request *request; + struct timeval work_start; + struct timeval work_end; + long timediff; + int fail_opc = 0; + + ENTRY; request = ptlrpc_server_request_get(svcpt, false); if (request == NULL) @@ -1965,23 +1984,7 @@ ptlrpc_server_handle_request(struct ptlrpc_service_part *svcpt, at_get(&svcpt->scp_at_estimate)); } - rc = lu_context_init(&request->rq_session, LCT_SERVER_SESSION | - LCT_NOREF); - if (rc) { - CERROR("Failure to initialize session: %d\n", rc); - goto out_req; - } - request->rq_session.lc_thread = thread; - request->rq_session.lc_cookie = 0x5; - lu_context_enter(&request->rq_session); - - CDEBUG(D_NET, "got req "LPU64"\n", request->rq_xid); - - request->rq_svc_thread = thread; - if (thread) - request->rq_svc_thread->t_env->le_ses = &request->rq_session; - - if (likely(request->rq_export)) { + if (likely(request->rq_export)) { if (unlikely(ptlrpc_check_req(request))) goto put_conn; ptlrpc_update_export_timer(request->rq_export, timediff >> 19); @@ -2013,14 +2016,21 @@ ptlrpc_server_handle_request(struct ptlrpc_service_part *svcpt, if (lustre_msg_get_opc(request->rq_reqmsg) != OBD_PING) CFS_FAIL_TIMEOUT_MS(OBD_FAIL_PTLRPC_PAUSE_REQ, cfs_fail_val); - rc = svc->srv_ops.so_req_handler(request); + CDEBUG(D_NET, "got req "LPU64"\n", request->rq_xid); + + /* re-assign request and sesson thread to the current one */ + request->rq_svc_thread = thread; + if (thread != NULL) { + LASSERT(request->rq_session.lc_thread != NULL); + request->rq_session.lc_thread = thread; + request->rq_session.lc_cookie = 0x55; + thread->t_env->le_ses = &request->rq_session; + } + svc->srv_ops.so_req_handler(request); - ptlrpc_rqphase_move(request, RQ_PHASE_COMPLETE); + ptlrpc_rqphase_move(request, RQ_PHASE_COMPLETE); put_conn: - lu_context_exit(&request->rq_session); - lu_context_fini(&request->rq_session); - if (unlikely(cfs_time_current_sec() > request->rq_deadline)) { DEBUG_REQ(D_WARNING, request, "Request took longer " "than estimated ("CFS_DURATION_T":"CFS_DURATION_T"s);" @@ -2072,7 +2082,6 @@ put_conn: request->rq_arrival_time.tv_sec)); } -out_req: ptlrpc_server_finish_active_request(svcpt, request); RETURN(1); -- 1.8.3.1