* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, 2012, Whamcloud, Inc.
+ * Copyright (c) 2011, 2012, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#include <lustre_fid.h>
#include <libcfs/list.h>
#include <libcfs/libcfs_hash.h> /* for cfs_hash stuff */
-/* lu_time_global_{init,fini}() */
-#include <lu_time.h>
-
#include <cl_object.h>
#include "cl_internal.h"
static cfs_mem_cache_t *cl_env_kmem;
/** Lock class of cl_object_header::coh_page_guard */
-static cfs_lock_class_key_t cl_page_guard_class;
+static struct lock_class_key cl_page_guard_class;
/** Lock class of cl_object_header::coh_lock_guard */
-static cfs_lock_class_key_t cl_lock_guard_class;
+static struct lock_class_key cl_lock_guard_class;
/** Lock class of cl_object_header::coh_attr_guard */
-static cfs_lock_class_key_t cl_attr_guard_class;
+static struct lock_class_key cl_attr_guard_class;
extern __u32 lu_context_tags_default;
extern __u32 lu_session_tags_default;
ENTRY;
result = lu_object_header_init(&h->coh_lu);
if (result == 0) {
- cfs_spin_lock_init(&h->coh_page_guard);
- cfs_spin_lock_init(&h->coh_lock_guard);
- cfs_spin_lock_init(&h->coh_attr_guard);
- cfs_lockdep_set_class(&h->coh_attr_guard, &cl_page_guard_class);
- cfs_lockdep_set_class(&h->coh_attr_guard, &cl_lock_guard_class);
- cfs_lockdep_set_class(&h->coh_attr_guard, &cl_attr_guard_class);
+ spin_lock_init(&h->coh_page_guard);
+ spin_lock_init(&h->coh_lock_guard);
+ spin_lock_init(&h->coh_attr_guard);
+ lockdep_set_class(&h->coh_page_guard, &cl_page_guard_class);
+ lockdep_set_class(&h->coh_lock_guard, &cl_lock_guard_class);
+ lockdep_set_class(&h->coh_attr_guard, &cl_attr_guard_class);
h->coh_pages = 0;
/* XXX hard coded GFP_* mask. */
INIT_RADIX_TREE(&h->coh_tree, GFP_ATOMIC);
*
* \see cl_attr, cl_object_attr_lock(), cl_object_operations::coo_attr_get().
*/
-static cfs_spinlock_t *cl_object_attr_guard(struct cl_object *o)
+static spinlock_t *cl_object_attr_guard(struct cl_object *o)
{
- return &cl_object_header(cl_object_top(o))->coh_attr_guard;
+ return &cl_object_header(cl_object_top(o))->coh_attr_guard;
}
/**
*/
void cl_object_attr_lock(struct cl_object *o)
{
- cfs_spin_lock(cl_object_attr_guard(o));
+ spin_lock(cl_object_attr_guard(o));
}
EXPORT_SYMBOL(cl_object_attr_lock);
*/
void cl_object_attr_unlock(struct cl_object *o)
{
- cfs_spin_unlock(cl_object_attr_guard(o));
+ spin_unlock(cl_object_attr_guard(o));
}
EXPORT_SYMBOL(cl_object_attr_unlock);
LASSERT(hdr->coh_tree.rnode == NULL);
LASSERT(hdr->coh_pages == 0);
- cfs_set_bit(LU_OBJECT_HEARD_BANSHEE, &hdr->coh_lu.loh_flags);
+ set_bit(LU_OBJECT_HEARD_BANSHEE, &hdr->coh_lu.loh_flags);
/*
* Destroy all locks. Object destruction (including cl_inode_fini())
* cannot cancel the locks, because in the case of a local client,
*/
int cl_object_has_locks(struct cl_object *obj)
{
- struct cl_object_header *head = cl_object_header(obj);
- int has;
+ struct cl_object_header *head = cl_object_header(obj);
+ int has;
- cfs_spin_lock(&head->coh_lock_guard);
- has = cfs_list_empty(&head->coh_locks);
- cfs_spin_unlock(&head->coh_lock_guard);
+ spin_lock(&head->coh_lock_guard);
+ has = cfs_list_empty(&head->coh_locks);
+ spin_unlock(&head->coh_lock_guard);
- return (has == 0);
+ return (has == 0);
}
EXPORT_SYMBOL(cl_object_has_locks);
void cache_stats_init(struct cache_stats *cs, const char *name)
{
+ int i;
+
cs->cs_name = name;
- cfs_atomic_set(&cs->cs_lookup, 0);
- cfs_atomic_set(&cs->cs_hit, 0);
- cfs_atomic_set(&cs->cs_total, 0);
- cfs_atomic_set(&cs->cs_busy, 0);
+ for (i = 0; i < CS_NR; i++)
+ cfs_atomic_set(&cs->cs_stats[i], 0);
}
int cache_stats_print(const struct cache_stats *cs,
char *page, int count, int h)
{
- int nob = 0;
-/*
- lookup hit total cached create
- env: ...... ...... ...... ...... ......
-*/
- if (h)
- nob += snprintf(page, count,
- " lookup hit total busy create\n");
-
- nob += snprintf(page + nob, count - nob,
- "%5.5s: %6u %6u %6u %6u %6u",
- cs->cs_name,
- cfs_atomic_read(&cs->cs_lookup),
- cfs_atomic_read(&cs->cs_hit),
- cfs_atomic_read(&cs->cs_total),
- cfs_atomic_read(&cs->cs_busy),
- cfs_atomic_read(&cs->cs_created));
- return nob;
+ int nob = 0;
+ int i;
+ /*
+ * lookup hit total cached create
+ * env: ...... ...... ...... ...... ......
+ */
+ if (h) {
+ const char *names[CS_NR] = CS_NAMES;
+
+ nob += snprintf(page + nob, count - nob, "%6s", " ");
+ for (i = 0; i < CS_NR; i++)
+ nob += snprintf(page + nob, count - nob,
+ "%8s", names[i]);
+ nob += snprintf(page + nob, count - nob, "\n");
+ }
+
+ nob += snprintf(page + nob, count - nob, "%5.5s:", cs->cs_name);
+ for (i = 0; i < CS_NR; i++)
+ nob += snprintf(page + nob, count - nob, "%8u",
+ cfs_atomic_read(&cs->cs_stats[i]));
+ return nob;
}
/**
static struct cache_stats cl_env_stats = {
.cs_name = "envs",
- .cs_created = CFS_ATOMIC_INIT(0),
- .cs_lookup = CFS_ATOMIC_INIT(0),
- .cs_hit = CFS_ATOMIC_INIT(0),
- .cs_total = CFS_ATOMIC_INIT(0),
- .cs_busy = CFS_ATOMIC_INIT(0)
+ .cs_stats = { CFS_ATOMIC_INIT(0), }
};
/**
void *ce_debug;
};
-#define CL_ENV_INC(counter) cfs_atomic_inc(&cl_env_stats.counter)
+#ifdef CONFIG_DEBUG_PAGESTATE_TRACKING
+#define CL_ENV_INC(counter) cfs_atomic_inc(&cl_env_stats.cs_stats[CS_##counter])
-#define CL_ENV_DEC(counter) \
- do { \
- LASSERT(cfs_atomic_read(&cl_env_stats.counter) > 0); \
- cfs_atomic_dec(&cl_env_stats.counter); \
- } while (0)
+#define CL_ENV_DEC(counter) do { \
+ LASSERT(cfs_atomic_read(&cl_env_stats.cs_stats[CS_##counter]) > 0); \
+ cfs_atomic_dec(&cl_env_stats.cs_stats[CS_##counter]); \
+} while (0)
+#else
+#define CL_ENV_INC(counter)
+#define CL_ENV_DEC(counter)
+#endif
static void cl_env_init0(struct cl_env *cle, void *debug)
{
cle->ce_ref = 1;
cle->ce_debug = debug;
- CL_ENV_INC(cs_busy);
+ CL_ENV_INC(busy);
}
OBD_SLAB_FREE_PTR(cle, cl_env_kmem);
env = ERR_PTR(rc);
} else {
- CL_ENV_INC(cs_created);
- CL_ENV_INC(cs_total);
+ CL_ENV_INC(create);
+ CL_ENV_INC(total);
}
} else
env = ERR_PTR(-ENOMEM);
static void cl_env_fini(struct cl_env *cle)
{
- CL_ENV_DEC(cs_total);
+ CL_ENV_DEC(total);
lu_context_fini(&cle->ce_lu.le_ctx);
lu_context_fini(&cle->ce_ses);
OBD_SLAB_FREE_PTR(cle, cl_env_kmem);
static struct lu_env *cl_env_obtain(void *debug)
{
- struct cl_env *cle;
- struct lu_env *env;
+ struct cl_env *cle;
+ struct lu_env *env;
- ENTRY;
- cfs_spin_lock(&cl_envs_guard);
- LASSERT(equi(cl_envs_cached_nr == 0, cfs_list_empty(&cl_envs)));
- if (cl_envs_cached_nr > 0) {
- int rc;
+ ENTRY;
+ spin_lock(&cl_envs_guard);
+ LASSERT(equi(cl_envs_cached_nr == 0, cfs_list_empty(&cl_envs)));
+ if (cl_envs_cached_nr > 0) {
+ int rc;
- cle = container_of(cl_envs.next, struct cl_env, ce_linkage);
- cfs_list_del_init(&cle->ce_linkage);
- cl_envs_cached_nr--;
- cfs_spin_unlock(&cl_envs_guard);
+ cle = container_of(cl_envs.next, struct cl_env, ce_linkage);
+ cfs_list_del_init(&cle->ce_linkage);
+ cl_envs_cached_nr--;
+ spin_unlock(&cl_envs_guard);
env = &cle->ce_lu;
rc = lu_env_refill(env);
env = ERR_PTR(rc);
}
} else {
- cfs_spin_unlock(&cl_envs_guard);
- env = cl_env_new(lu_context_tags_default,
- lu_session_tags_default, debug);
- }
- RETURN(env);
+ spin_unlock(&cl_envs_guard);
+ env = cl_env_new(lu_context_tags_default,
+ lu_session_tags_default, debug);
+ }
+ RETURN(env);
}
static inline struct cl_env *cl_env_container(struct lu_env *env)
struct lu_env *env;
struct cl_env *cle;
- CL_ENV_INC(cs_lookup);
+ CL_ENV_INC(lookup);
/* check that we don't go far from untrusted pointer */
CLASSERT(offsetof(struct cl_env, ce_magic) == 0);
env = NULL;
cle = cl_env_fetch();
if (cle != NULL) {
- CL_ENV_INC(cs_hit);
+ CL_ENV_INC(hit);
env = &cle->ce_lu;
*refcheck = ++cle->ce_ref;
}
*/
unsigned cl_env_cache_purge(unsigned nr)
{
- struct cl_env *cle;
-
- ENTRY;
- cfs_spin_lock(&cl_envs_guard);
- for (; !cfs_list_empty(&cl_envs) && nr > 0; --nr) {
- cle = container_of(cl_envs.next, struct cl_env, ce_linkage);
- cfs_list_del_init(&cle->ce_linkage);
- LASSERT(cl_envs_cached_nr > 0);
- cl_envs_cached_nr--;
- cfs_spin_unlock(&cl_envs_guard);
-
- cl_env_fini(cle);
- cfs_spin_lock(&cl_envs_guard);
- }
- LASSERT(equi(cl_envs_cached_nr == 0, cfs_list_empty(&cl_envs)));
- cfs_spin_unlock(&cl_envs_guard);
- RETURN(nr);
+ struct cl_env *cle;
+
+ ENTRY;
+ spin_lock(&cl_envs_guard);
+ for (; !cfs_list_empty(&cl_envs) && nr > 0; --nr) {
+ cle = container_of(cl_envs.next, struct cl_env, ce_linkage);
+ cfs_list_del_init(&cle->ce_linkage);
+ LASSERT(cl_envs_cached_nr > 0);
+ cl_envs_cached_nr--;
+ spin_unlock(&cl_envs_guard);
+
+ cl_env_fini(cle);
+ spin_lock(&cl_envs_guard);
+ }
+ LASSERT(equi(cl_envs_cached_nr == 0, cfs_list_empty(&cl_envs)));
+ spin_unlock(&cl_envs_guard);
+ RETURN(nr);
}
EXPORT_SYMBOL(cl_env_cache_purge);
CDEBUG(D_OTHER, "%d@%p\n", cle->ce_ref, cle);
if (--cle->ce_ref == 0) {
- CL_ENV_DEC(cs_busy);
+ CL_ENV_DEC(busy);
cl_env_detach(cle);
cle->ce_debug = NULL;
cl_env_exit(cle);
if (cl_envs_cached_nr < cl_envs_cached_max &&
(env->le_ctx.lc_tags & ~LCT_HAS_EXIT) == LCT_CL_THREAD &&
(env->le_ses->lc_tags & ~LCT_HAS_EXIT) == LCT_SESSION) {
- cfs_spin_lock(&cl_envs_guard);
- cfs_list_add(&cle->ce_linkage, &cl_envs);
- cl_envs_cached_nr++;
- cfs_spin_unlock(&cl_envs_guard);
- } else
- cl_env_fini(cle);
- }
+ spin_lock(&cl_envs_guard);
+ cfs_list_add(&cle->ce_linkage, &cl_envs);
+ cl_envs_cached_nr++;
+ spin_unlock(&cl_envs_guard);
+ } else
+ cl_env_fini(cle);
+ }
}
EXPORT_SYMBOL(cl_env_put);