From: Dmitry Zogin Date: Mon, 25 Jan 2010 05:15:53 +0000 (-0500) Subject: b=21828 drop number of active requests when queued for recovery X-Git-Tag: 1.10.0.36~26 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=4463d3a15f9551ff6b1cafb9336dd5c929e1e2c2 b=21828 drop number of active requests when queued for recovery Now that we take a reference on the original request instead of making a copy of it for recovery. We need to drop the number of active requests or the queued requests will prevent all request processing when they exceed (srv->srv_threads_running - 1). i=nathaniel.ruthman i=tappro --- diff --git a/lustre/include/lustre_net.h b/lustre/include/lustre_net.h index dbb4a9f..a1fd22e 100644 --- a/lustre/include/lustre_net.h +++ b/lustre/include/lustre_net.h @@ -1078,6 +1078,8 @@ int liblustre_check_services (void *arg); void ptlrpc_daemonize(char *name); int ptlrpc_service_health_check(struct ptlrpc_service *); void ptlrpc_hpreq_reorder(struct ptlrpc_request *req); +void ptlrpc_server_active_request_inc(struct ptlrpc_request *req); +void ptlrpc_server_active_request_dec(struct ptlrpc_request *req); void ptlrpc_server_drop_request(struct ptlrpc_request *req); #ifdef __KERNEL__ diff --git a/lustre/ldlm/ldlm_lib.c b/lustre/ldlm/ldlm_lib.c index 350f3a9..a722ff2 100644 --- a/lustre/ldlm/ldlm_lib.c +++ b/lustre/ldlm/ldlm_lib.c @@ -1116,6 +1116,10 @@ static void target_request_copy_get(struct ptlrpc_request *req) cfs_atomic_inc(&req->rq_refcount); /** let export know it has replays to be handled */ cfs_atomic_inc(&req->rq_export->exp_replay_count); + /* release service thread while request is queued + * we are moving the request from active processing + * to waiting on the replay queue */ + ptlrpc_server_active_request_dec(req); } static void target_request_copy_put(struct ptlrpc_request *req) @@ -1124,6 +1128,8 @@ static void target_request_copy_put(struct ptlrpc_request *req) LASSERT(cfs_atomic_read(&req->rq_export->exp_replay_count) > 0); cfs_atomic_dec(&req->rq_export->exp_replay_count); class_export_rpc_put(req->rq_export); + /* ptlrpc_server_drop_request() assumes the request is active */ + ptlrpc_server_active_request_inc(req); ptlrpc_server_drop_request(req); } diff --git a/lustre/ptlrpc/service.c b/lustre/ptlrpc/service.c index a38c511..73aff1b 100644 --- a/lustre/ptlrpc/service.c +++ b/lustre/ptlrpc/service.c @@ -599,6 +599,32 @@ static void ptlrpc_server_free_request(struct ptlrpc_request *req) } /** + * increment the number of active requests consuming service threads. + */ +void ptlrpc_server_active_request_inc(struct ptlrpc_request *req) +{ + struct ptlrpc_request_buffer_desc *rqbd = req->rq_rqbd; + struct ptlrpc_service *svc = rqbd->rqbd_service; + + cfs_spin_lock(&svc->srv_lock); + svc->srv_n_active_reqs++; + cfs_spin_unlock(&svc->srv_lock); +} + +/** + * decrement the number of active requests consuming service threads. + */ +void ptlrpc_server_active_request_dec(struct ptlrpc_request *req) +{ + struct ptlrpc_request_buffer_desc *rqbd = req->rq_rqbd; + struct ptlrpc_service *svc = rqbd->rqbd_service; + + cfs_spin_lock(&svc->srv_lock); + svc->srv_n_active_reqs--; + cfs_spin_unlock(&svc->srv_lock); +} + +/** * drop a reference count of the request. if it reaches 0, we either * put it into history list, or free it immediately. */