X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ffld%2Ffld_cache.c;h=bb3dfe00fac8b92957453d4b9f7087a4c7587e7c;hb=9b924e86b27df0cb7a6f0d4c04ff96f867413485;hp=b9af9a347d3dfacf169a496408c40b41634924ba;hpb=fedede83f52b3e398b47fbb4d22c62c61a491238;p=fs%2Flustre-release.git diff --git a/lustre/fld/fld_cache.c b/lustre/fld/fld_cache.c index b9af9a3..bb3dfe0 100644 --- a/lustre/fld/fld_cache.c +++ b/lustre/fld/fld_cache.c @@ -15,17 +15,15 @@ * * You should have received a copy of the GNU General Public License * version 2 along with this program; If not, see - * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. + * http://www.gnu.org/licenses/gpl-2.0.html * * GPL HEADER END */ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2012, 2014, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -41,25 +39,10 @@ #define DEBUG_SUBSYSTEM S_FLD -#ifdef __KERNEL__ -# include -# include -# include -# include -#else /* __KERNEL__ */ -# include -# include -#endif - -#include -#include -#include +#include +#include +#include #include -#include - -#include -#include -#include #include #include "fld_internal.h" @@ -79,13 +62,13 @@ struct fld_cache *fld_cache_init(const char *name, if (cache == NULL) RETURN(ERR_PTR(-ENOMEM)); - CFS_INIT_LIST_HEAD(&cache->fci_entries_head); - CFS_INIT_LIST_HEAD(&cache->fci_lru); + INIT_LIST_HEAD(&cache->fci_entries_head); + INIT_LIST_HEAD(&cache->fci_lru); cache->fci_cache_count = 0; - spin_lock_init(&cache->fci_lock); + rwlock_init(&cache->fci_lock); - strncpy(cache->fci_name, name, + strlcpy(cache->fci_name, name, sizeof(cache->fci_name)); cache->fci_cache_size = cache_size; @@ -105,23 +88,16 @@ struct fld_cache *fld_cache_init(const char *name, */ void fld_cache_fini(struct fld_cache *cache) { - __u64 pct; ENTRY; LASSERT(cache != NULL); fld_cache_flush(cache); - if (cache->fci_stat.fst_count > 0) { - pct = cache->fci_stat.fst_cache * 100; - do_div(pct, cache->fci_stat.fst_count); - } else { - pct = 0; - } - CDEBUG(D_INFO, "FLD cache statistics (%s):\n", cache->fci_name); - CDEBUG(D_INFO, " Total reqs: "LPU64"\n", cache->fci_stat.fst_count); - CDEBUG(D_INFO, " Cache reqs: "LPU64"\n", cache->fci_stat.fst_cache); - CDEBUG(D_INFO, " Cache hits: "LPU64"%%\n", pct); + CDEBUG(D_INFO, " Total reqs: %llu\n", cache->fci_stat.fst_count); + CDEBUG(D_INFO, " Cache reqs: %llu\n", cache->fci_stat.fst_cache); + CDEBUG(D_INFO, " Cache hits: %u%%\n", + pct(cache->fci_stat.fst_cache, cache->fci_stat.fst_count)); OBD_FREE_PTR(cache); @@ -134,8 +110,8 @@ void fld_cache_fini(struct fld_cache *cache) void fld_cache_entry_delete(struct fld_cache *cache, struct fld_cache_entry *node) { - cfs_list_del(&node->fce_list); - cfs_list_del(&node->fce_lru); + list_del(&node->fce_list); + list_del(&node->fce_lru); cache->fci_cache_count--; OBD_FREE_PTR(node); } @@ -149,18 +125,18 @@ static void fld_fix_new_list(struct fld_cache *cache) struct fld_cache_entry *f_next; struct lu_seq_range *c_range; struct lu_seq_range *n_range; - cfs_list_t *head = &cache->fci_entries_head; + struct list_head *head = &cache->fci_entries_head; ENTRY; restart_fixup: - cfs_list_for_each_entry_safe(f_curr, f_next, head, fce_list) { - c_range = &f_curr->fce_range; - n_range = &f_next->fce_range; + list_for_each_entry_safe(f_curr, f_next, head, fce_list) { + c_range = &f_curr->fce_range; + n_range = &f_next->fce_range; - LASSERT(range_is_sane(c_range)); - if (&f_next->fce_list == head) - break; + LASSERT(lu_seq_range_is_sane(c_range)); + if (&f_next->fce_list == head) + break; if (c_range->lsr_flags != n_range->lsr_flags) continue; @@ -212,13 +188,13 @@ restart_fixup: */ static inline void fld_cache_entry_add(struct fld_cache *cache, struct fld_cache_entry *f_new, - cfs_list_t *pos) + struct list_head *pos) { - cfs_list_add(&f_new->fce_list, pos); - cfs_list_add(&f_new->fce_lru, &cache->fci_lru); + list_add(&f_new->fce_list, pos); + list_add(&f_new->fce_lru, &cache->fci_lru); - cache->fci_cache_count++; - fld_fix_new_list(cache); + cache->fci_cache_count++; + fld_fix_new_list(cache); } /** @@ -228,7 +204,7 @@ static inline void fld_cache_entry_add(struct fld_cache *cache, static int fld_cache_shrink(struct fld_cache *cache) { struct fld_cache_entry *flde; - cfs_list_t *curr; + struct list_head *curr; int num = 0; ENTRY; @@ -242,7 +218,7 @@ static int fld_cache_shrink(struct fld_cache *cache) while (cache->fci_cache_count + cache->fci_threshold > cache->fci_cache_size && curr != &cache->fci_lru) { - flde = cfs_list_entry(curr, struct fld_cache_entry, fce_lru); + flde = list_entry(curr, struct fld_cache_entry, fce_lru); curr = curr->prev; fld_cache_entry_delete(cache, flde); num++; @@ -261,10 +237,10 @@ void fld_cache_flush(struct fld_cache *cache) { ENTRY; - spin_lock(&cache->fci_lock); + write_lock(&cache->fci_lock); cache->fci_cache_size = 0; fld_cache_shrink(cache); - spin_unlock(&cache->fci_lock); + write_unlock(&cache->fci_lock); EXIT; } @@ -274,17 +250,17 @@ void fld_cache_flush(struct fld_cache *cache) * entry accordingly. */ -void fld_cache_punch_hole(struct fld_cache *cache, - struct fld_cache_entry *f_curr, - struct fld_cache_entry *f_new) +static void fld_cache_punch_hole(struct fld_cache *cache, + struct fld_cache_entry *f_curr, + struct fld_cache_entry *f_new) { const struct lu_seq_range *range = &f_new->fce_range; - const seqno_t new_start = range->lsr_start; - const seqno_t new_end = range->lsr_end; + const u64 new_start = range->lsr_start; + const u64 new_end = range->lsr_end; struct fld_cache_entry *fldt; ENTRY; - OBD_ALLOC_GFP(fldt, sizeof *fldt, CFS_ALLOC_ATOMIC); + OBD_ALLOC_GFP(fldt, sizeof *fldt, GFP_ATOMIC); if (!fldt) { OBD_FREE_PTR(f_new); EXIT; @@ -320,10 +296,10 @@ static void fld_cache_overlap_handle(struct fld_cache *cache, struct fld_cache_entry *f_curr, struct fld_cache_entry *f_new) { - const struct lu_seq_range *range = &f_new->fce_range; - const seqno_t new_start = range->lsr_start; - const seqno_t new_end = range->lsr_end; - const mdsno_t mdt = range->lsr_index; + const struct lu_seq_range *range = &f_new->fce_range; + const u64 new_start = range->lsr_start; + const u64 new_end = range->lsr_end; + const u32 mdt = range->lsr_index; /* this is overlap case, these case are checking overlapping with * prev range only. fixup will handle overlaping with next range. */ @@ -382,7 +358,7 @@ struct fld_cache_entry { struct fld_cache_entry *f_new; - LASSERT(range_is_sane(range)); + LASSERT(lu_seq_range_is_sane(range)); OBD_ALLOC_PTR(f_new); if (!f_new) @@ -403,15 +379,13 @@ int fld_cache_insert_nolock(struct fld_cache *cache, { struct fld_cache_entry *f_curr; struct fld_cache_entry *n; - cfs_list_t *head; - cfs_list_t *prev = NULL; - const seqno_t new_start = f_new->fce_range.lsr_start; - const seqno_t new_end = f_new->fce_range.lsr_end; + struct list_head *head; + struct list_head *prev = NULL; + const u64 new_start = f_new->fce_range.lsr_start; + const u64 new_end = f_new->fce_range.lsr_end; __u32 new_flags = f_new->fce_range.lsr_flags; ENTRY; - LASSERT_SPIN_LOCKED(&cache->fci_lock); - /* * Duplicate entries are eliminated in insert op. * So we don't need to search new entry before starting @@ -423,7 +397,7 @@ int fld_cache_insert_nolock(struct fld_cache *cache, head = &cache->fci_entries_head; - cfs_list_for_each_entry_safe(f_curr, n, head, fce_list) { + list_for_each_entry_safe(f_curr, n, head, fce_list) { /* add list if next is end of list */ if (new_end < f_curr->fce_range.lsr_start || (new_end == f_curr->fce_range.lsr_start && @@ -459,9 +433,9 @@ int fld_cache_insert(struct fld_cache *cache, if (IS_ERR(flde)) RETURN(PTR_ERR(flde)); - spin_lock(&cache->fci_lock); + write_lock(&cache->fci_lock); rc = fld_cache_insert_nolock(cache, flde); - spin_unlock(&cache->fci_lock); + write_unlock(&cache->fci_lock); if (rc) OBD_FREE_PTR(flde); @@ -473,11 +447,10 @@ void fld_cache_delete_nolock(struct fld_cache *cache, { struct fld_cache_entry *flde; struct fld_cache_entry *tmp; - cfs_list_t *head; + struct list_head *head; - LASSERT_SPIN_LOCKED(&cache->fci_lock); head = &cache->fci_entries_head; - cfs_list_for_each_entry_safe(flde, tmp, head, fce_list) { + list_for_each_entry_safe(flde, tmp, head, fce_list) { /* add list if next is end of list */ if (range->lsr_start == flde->fce_range.lsr_start || (range->lsr_end == flde->fce_range.lsr_end && @@ -495,22 +468,21 @@ void fld_cache_delete_nolock(struct fld_cache *cache, void fld_cache_delete(struct fld_cache *cache, const struct lu_seq_range *range) { - spin_lock(&cache->fci_lock); + write_lock(&cache->fci_lock); fld_cache_delete_nolock(cache, range); - spin_unlock(&cache->fci_lock); + write_unlock(&cache->fci_lock); } -struct fld_cache_entry -*fld_cache_entry_lookup_nolock(struct fld_cache *cache, - struct lu_seq_range *range) +struct fld_cache_entry * +fld_cache_entry_lookup_nolock(struct fld_cache *cache, + const struct lu_seq_range *range) { struct fld_cache_entry *flde; struct fld_cache_entry *got = NULL; - cfs_list_t *head; + struct list_head *head; - LASSERT_SPIN_LOCKED(&cache->fci_lock); head = &cache->fci_entries_head; - cfs_list_for_each_entry(flde, head, fce_list) { + list_for_each_entry(flde, head, fce_list) { if (range->lsr_start == flde->fce_range.lsr_start || (range->lsr_end == flde->fce_range.lsr_end && range->lsr_flags == flde->fce_range.lsr_flags)) { @@ -525,15 +497,17 @@ struct fld_cache_entry /** * lookup \a seq sequence for range in fld cache. */ -struct fld_cache_entry -*fld_cache_entry_lookup(struct fld_cache *cache, struct lu_seq_range *range) +struct fld_cache_entry * +fld_cache_entry_lookup(struct fld_cache *cache, + const struct lu_seq_range *range) { struct fld_cache_entry *got = NULL; ENTRY; - spin_lock(&cache->fci_lock); + read_lock(&cache->fci_lock); got = fld_cache_entry_lookup_nolock(cache, range); - spin_unlock(&cache->fci_lock); + read_unlock(&cache->fci_lock); + RETURN(got); } @@ -541,36 +515,33 @@ struct fld_cache_entry * lookup \a seq sequence for range in fld cache. */ int fld_cache_lookup(struct fld_cache *cache, - const seqno_t seq, struct lu_seq_range *range) + const u64 seq, struct lu_seq_range *range) { struct fld_cache_entry *flde; struct fld_cache_entry *prev = NULL; - cfs_list_t *head; + struct list_head *head; ENTRY; - spin_lock(&cache->fci_lock); + read_lock(&cache->fci_lock); head = &cache->fci_entries_head; cache->fci_stat.fst_count++; - cfs_list_for_each_entry(flde, head, fce_list) { + list_for_each_entry(flde, head, fce_list) { if (flde->fce_range.lsr_start > seq) { if (prev != NULL) - memcpy(range, prev, sizeof(*range)); + *range = prev->fce_range; break; } prev = flde; - if (range_within(&flde->fce_range, seq)) { - *range = flde->fce_range; + if (lu_seq_range_within(&flde->fce_range, seq)) { + *range = flde->fce_range; - /* update position of this entry in lru list. */ - cfs_list_move(&flde->fce_lru, &cache->fci_lru); - cache->fci_stat.fst_cache++; - spin_unlock(&cache->fci_lock); + cache->fci_stat.fst_cache++; + read_unlock(&cache->fci_lock); RETURN(0); } } - spin_unlock(&cache->fci_lock); + read_unlock(&cache->fci_lock); RETURN(-ENOENT); } -