This fix improves the stop of ptlrpcd threads so that
it occurs in parallel. On machines with a large number
of cores this significantly reduce the time of unload of
ptlrpc module.
Signed-off-by: Gregoire Pichon <gregoire.pichon@bull.net>
Change-Id: I744de5d9887bfaa4c7a742d34923680e3a536ee7
Reviewed-on: http://review.whamcloud.com/5039
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Faccini Bruno <bruno.faccini@intel.com>
Reviewed-by: Niu Yawei <yawei.niu@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
/* ptlrpc/ptlrpcd.c */
void ptlrpcd_stop(struct ptlrpcd_ctl *pc, int force);
/* ptlrpc/ptlrpcd.c */
void ptlrpcd_stop(struct ptlrpcd_ctl *pc, int force);
+void ptlrpcd_free(struct ptlrpcd_ctl *pc);
void ptlrpcd_wake(struct ptlrpc_request *req);
void ptlrpcd_add_req(struct ptlrpc_request *req, pdl_policy_t policy, int idx);
void ptlrpcd_add_rqset(struct ptlrpc_request_set *set);
void ptlrpcd_wake(struct ptlrpc_request *req);
void ptlrpcd_add_req(struct ptlrpc_request *req, pdl_policy_t policy, int idx);
void ptlrpcd_add_rqset(struct ptlrpc_request_set *set);
ptlrpc_set_wait(set);
lu_context_fini(&env.le_ctx);
ptlrpc_set_wait(set);
lu_context_fini(&env.le_ctx);
- clear_bit(LIOD_START, &pc->pc_flags);
- clear_bit(LIOD_STOP, &pc->pc_flags);
- clear_bit(LIOD_FORCE, &pc->pc_flags);
- clear_bit(LIOD_BIND, &pc->pc_flags);
-
complete(&pc->pc_finishing);
return 0;
complete(&pc->pc_finishing);
return 0;
void ptlrpcd_stop(struct ptlrpcd_ctl *pc, int force)
{
void ptlrpcd_stop(struct ptlrpcd_ctl *pc, int force)
{
- struct ptlrpc_request_set *set = pc->pc_set;
- ENTRY;
if (!test_bit(LIOD_START, &pc->pc_flags)) {
if (!test_bit(LIOD_START, &pc->pc_flags)) {
- CWARN("Thread for pc %p was not started\n", pc);
- goto out;
- }
+ CWARN("Thread for pc %p was not started\n", pc);
+ goto out;
+ }
set_bit(LIOD_STOP, &pc->pc_flags);
if (force)
set_bit(LIOD_FORCE, &pc->pc_flags);
cfs_waitq_signal(&pc->pc_set->set_waitq);
set_bit(LIOD_STOP, &pc->pc_flags);
if (force)
set_bit(LIOD_FORCE, &pc->pc_flags);
cfs_waitq_signal(&pc->pc_set->set_waitq);
+
+out:
+ EXIT;
+}
+
+void ptlrpcd_free(struct ptlrpcd_ctl *pc)
+{
+ struct ptlrpc_request_set *set = pc->pc_set;
+ ENTRY;
+
+ if (!test_bit(LIOD_START, &pc->pc_flags)) {
+ CWARN("Thread for pc %p was not started\n", pc);
+ goto out;
+ }
+
#ifdef __KERNEL__
wait_for_completion(&pc->pc_finishing);
#else
#ifdef __KERNEL__
wait_for_completion(&pc->pc_finishing);
#else
spin_unlock(&pc->pc_lock);
ptlrpc_set_destroy(set);
spin_unlock(&pc->pc_lock);
ptlrpc_set_destroy(set);
+ clear_bit(LIOD_START, &pc->pc_flags);
+ clear_bit(LIOD_STOP, &pc->pc_flags);
+ clear_bit(LIOD_FORCE, &pc->pc_flags);
+ clear_bit(LIOD_BIND, &pc->pc_flags);
+
out:
#ifdef __KERNEL__
if (pc->pc_npartners > 0) {
out:
#ifdef __KERNEL__
if (pc->pc_npartners > 0) {
static void ptlrpcd_fini(void)
{
static void ptlrpcd_fini(void)
{
- if (ptlrpcds != NULL) {
- for (i = 0; i < ptlrpcds->pd_nthreads; i++)
- ptlrpcd_stop(&ptlrpcds->pd_threads[i], 0);
- ptlrpcd_stop(&ptlrpcds->pd_thread_rcv, 0);
- OBD_FREE(ptlrpcds, ptlrpcds->pd_size);
- ptlrpcds = NULL;
- }
+ if (ptlrpcds != NULL) {
+ for (i = 0; i < ptlrpcds->pd_nthreads; i++)
+ ptlrpcd_stop(&ptlrpcds->pd_threads[i], 0);
+ for (i = 0; i < ptlrpcds->pd_nthreads; i++)
+ ptlrpcd_free(&ptlrpcds->pd_threads[i]);
+ ptlrpcd_stop(&ptlrpcds->pd_thread_rcv, 0);
+ ptlrpcd_free(&ptlrpcds->pd_thread_rcv);
+ OBD_FREE(ptlrpcds, ptlrpcds->pd_size);
+ ptlrpcds = NULL;
+ }
}
static int ptlrpcd_init(void)
}
static int ptlrpcd_init(void)
if (rc != 0 && ptlrpcds != NULL) {
for (j = 0; j <= i; j++)
ptlrpcd_stop(&ptlrpcds->pd_threads[j], 0);
if (rc != 0 && ptlrpcds != NULL) {
for (j = 0; j <= i; j++)
ptlrpcd_stop(&ptlrpcds->pd_threads[j], 0);
- ptlrpcd_stop(&ptlrpcds->pd_thread_rcv, 0);
+ for (j = 0; j <= i; j++)
+ ptlrpcd_free(&ptlrpcds->pd_threads[j]);
+ ptlrpcd_stop(&ptlrpcds->pd_thread_rcv, 0);
+ ptlrpcd_free(&ptlrpcds->pd_thread_rcv);
OBD_FREE(ptlrpcds, size);
ptlrpcds = NULL;
}
OBD_FREE(ptlrpcds, size);
ptlrpcds = NULL;
}
* for processing now.
*/
ptlrpcd_stop(&lcm->lcm_pc, force);
* for processing now.
*/
ptlrpcd_stop(&lcm->lcm_pc, force);
+ ptlrpcd_free(&lcm->lcm_pc);
/*
* By this point no alive inflight llcds should be left. Only
/*
* By this point no alive inflight llcds should be left. Only