X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fobdclass%2Fcl_object.c;h=d94ef6d89a7db776f2d769f140aec947740fa0f8;hb=refs%2Fchanges%2F97%2F11497%2F2;hp=78bc76ce376d2b7e436a6a64e7f9e06f6e18b6de;hpb=110d8d4952a9de607cf21f648d75e0b05ef0cee1;p=fs%2Flustre-release.git diff --git a/lustre/obdclass/cl_object.c b/lustre/obdclass/cl_object.c index 78bc76c..d94ef6d8 100644 --- a/lustre/obdclass/cl_object.c +++ b/lustre/obdclass/cl_object.c @@ -75,19 +75,19 @@ extern __u32 lu_session_tags_default; */ int cl_object_header_init(struct cl_object_header *h) { - int result; + int result; - ENTRY; - result = lu_object_header_init(&h->coh_lu); - if (result == 0) { + ENTRY; + result = lu_object_header_init(&h->coh_lu); + if (result == 0) { spin_lock_init(&h->coh_lock_guard); spin_lock_init(&h->coh_attr_guard); lockdep_set_class(&h->coh_lock_guard, &cl_lock_guard_class); lockdep_set_class(&h->coh_attr_guard, &cl_attr_guard_class); - CFS_INIT_LIST_HEAD(&h->coh_locks); - h->coh_page_bufsize = ALIGN(sizeof(struct cl_page), 8); - } - RETURN(result); + INIT_LIST_HEAD(&h->coh_locks); + h->coh_page_bufsize = 0; + } + RETURN(result); } EXPORT_SYMBOL(cl_object_header_init); @@ -96,7 +96,7 @@ EXPORT_SYMBOL(cl_object_header_init); */ void cl_object_header_fini(struct cl_object_header *h) { - LASSERT(cfs_list_empty(&h->coh_locks)); + LASSERT(list_empty(&h->coh_locks)); lu_object_header_fini(&h->coh_lu); } EXPORT_SYMBOL(cl_object_header_fini); @@ -149,7 +149,7 @@ EXPORT_SYMBOL(cl_object_get); /** * Returns the top-object for a given \a o. * - * \see cl_page_top(), cl_io_top() + * \see cl_io_top() */ struct cl_object *cl_object_top(struct cl_object *o) { @@ -187,6 +187,7 @@ static spinlock_t *cl_object_attr_guard(struct cl_object *o) * cl_object_attr_get(), cl_object_attr_set(). */ void cl_object_attr_lock(struct cl_object *o) +__acquires(cl_object_attr_guard(o)) { spin_lock(cl_object_attr_guard(o)); } @@ -196,6 +197,7 @@ EXPORT_SYMBOL(cl_object_attr_lock); * Releases data-attributes lock, acquired by cl_object_attr_lock(). */ void cl_object_attr_unlock(struct cl_object *o) +__releases(cl_object_attr_guard(o)) { spin_unlock(cl_object_attr_guard(o)); } @@ -214,12 +216,12 @@ int cl_object_attr_get(const struct lu_env *env, struct cl_object *obj, struct lu_object_header *top; int result; - LASSERT(spin_is_locked(cl_object_attr_guard(obj))); + assert_spin_locked(cl_object_attr_guard(obj)); ENTRY; top = obj->co_lu.lo_header; result = 0; - cfs_list_for_each_entry(obj, &top->loh_layers, co_lu.lo_linkage) { + list_for_each_entry(obj, &top->loh_layers, co_lu.lo_linkage) { if (obj->co_ops->coo_attr_get != NULL) { result = obj->co_ops->coo_attr_get(env, obj, attr); if (result != 0) { @@ -246,23 +248,22 @@ int cl_object_attr_set(const struct lu_env *env, struct cl_object *obj, struct lu_object_header *top; int result; - LASSERT(spin_is_locked(cl_object_attr_guard(obj))); + assert_spin_locked(cl_object_attr_guard(obj)); ENTRY; - top = obj->co_lu.lo_header; - result = 0; - cfs_list_for_each_entry_reverse(obj, &top->loh_layers, - co_lu.lo_linkage) { - if (obj->co_ops->coo_attr_set != NULL) { - result = obj->co_ops->coo_attr_set(env, obj, attr, v); - if (result != 0) { - if (result > 0) - result = 0; - break; - } - } - } - RETURN(result); + top = obj->co_lu.lo_header; + result = 0; + list_for_each_entry_reverse(obj, &top->loh_layers, co_lu.lo_linkage) { + if (obj->co_ops->coo_attr_set != NULL) { + result = obj->co_ops->coo_attr_set(env, obj, attr, v); + if (result != 0) { + if (result > 0) + result = 0; + break; + } + } + } + RETURN(result); } EXPORT_SYMBOL(cl_object_attr_set); @@ -283,8 +284,7 @@ int cl_object_glimpse(const struct lu_env *env, struct cl_object *obj, ENTRY; top = obj->co_lu.lo_header; result = 0; - cfs_list_for_each_entry_reverse(obj, &top->loh_layers, - co_lu.lo_linkage) { + list_for_each_entry_reverse(obj, &top->loh_layers, co_lu.lo_linkage) { if (obj->co_ops->coo_glimpse != NULL) { result = obj->co_ops->coo_glimpse(env, obj, lvb); if (result != 0) @@ -312,7 +312,7 @@ int cl_conf_set(const struct lu_env *env, struct cl_object *obj, ENTRY; top = obj->co_lu.lo_header; result = 0; - cfs_list_for_each_entry(obj, &top->loh_layers, co_lu.lo_linkage) { + list_for_each_entry(obj, &top->loh_layers, co_lu.lo_linkage) { if (obj->co_ops->coo_conf_set != NULL) { result = obj->co_ops->coo_conf_set(env, obj, conf); if (result != 0) @@ -335,7 +335,7 @@ void cl_object_prune(const struct lu_env *env, struct cl_object *obj) top = obj->co_lu.lo_header; result = 0; - cfs_list_for_each_entry(o, &top->loh_layers, co_lu.lo_linkage) { + list_for_each_entry(o, &top->loh_layers, co_lu.lo_linkage) { if (o->co_ops->coo_prune != NULL) { result = o->co_ops->coo_prune(env, o); if (result != 0) @@ -384,7 +384,7 @@ int cl_object_has_locks(struct cl_object *obj) int has; spin_lock(&head->coh_lock_guard); - has = cfs_list_empty(&head->coh_locks); + has = list_empty(&head->coh_locks); spin_unlock(&head->coh_lock_guard); return (has == 0); @@ -397,14 +397,13 @@ void cache_stats_init(struct cache_stats *cs, const char *name) cs->cs_name = name; for (i = 0; i < CS_NR; i++) - cfs_atomic_set(&cs->cs_stats[i], 0); + atomic_set(&cs->cs_stats[i], 0); } -int cache_stats_print(const struct cache_stats *cs, - char *page, int count, int h) +int cache_stats_print(const struct cache_stats *cs, struct seq_file *m, int h) { - int nob = 0; int i; + /* * lookup hit total cached create * env: ...... ...... ...... ...... ...... @@ -412,18 +411,16 @@ int cache_stats_print(const struct cache_stats *cs, if (h) { const char *names[CS_NR] = CS_NAMES; - nob += snprintf(page + nob, count - nob, "%6s", " "); + seq_printf(m, "%6s", " "); for (i = 0; i < CS_NR; i++) - nob += snprintf(page + nob, count - nob, - "%8s", names[i]); - nob += snprintf(page + nob, count - nob, "\n"); + seq_printf(m, "%8s", names[i]); + seq_printf(m, "\n"); } - nob += snprintf(page + nob, count - nob, "%5.5s:", cs->cs_name); + seq_printf(m, "%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; + seq_printf(m, "%8u", atomic_read(&cs->cs_stats[i])); + return 0; } static void cl_env_percpu_refill(void); @@ -444,9 +441,9 @@ int cl_site_init(struct cl_site *s, struct cl_device *d) cache_stats_init(&s->cs_pages, "pages"); cache_stats_init(&s->cs_locks, "locks"); for (i = 0; i < ARRAY_SIZE(s->cs_pages_state); ++i) - cfs_atomic_set(&s->cs_pages_state[0], 0); + atomic_set(&s->cs_pages_state[0], 0); for (i = 0; i < ARRAY_SIZE(s->cs_locks_state); ++i) - cfs_atomic_set(&s->cs_locks_state[i], 0); + atomic_set(&s->cs_locks_state[i], 0); cl_env_percpu_refill(); } return result; @@ -464,57 +461,55 @@ EXPORT_SYMBOL(cl_site_fini); static struct cache_stats cl_env_stats = { .cs_name = "envs", - .cs_stats = { CFS_ATOMIC_INIT(0), } + .cs_stats = { ATOMIC_INIT(0), } }; /** * Outputs client site statistical counters into a buffer. Suitable for * ll_rd_*()-style functions. */ -int cl_site_stats_print(const struct cl_site *site, char *page, int count) -{ - int nob; - int i; - static const char *pstate[] = { - [CPS_CACHED] = "c", - [CPS_OWNED] = "o", - [CPS_PAGEOUT] = "w", - [CPS_PAGEIN] = "r", - [CPS_FREEING] = "f" - }; - static const char *lstate[] = { - [CLS_NEW] = "n", - [CLS_QUEUING] = "q", - [CLS_ENQUEUED] = "e", - [CLS_HELD] = "h", - [CLS_INTRANSIT] = "t", - [CLS_CACHED] = "c", - [CLS_FREEING] = "f" - }; +int cl_site_stats_print(const struct cl_site *site, struct seq_file *m) +{ + static const char *pstate[] = { + [CPS_CACHED] = "c", + [CPS_OWNED] = "o", + [CPS_PAGEOUT] = "w", + [CPS_PAGEIN] = "r", + [CPS_FREEING] = "f" + }; + static const char *lstate[] = { + [CLS_NEW] = "n", + [CLS_QUEUING] = "q", + [CLS_ENQUEUED] = "e", + [CLS_HELD] = "h", + [CLS_INTRANSIT] = "t", + [CLS_CACHED] = "c", + [CLS_FREEING] = "f" + }; + int i; + /* lookup hit total busy create pages: ...... ...... ...... ...... ...... [...... ...... ...... ......] locks: ...... ...... ...... ...... ...... [...... ...... ...... ...... ......] env: ...... ...... ...... ...... ...... */ - nob = lu_site_stats_print(&site->cs_lu, page, count); - nob += cache_stats_print(&site->cs_pages, page + nob, count - nob, 1); - nob += snprintf(page + nob, count - nob, " ["); - for (i = 0; i < ARRAY_SIZE(site->cs_pages_state); ++i) - nob += snprintf(page + nob, count - nob, "%s: %u ", - pstate[i], - cfs_atomic_read(&site->cs_pages_state[i])); - nob += snprintf(page + nob, count - nob, "]\n"); - nob += cache_stats_print(&site->cs_locks, page + nob, count - nob, 0); - nob += snprintf(page + nob, count - nob, " ["); - for (i = 0; i < ARRAY_SIZE(site->cs_locks_state); ++i) - nob += snprintf(page + nob, count - nob, "%s: %u ", - lstate[i], - cfs_atomic_read(&site->cs_locks_state[i])); - nob += snprintf(page + nob, count - nob, "]\n"); - nob += cache_stats_print(&cl_env_stats, page + nob, count - nob, 0); - nob += snprintf(page + nob, count - nob, "\n"); - return nob; + lu_site_stats_seq_print(&site->cs_lu, m); + cache_stats_print(&site->cs_pages, m, 1); + seq_printf(m, " ["); + for (i = 0; i < ARRAY_SIZE(site->cs_pages_state); ++i) + seq_printf(m, "%s: %u ", pstate[i], + atomic_read(&site->cs_pages_state[i])); + seq_printf(m, "]\n"); + cache_stats_print(&site->cs_locks, m, 0); + seq_printf(m, " ["); + for (i = 0; i < ARRAY_SIZE(site->cs_locks_state); ++i) + seq_printf(m, "%s: %u ", lstate[i], + atomic_read(&site->cs_locks_state[i])); + seq_printf(m, "]\n"); + cache_stats_print(&cl_env_stats, m, 0); + seq_printf(m, "\n"); + return 0; } EXPORT_SYMBOL(cl_site_stats_print); @@ -542,7 +537,7 @@ EXPORT_SYMBOL(cl_site_stats_print); * bz20044, bz22683. */ -static CFS_LIST_HEAD(cl_envs); +static struct list_head cl_envs; static unsigned cl_envs_cached_nr = 0; static unsigned cl_envs_cached_max = 128; /* XXX: prototype: arbitrary limit * for now. */ @@ -560,7 +555,7 @@ struct cl_env { * This allows cl_env to be entered into cl_env_hash which implements * the current thread -> client environment lookup. */ - cfs_hlist_node_t ce_node; + struct hlist_node ce_node; #endif /** * Owner for the current cl_env. @@ -579,7 +574,7 @@ struct cl_env { * Linkage into global list of all client environments. Used for * garbage collection. */ - cfs_list_t ce_linkage; + struct list_head ce_linkage; /* * */ @@ -592,11 +587,11 @@ struct cl_env { }; #ifdef CONFIG_DEBUG_PAGESTATE_TRACKING -#define CL_ENV_INC(counter) cfs_atomic_inc(&cl_env_stats.cs_stats[CS_##counter]) +#define CL_ENV_INC(counter) atomic_inc(&cl_env_stats.cs_stats[CS_##counter]) #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]); \ + LASSERT(atomic_read(&cl_env_stats.cs_stats[CS_##counter]) > 0); \ + atomic_dec(&cl_env_stats.cs_stats[CS_##counter]); \ } while (0) #else #define CL_ENV_INC(counter) @@ -632,14 +627,15 @@ static unsigned cl_env_hops_hash(cfs_hash_t *lh, #endif } -static void *cl_env_hops_obj(cfs_hlist_node_t *hn) +static void *cl_env_hops_obj(struct hlist_node *hn) { - struct cl_env *cle = cfs_hlist_entry(hn, struct cl_env, ce_node); - LASSERT(cle->ce_magic == &cl_env_init0); - return (void *)cle; + struct cl_env *cle = hlist_entry(hn, struct cl_env, ce_node); + + LASSERT(cle->ce_magic == &cl_env_init0); + return (void *)cle; } -static int cl_env_hops_keycmp(const void *key, cfs_hlist_node_t *hn) +static int cl_env_hops_keycmp(const void *key, struct hlist_node *hn) { struct cl_env *cle = cl_env_hops_obj(hn); @@ -647,9 +643,9 @@ static int cl_env_hops_keycmp(const void *key, cfs_hlist_node_t *hn) return (key == cle->ce_owner); } -static void cl_env_hops_noop(cfs_hash_t *hs, cfs_hlist_node_t *hn) +static void cl_env_hops_noop(cfs_hash_t *hs, struct hlist_node *hn) { - struct cl_env *cle = cfs_hlist_entry(hn, struct cl_env, ce_node); + struct cl_env *cle = hlist_entry(hn, struct cl_env, ce_node); LASSERT(cle->ce_magic == &cl_env_init0); } @@ -761,37 +757,37 @@ static inline struct cl_env *cl_env_detach(struct cl_env *cle) static struct lu_env *cl_env_new(__u32 ctx_tags, __u32 ses_tags, void *debug) { - struct lu_env *env; - struct cl_env *cle; + struct lu_env *env; + struct cl_env *cle; - OBD_SLAB_ALLOC_PTR_GFP(cle, cl_env_kmem, __GFP_IO); - if (cle != NULL) { - int rc; + OBD_SLAB_ALLOC_PTR_GFP(cle, cl_env_kmem, GFP_NOFS); + if (cle != NULL) { + int rc; - CFS_INIT_LIST_HEAD(&cle->ce_linkage); - cle->ce_magic = &cl_env_init0; - env = &cle->ce_lu; - rc = lu_env_init(env, LCT_CL_THREAD|ctx_tags); - if (rc == 0) { - rc = lu_context_init(&cle->ce_ses, - LCT_SESSION | ses_tags); - if (rc == 0) { - lu_context_enter(&cle->ce_ses); - env->le_ses = &cle->ce_ses; - cl_env_init0(cle, debug); - } else - lu_env_fini(env); - } - if (rc != 0) { - OBD_SLAB_FREE_PTR(cle, cl_env_kmem); - env = ERR_PTR(rc); - } else { - CL_ENV_INC(create); - CL_ENV_INC(total); - } - } else - env = ERR_PTR(-ENOMEM); - return env; + INIT_LIST_HEAD(&cle->ce_linkage); + cle->ce_magic = &cl_env_init0; + env = &cle->ce_lu; + rc = lu_env_init(env, LCT_CL_THREAD|ctx_tags); + if (rc == 0) { + rc = lu_context_init(&cle->ce_ses, + LCT_SESSION | ses_tags); + if (rc == 0) { + lu_context_enter(&cle->ce_ses); + env->le_ses = &cle->ce_ses; + cl_env_init0(cle, debug); + } else + lu_env_fini(env); + } + if (rc != 0) { + OBD_SLAB_FREE_PTR(cle, cl_env_kmem); + env = ERR_PTR(rc); + } else { + CL_ENV_INC(create); + CL_ENV_INC(total); + } + } else + env = ERR_PTR(-ENOMEM); + return env; } static void cl_env_fini(struct cl_env *cle) @@ -809,12 +805,12 @@ static struct lu_env *cl_env_obtain(void *debug) ENTRY; spin_lock(&cl_envs_guard); - LASSERT(equi(cl_envs_cached_nr == 0, cfs_list_empty(&cl_envs))); + LASSERT(equi(cl_envs_cached_nr == 0, 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); + list_del_init(&cle->ce_linkage); cl_envs_cached_nr--; spin_unlock(&cl_envs_guard); @@ -936,9 +932,9 @@ unsigned cl_env_cache_purge(unsigned nr) ENTRY; spin_lock(&cl_envs_guard); - for (; !cfs_list_empty(&cl_envs) && nr > 0; --nr) { + for (; !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); + list_del_init(&cle->ce_linkage); LASSERT(cl_envs_cached_nr > 0); cl_envs_cached_nr--; spin_unlock(&cl_envs_guard); @@ -946,7 +942,7 @@ unsigned cl_env_cache_purge(unsigned nr) cl_env_fini(cle); spin_lock(&cl_envs_guard); } - LASSERT(equi(cl_envs_cached_nr == 0, cfs_list_empty(&cl_envs))); + LASSERT(equi(cl_envs_cached_nr == 0, list_empty(&cl_envs))); spin_unlock(&cl_envs_guard); RETURN(nr); } @@ -984,7 +980,7 @@ void cl_env_put(struct lu_env *env, int *refcheck) (env->le_ctx.lc_tags & ~LCT_HAS_EXIT) == LCT_CL_THREAD && (env->le_ses->lc_tags & ~LCT_HAS_EXIT) == LCT_SESSION) { spin_lock(&cl_envs_guard); - cfs_list_add(&cle->ce_linkage, &cl_envs); + list_add(&cle->ce_linkage, &cl_envs); cl_envs_cached_nr++; spin_unlock(&cl_envs_guard); } else @@ -1130,7 +1126,7 @@ static int cl_env_percpu_init(void) cle = &cl_env_percpu[i]; env = &cle->ce_lu; - CFS_INIT_LIST_HEAD(&cle->ce_linkage); + INIT_LIST_HEAD(&cle->ce_linkage); cle->ce_magic = &cl_env_init0; rc = lu_env_init(env, LCT_CL_THREAD | tags); if (rc == 0) { @@ -1344,11 +1340,13 @@ static struct lu_kmem_descr cl_object_caches[] = { */ int cl_global_init(void) { - int result; + int result; - result = cl_env_store_init(); - if (result) - return result; + INIT_LIST_HEAD(&cl_envs); + + result = cl_env_store_init(); + if (result) + return result; result = lu_kmem_init(cl_object_caches); if (result)