X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fllite%2Fvvp_dev.c;h=68ea7415a5466fdb0abc38510fad6ec296912ee8;hb=92a189ca69c59312c802cb9aed0f0386735d9617;hp=33b7d21bb09c913c047e393c98a780a833dbf1f9;hpb=6e3ec5812ebd1b5ecf7cae584f429b013ffe7431;p=fs%2Flustre-release.git diff --git a/lustre/llite/vvp_dev.c b/lustre/llite/vvp_dev.c index 33b7d21..68ea741 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,8 +24,10 @@ * 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. + * + * 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; +struct kmem_cache *vvp_thread_kmem; +static struct kmem_cache *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), @@ -85,14 +79,14 @@ static struct lu_kmem_descr vvp_caches[] = { }; static void *vvp_key_init(const struct lu_context *ctx, - struct lu_context_key *key) + struct lu_context_key *key) { - struct vvp_thread_info *info; + struct vvp_thread_info *info; - OBD_SLAB_ALLOC_PTR_GFP(info, vvp_thread_kmem, CFS_ALLOC_IO); - if (info == NULL) - info = ERR_PTR(-ENOMEM); - return info; + OBD_SLAB_ALLOC_PTR_GFP(info, vvp_thread_kmem, __GFP_IO); + if (info == NULL) + info = ERR_PTR(-ENOMEM); + return info; } static void vvp_key_fini(const struct lu_context *ctx, @@ -103,14 +97,14 @@ static void vvp_key_fini(const struct lu_context *ctx, } static void *vvp_session_key_init(const struct lu_context *ctx, - struct lu_context_key *key) + struct lu_context_key *key) { - struct vvp_session *session; + struct vvp_session *session; - OBD_SLAB_ALLOC_PTR_GFP(session, vvp_session_kmem, CFS_ALLOC_IO); - if (session == NULL) - session = ERR_PTR(-ENOMEM); - return session; + OBD_SLAB_ALLOC_PTR_GFP(session, vvp_session_kmem, __GFP_IO); + if (session == NULL) + session = ERR_PTR(-ENOMEM); + return session; } static void vvp_session_key_fini(const struct lu_context *ctx, @@ -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; \ } \ @@ -410,9 +403,9 @@ static loff_t vvp_pgcache_find(const struct lu_env *env, static void vvp_pgcache_page_show(const struct lu_env *env, struct seq_file *seq, struct cl_page *page) { - struct ccc_page *cpg; - cfs_page_t *vmpage; - int has_flags; + struct ccc_page *cpg; + struct page *vmpage; + int has_flags; cpg = cl2ccc_page(cl_page_at(page, &vvp_device_type)); vmpage = cpg->cpg_page; @@ -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,8 @@ 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); seq_printf(f, "%8x@"DFID": ", id.vpi_index, PFID(&hdr->coh_lu.loh_fid)); @@ -472,6 +461,7 @@ static int vvp_pgcache_show(struct seq_file *f, void *v) cl_page_put(env, page); } else seq_puts(f, "missing\n"); + spin_unlock(&hdr->coh_page_guard); lu_object_ref_del(&clob->co_lu, "dump", cfs_current()); cl_object_put(env, clob); } else @@ -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,