X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fldlm%2Fldlm_pool.c;h=1f8f82916e997a439ac420617c50c77cbb195c5b;hb=8775fe0a40706b6999aa737fba1c162ce08b8ade;hp=7a88c4de55a3cd9246ad989a4382bb1a83a57356;hpb=f2a9374170e4522b9d2ac3b7096cf2912339d480;p=fs%2Flustre-release.git diff --git a/lustre/ldlm/ldlm_pool.c b/lustre/ldlm/ldlm_pool.c index 7a88c4d..1f8f829 100644 --- a/lustre/ldlm/ldlm_pool.c +++ b/lustre/ldlm/ldlm_pool.c @@ -29,8 +29,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011 Whamcloud, Inc. - * + * Copyright (c) 2011, 2012, Whamcloud, Inc. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -1151,19 +1150,23 @@ static int ldlm_pools_shrink(ldlm_side_t client, int nr, ldlm_namespace_put(ns); } cl_env_reexit(cookie); - return cached; + /* we only decrease the SLV in server pools shrinker, return -1 to + * kernel to avoid needless loop. LU-1128 */ + return (client == LDLM_NAMESPACE_SERVER) ? -1 : cached; } -static int ldlm_pools_srv_shrink(SHRINKER_FIRST_ARG int nr_to_scan, - unsigned int gfp_mask) +static int ldlm_pools_srv_shrink(SHRINKER_ARGS(sc, nr_to_scan, gfp_mask)) { - return ldlm_pools_shrink(LDLM_NAMESPACE_SERVER, nr_to_scan, gfp_mask); + return ldlm_pools_shrink(LDLM_NAMESPACE_SERVER, + shrink_param(sc, nr_to_scan), + shrink_param(sc, gfp_mask)); } -static int ldlm_pools_cli_shrink(SHRINKER_FIRST_ARG int nr_to_scan, - unsigned int gfp_mask) +static int ldlm_pools_cli_shrink(SHRINKER_ARGS(sc, nr_to_scan, gfp_mask)) { - return ldlm_pools_shrink(LDLM_NAMESPACE_CLIENT, nr_to_scan, gfp_mask); + return ldlm_pools_shrink(LDLM_NAMESPACE_CLIENT, + shrink_param(sc, nr_to_scan), + shrink_param(sc, gfp_mask)); } void ldlm_pools_recalc(ldlm_side_t client) @@ -1267,9 +1270,9 @@ void ldlm_pools_recalc(ldlm_side_t client) cfs_spin_lock(&ns->ns_lock); /* * skip ns which is being freed, and we don't want to increase - * its refcount again, not even temporarily. bz21519. + * its refcount again, not even temporarily. bz21519 & LU-499. */ - if (cfs_atomic_read(&ns->ns_bref) == 0) { + if (ns->ns_stopping) { skip = 1; } else { skip = 0; @@ -1298,7 +1301,7 @@ static int ldlm_pools_thread_main(void *arg) ENTRY; cfs_daemonize(t_name); - thread->t_flags = SVC_RUNNING; + thread_set_flags(thread, SVC_RUNNING); cfs_waitq_signal(&thread->t_ctl_waitq); CDEBUG(D_DLMTRACE, "%s: pool thread starting, process %d\n", @@ -1319,19 +1322,18 @@ static int ldlm_pools_thread_main(void *arg) */ lwi = LWI_TIMEOUT(cfs_time_seconds(LDLM_POOLS_THREAD_PERIOD), NULL, NULL); - l_wait_event(thread->t_ctl_waitq, (thread->t_flags & - (SVC_STOPPING|SVC_EVENT)), + l_wait_event(thread->t_ctl_waitq, + thread_is_stopping(thread) || + thread_is_event(thread), &lwi); - if (thread->t_flags & SVC_STOPPING) { - thread->t_flags &= ~SVC_STOPPING; + if (thread_test_and_clear_flags(thread, SVC_STOPPING)) break; - } else if (thread->t_flags & SVC_EVENT) { - thread->t_flags &= ~SVC_EVENT; - } + else + thread_test_and_clear_flags(thread, SVC_EVENT); } - thread->t_flags = SVC_STOPPED; + thread_set_flags(thread, SVC_STOPPED); cfs_waitq_signal(&thread->t_ctl_waitq); CDEBUG(D_DLMTRACE, "%s: pool thread exiting, process %d\n", @@ -1370,7 +1372,7 @@ static int ldlm_pools_thread_start(void) RETURN(rc); } l_wait_event(ldlm_pools_thread->t_ctl_waitq, - (ldlm_pools_thread->t_flags & SVC_RUNNING), &lwi); + thread_is_running(ldlm_pools_thread), &lwi); RETURN(0); } @@ -1383,7 +1385,7 @@ static void ldlm_pools_thread_stop(void) return; } - ldlm_pools_thread->t_flags = SVC_STOPPING; + thread_set_flags(ldlm_pools_thread, SVC_STOPPING); cfs_waitq_signal(&ldlm_pools_thread->t_ctl_waitq); /*