Whamcloud - gitweb
git://git.whamcloud.com
/
fs
/
lustre-release.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
| inline |
side by side
LU-3467 ptlrpc: initialize request session early
[fs/lustre-release.git]
/
lustre
/
ptlrpc
/
service.c
diff --git
a/lustre/ptlrpc/service.c
b/lustre/ptlrpc/service.c
index
a4e887b
..
4d2ce16
100644
(file)
--- 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,22
+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_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);
@@
-2012,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);"
@@
-2071,7
+2082,6
@@
put_conn:
request->rq_arrival_time.tv_sec));
}
-out_req:
ptlrpc_server_finish_active_request(svcpt, request);
RETURN(1);
@@
-2392,11
+2402,11
@@
static int ptlrpc_main(void *arg)
struct ptlrpc_service *svc = svcpt->scp_service;
struct ptlrpc_reply_state *rs;
#ifdef WITH_GROUP_INFO
-
cfs_group_info_t
*ginfo = NULL;
+
struct group_info
*ginfo = NULL;
#endif
-
struct lu_env *env;
-
int counter = 0, rc = 0;
-
ENTRY;
+ struct lu_env *env;
+ int counter = 0, rc = 0;
+ ENTRY;
thread->t_pid = current_pid();
unshare_fs_struct();
@@
-2411,14
+2421,14
@@
static int ptlrpc_main(void *arg)
}
#ifdef WITH_GROUP_INFO
-
ginfo = cfs_
groups_alloc(0);
-
if (!ginfo) {
-
rc = -ENOMEM;
-
goto out;
-
}
+
ginfo =
groups_alloc(0);
+ if (!ginfo) {
+ rc = -ENOMEM;
+ goto out;
+ }
-
cfs_
set_current_groups(ginfo);
-
cfs_
put_group_info(ginfo);
+ set_current_groups(ginfo);
+ put_group_info(ginfo);
#endif
if (svc->srv_ops.so_thr_init != NULL) {