X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fllite%2Fvvp_dev.c;h=b203de3e01615b2fd88317fa9a7aaf2eae633cae;hb=b58a81067237f398f735f85b2211431cfc37493a;hp=8347789555eab84acc151d3d3804931bd7b52c02;hpb=fbf5870b9848929d352460f1f005b79c0b5ccc5a;p=fs%2Flustre-release.git diff --git a/lustre/llite/vvp_dev.c b/lustre/llite/vvp_dev.c index 8347789..b203de3 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. @@ -26,7 +24,7 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. */ /* @@ -89,7 +87,7 @@ static void *vvp_key_init(const struct lu_context *ctx, { struct vvp_thread_info *info; - OBD_SLAB_ALLOC_PTR(info, vvp_thread_kmem); + OBD_SLAB_ALLOC_PTR_GFP(info, vvp_thread_kmem, CFS_ALLOC_IO); if (info == NULL) info = ERR_PTR(-ENOMEM); return info; @@ -107,7 +105,7 @@ static void *vvp_session_key_init(const struct lu_context *ctx, { struct vvp_session *session; - OBD_SLAB_ALLOC_PTR(session, vvp_session_kmem); + OBD_SLAB_ALLOC_PTR_GFP(session, vvp_session_kmem, CFS_ALLOC_IO); if (session == NULL) session = ERR_PTR(-ENOMEM); return session; @@ -282,9 +280,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,52 +305,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) { - struct hlist_head *bucket; - struct lu_object_header *hdr; - struct lu_site *site; - struct hlist_node *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() */ - read_lock(&site->ls_guard); - hlist_for_each_entry(hdr, scan, bucket, loh_hash) { - if (depth-- == 0) { - if (!lu_object_is_dying(hdr)) { - if (atomic_add_return(1, &hdr->loh_ref) == 1) - ++ site->ls_busy; - found = hdr; - } - break; - } - } - 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, @@ -363,7 +361,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) { @@ -374,7 +372,7 @@ static loff_t vvp_pgcache_find(const struct lu_env *env, /* got an object. Find next page. */ hdr = cl_object_header(clob); - spin_lock(&hdr->coh_page_guard); + cfs_spin_lock(&hdr->coh_page_guard); nr = radix_tree_gang_lookup(&hdr->coh_tree, (void **)&pg, id.vpi_index, 1); @@ -383,7 +381,7 @@ static loff_t vvp_pgcache_find(const struct lu_env *env, /* Cant support over 16T file */ nr = !(pg->cp_index > 0xffffffff); } - spin_unlock(&hdr->coh_page_guard); + cfs_spin_unlock(&hdr->coh_page_guard); lu_object_ref_del(&clob->co_lu, "dump", cfs_current()); cl_object_put(env, clob); @@ -400,11 +398,11 @@ static loff_t vvp_pgcache_find(const struct lu_env *env, } #define seq_page_flag(seq, page, flag, has_flags) do { \ - if (test_bit(PG_##flag, &(page)->flags)) { \ + if (cfs_test_bit(PG_##flag, &(page)->flags)) { \ seq_printf(seq, "%s"#flag, has_flags ? "|" : ""); \ has_flags = 1; \ } \ -} while(0); +} while(0) static void vvp_pgcache_page_show(const struct lu_env *env, struct seq_file *seq, struct cl_page *page) @@ -432,9 +430,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 ? "" : "-"); } @@ -460,9 +455,9 @@ static int vvp_pgcache_show(struct seq_file *f, void *v) if (clob != NULL) { hdr = cl_object_header(clob); - spin_lock(&hdr->coh_page_guard); + cfs_spin_lock(&hdr->coh_page_guard); page = cl_page_lookup(hdr, id.vpi_index); - spin_unlock(&hdr->coh_page_guard); + cfs_spin_unlock(&hdr->coh_page_guard); seq_printf(f, "%8x@"DFID": ", id.vpi_index, PFID(&hdr->coh_lu.loh_fid)); @@ -493,7 +488,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,