X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fllite%2Fvvp_dev.c;h=bdb4cc846bb4e348f26c359b4f7c8b65be2a5384;hp=d0d0b2864ac372b43f11a4ffbf32028fc2b8840f;hb=d821adb626e050206f1b4605f1159cf65ad22af5;hpb=0f8dca08a4f68cba82c2c822998ecc309d3b7aaf diff --git a/lustre/llite/vvp_dev.c b/lustre/llite/vvp_dev.c index d0d0b28..bdb4cc8 100644 --- a/lustre/llite/vvp_dev.c +++ b/lustre/llite/vvp_dev.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -28,6 +26,8 @@ /* * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2012, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -60,16 +60,10 @@ * "llite_" (var. "ll_") prefix. */ -cfs_mem_cache_t *vvp_page_kmem; cfs_mem_cache_t *vvp_thread_kmem; static cfs_mem_cache_t *vvp_session_kmem; static struct lu_kmem_descr vvp_caches[] = { { - .ckd_cache = &vvp_page_kmem, - .ckd_name = "vvp_page_kmem", - .ckd_size = sizeof (struct ccc_page) - }, - { .ckd_cache = &vvp_thread_kmem, .ckd_name = "vvp_thread_kmem", .ckd_size = sizeof (struct vvp_thread_info), @@ -282,9 +276,12 @@ int cl_sb_fini(struct super_block *sb) #define PGC_DEPTH_SHIFT (32) struct vvp_pgcache_id { - unsigned vpi_bucket; - unsigned vpi_depth; - uint32_t vpi_index; + unsigned vpi_bucket; + unsigned vpi_depth; + uint32_t vpi_index; + + unsigned vpi_curdep; + struct lu_object_header *vpi_obj; }; static void vvp_pgcache_id_unpack(loff_t pos, struct vvp_pgcache_id *id) @@ -304,53 +301,49 @@ static loff_t vvp_pgcache_id_pack(struct vvp_pgcache_id *id) ((__u64)id->vpi_bucket << PGC_OBJ_SHIFT); } +static int vvp_pgcache_obj_get(cfs_hash_t *hs, cfs_hash_bd_t *bd, + cfs_hlist_node_t *hnode, void *data) +{ + struct vvp_pgcache_id *id = data; + struct lu_object_header *hdr = cfs_hash_object(hs, hnode); + + if (id->vpi_curdep-- > 0) + return 0; /* continue */ + + if (lu_object_is_dying(hdr)) + return 1; + + cfs_hash_get(hs, hnode); + id->vpi_obj = hdr; + return 1; +} + static struct cl_object *vvp_pgcache_obj(const struct lu_env *env, struct lu_device *dev, struct vvp_pgcache_id *id) { - cfs_hlist_head_t *bucket; - struct lu_object_header *hdr; - struct lu_site *site; - cfs_hlist_node_t *scan; - struct lu_object_header *found; - struct cl_object *clob; - unsigned depth; - LASSERT(lu_device_is_cl(dev)); - site = dev->ld_site; - bucket = site->ls_hash + (id->vpi_bucket & site->ls_hash_mask); - depth = id->vpi_depth & 0xf; - found = NULL; - clob = NULL; - - /* XXX copy of lu_object.c:htable_lookup() */ - cfs_read_lock(&site->ls_guard); - cfs_hlist_for_each_entry(hdr, scan, bucket, loh_hash) { - if (depth-- == 0) { - if (!lu_object_is_dying(hdr)) { - if (cfs_atomic_add_return(1, - &hdr->loh_ref) == 1) - ++ site->ls_busy; - found = hdr; - } - break; - } - } - cfs_read_unlock(&site->ls_guard); + id->vpi_depth &= 0xf; + id->vpi_obj = NULL; + id->vpi_curdep = id->vpi_depth; - if (found != NULL) { + cfs_hash_hlist_for_each(dev->ld_site->ls_obj_hash, id->vpi_bucket, + vvp_pgcache_obj_get, id); + if (id->vpi_obj != NULL) { struct lu_object *lu_obj; - lu_obj = lu_object_locate(found, dev->ld_type); + lu_obj = lu_object_locate(id->vpi_obj, dev->ld_type); if (lu_obj != NULL) { lu_object_ref_add(lu_obj, "dump", cfs_current()); - clob = lu2cl(lu_obj); - } else - lu_object_put(env, lu_object_top(found)); - } else if (depth > 0) + return lu2cl(lu_obj); + } + lu_object_put(env, lu_object_top(id->vpi_obj)); + + } else if (id->vpi_curdep > 0) { id->vpi_depth = 0xf; - return clob; + } + return NULL; } static loff_t vvp_pgcache_find(const struct lu_env *env, @@ -364,7 +357,7 @@ static loff_t vvp_pgcache_find(const struct lu_env *env, vvp_pgcache_id_unpack(pos, &id); while (1) { - if (id.vpi_bucket >= site->ls_hash_size) + if (id.vpi_bucket >= CFS_HASH_NHLIST(site->ls_obj_hash)) return ~0ULL; clob = vvp_pgcache_obj(env, dev, &id); if (clob != NULL) { @@ -375,7 +368,7 @@ static loff_t vvp_pgcache_find(const struct lu_env *env, /* got an object. Find next page. */ hdr = cl_object_header(clob); - cfs_spin_lock(&hdr->coh_page_guard); + spin_lock(&hdr->coh_page_guard); nr = radix_tree_gang_lookup(&hdr->coh_tree, (void **)&pg, id.vpi_index, 1); @@ -384,7 +377,7 @@ static loff_t vvp_pgcache_find(const struct lu_env *env, /* Cant support over 16T file */ nr = !(pg->cp_index > 0xffffffff); } - cfs_spin_unlock(&hdr->coh_page_guard); + spin_unlock(&hdr->coh_page_guard); lu_object_ref_del(&clob->co_lu, "dump", cfs_current()); cl_object_put(env, clob); @@ -401,7 +394,7 @@ static loff_t vvp_pgcache_find(const struct lu_env *env, } #define seq_page_flag(seq, page, flag, has_flags) do { \ - if (cfs_test_bit(PG_##flag, &(page)->flags)) { \ + if (test_bit(PG_##flag, &(page)->flags)) { \ seq_printf(seq, "%s"#flag, has_flags ? "|" : ""); \ has_flags = 1; \ } \ @@ -433,9 +426,6 @@ static void vvp_pgcache_page_show(const struct lu_env *env, seq_page_flag(seq, vmpage, referenced, has_flags); seq_page_flag(seq, vmpage, uptodate, has_flags); seq_page_flag(seq, vmpage, dirty, has_flags); -#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,12)) - seq_page_flag(seq, vmpage, highmem, has_flags); -#endif seq_page_flag(seq, vmpage, writeback, has_flags); seq_printf(seq, "%s]\n", has_flags ? "" : "-"); } @@ -461,9 +451,9 @@ static int vvp_pgcache_show(struct seq_file *f, void *v) if (clob != NULL) { hdr = cl_object_header(clob); - cfs_spin_lock(&hdr->coh_page_guard); - page = cl_page_lookup(hdr, id.vpi_index); - cfs_spin_unlock(&hdr->coh_page_guard); + spin_lock(&hdr->coh_page_guard); + page = cl_page_lookup(hdr, id.vpi_index); + spin_unlock(&hdr->coh_page_guard); seq_printf(f, "%8x@"DFID": ", id.vpi_index, PFID(&hdr->coh_lu.loh_fid)); @@ -494,7 +484,7 @@ static void *vvp_pgcache_start(struct seq_file *f, loff_t *pos) env = cl_env_get(&refcheck); if (!IS_ERR(env)) { sbi = f->private; - if (sbi->ll_site->ls_hash_bits > 64 - PGC_OBJ_SHIFT) + if (sbi->ll_site->ls_obj_hash->hs_cur_bits > 64 - PGC_OBJ_SHIFT) pos = ERR_PTR(-EFBIG); else { *pos = vvp_pgcache_find(env, &sbi->ll_cl->cd_lu_dev,