From f4652c74ab88cfd3caeb02c31b6981e41c6917ab Mon Sep 17 00:00:00 2001 From: nikita Date: Sat, 14 Oct 2006 23:42:29 +0000 Subject: [PATCH] iam: 0. make heavily used functions static inline; 1. add r5 hash and make it defauls. --- .../kernel_patches/patches/ext3-iam-separate.patch | 62 ++++++--------- lustre/kernel_patches/patches/ext3-iam-uapi.patch | 92 +++++++++++++++------- lustre/obdclass/mea.c | 42 +++++++--- 3 files changed, 118 insertions(+), 78 deletions(-) diff --git a/lustre/kernel_patches/patches/ext3-iam-separate.patch b/lustre/kernel_patches/patches/ext3-iam-separate.patch index 2bfd4f9..2f8b6dd 100644 --- a/lustre/kernel_patches/patches/ext3-iam-separate.patch +++ b/lustre/kernel_patches/patches/ext3-iam-separate.patch @@ -15,7 +15,7 @@ Index: iam/fs/ext3/iam.c =================================================================== --- iam.orig/fs/ext3/iam.c +++ iam/fs/ext3/iam.c -@@ -0,0 +1,1340 @@ +@@ -0,0 +1,1316 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * @@ -294,30 +294,6 @@ Index: iam/fs/ext3/iam.c +} + +/* -+ * Leaf helpers. -+ */ -+ -+struct iam_path *iam_leaf_path(const struct iam_leaf *leaf) -+{ -+ return leaf->il_path; -+} -+ -+struct iam_container *iam_leaf_container(const struct iam_leaf *leaf) -+{ -+ return iam_leaf_path(leaf)->ip_container; -+} -+ -+struct iam_descr *iam_leaf_descr(const struct iam_leaf *leaf) -+{ -+ return iam_leaf_container(leaf)->ic_descr; -+} -+ -+struct iam_leaf_operations *iam_leaf_ops(const struct iam_leaf *leaf) -+{ -+ return iam_leaf_descr(leaf)->id_leaf_ops; -+} -+ -+/* + * Return pointer to current leaf record. Pointer is valid while corresponding + * leaf node is locked and pinned. + */ @@ -2713,7 +2689,7 @@ Index: iam/fs/ext3/iam_lvar.c =================================================================== --- iam.orig/fs/ext3/iam_lvar.c +++ iam/fs/ext3/iam_lvar.c -@@ -0,0 +1,970 @@ +@@ -0,0 +1,976 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * @@ -2880,13 +2856,14 @@ Index: iam/fs/ext3/iam_lvar.c + return ((void *)ent) + e_size(leaf, ent); +} + ++#define LVAR_HASH_TEA (0) ++#define LVAR_HASH_R5 (1) ++#define LVAR_HASH_PREFIX (0) ++ +static inline lvar_hash_t get_hash(const struct iam_container *bag, + const char *name, int namelen) +{ -+#if 1 -+ struct dx_hash_info hinfo; -+ struct super_block *sb = bag->ic_object->i_sb; -+ int result; ++ lvar_hash_t result; + + if (namelen == 0) + return 0; @@ -2895,18 +2872,23 @@ Index: iam/fs/ext3/iam_lvar.c + if (strncmp(name, "..", 2) == 0 && namelen == 2) + return 4; + -+ hinfo.hash_version = EXT3_SB(sb)->s_def_hash_version ; -+ hinfo.seed = 0; -+ result = ext3fs_dirhash(name, namelen, &hinfo); -+ assert(result == 0); -+ return (hinfo.hash << 1) & 0x7fffffff; -+#else -+ lvar_hash_t result; ++ if (LVAR_HASH_PREFIX) { ++ result = 0; ++ strncpy((void *)&result, ++ name, min(namelen, (int)sizeof result)); ++ } else { ++ struct dx_hash_info hinfo; ++ ++ if (LVAR_HASH_TEA) ++ hinfo.hash_version = DX_HASH_TEA; ++ else if (LVAR_HASH_R5) ++ hinfo.hash_version = DX_HASH_R5; ++ hinfo.seed = 0; ++ ext3fs_dirhash(name, namelen, &hinfo); ++ result = hinfo.hash; ++ } + -+ result = 0; -+ strncpy((void *)&result, name, min(namelen, (int)sizeof result)); + return (result << 1) & 0x7fffffff; -+#endif +} + +static inline int e_eq(const struct lvar_leaf_entry *ent, diff --git a/lustre/kernel_patches/patches/ext3-iam-uapi.patch b/lustre/kernel_patches/patches/ext3-iam-uapi.patch index ba77fff..75e775f 100644 --- a/lustre/kernel_patches/patches/ext3-iam-uapi.patch +++ b/lustre/kernel_patches/patches/ext3-iam-uapi.patch @@ -752,7 +752,7 @@ Index: iam/include/linux/lustre_iam.h int (*can_add)(const struct iam_leaf *l, const struct iam_key *k, const struct iam_rec *r); -@@ -221,12 +352,13 @@ struct iam_leaf_operations { +@@ -221,17 +352,15 @@ struct iam_leaf_operations { /* * remove rec for a leaf */ @@ -767,8 +767,13 @@ Index: iam/include/linux/lustre_iam.h + iam_ptr_t newblknr); }; - struct iam_path *iam_leaf_path(const struct iam_leaf *leaf); -@@ -241,6 +373,10 @@ struct iam_descr { +-struct iam_path *iam_leaf_path(const struct iam_leaf *leaf); +-struct iam_container *iam_leaf_container(const struct iam_leaf *leaf); +- + /* + * Parameters, describing a flavor of iam container. + */ +@@ -241,6 +370,10 @@ struct iam_descr { */ size_t id_key_size; /* @@ -779,7 +784,7 @@ Index: iam/include/linux/lustre_iam.h * Size of a pointer to the next level (stored in index nodes), in * bytes. */ -@@ -264,6 +400,9 @@ struct iam_descr { +@@ -264,6 +397,9 @@ struct iam_descr { struct iam_leaf_operations *id_leaf_ops; }; @@ -789,7 +794,7 @@ Index: iam/include/linux/lustre_iam.h struct iam_container { /* * Underlying flat file. IO against this object is issued to -@@ -274,6 +413,10 @@ struct iam_container { +@@ -274,6 +410,10 @@ struct iam_container { * container flavor. */ struct iam_descr *ic_descr; @@ -800,7 +805,7 @@ Index: iam/include/linux/lustre_iam.h }; /* -@@ -284,7 +427,7 @@ struct iam_path_descr { +@@ -284,7 +424,7 @@ struct iam_path_descr { /* * Scratch-pad area for temporary keys. */ @@ -809,7 +814,7 @@ Index: iam/include/linux/lustre_iam.h }; /* -@@ -316,6 +459,7 @@ struct iam_path { +@@ -316,6 +456,7 @@ struct iam_path { * Key searched for. */ const struct iam_key *ip_key_target; @@ -817,7 +822,7 @@ Index: iam/include/linux/lustre_iam.h /* * Description-specific data. */ -@@ -334,6 +478,7 @@ struct iam_path_compat { +@@ -334,6 +475,7 @@ struct iam_path_compat { struct dx_hash_info *ipc_hinfo; struct dentry *ipc_dentry; struct iam_path_descr ipc_descr; @@ -825,7 +830,7 @@ Index: iam/include/linux/lustre_iam.h }; /* -@@ -347,7 +492,9 @@ enum iam_it_state { +@@ -347,7 +489,9 @@ enum iam_it_state { /* initial state */ IAM_IT_DETACHED, /* iterator is above particular record in the container */ @@ -836,7 +841,7 @@ Index: iam/include/linux/lustre_iam.h }; /* -@@ -355,7 +502,7 @@ enum iam_it_state { +@@ -355,7 +499,7 @@ enum iam_it_state { */ enum iam_it_flags { /* @@ -845,7 +850,7 @@ Index: iam/include/linux/lustre_iam.h */ IAM_IT_MOVE = (1 << 0), /* -@@ -372,15 +519,26 @@ enum iam_it_flags { +@@ -372,15 +516,26 @@ enum iam_it_flags { * doesn't point to any particular record in this container. * * After successful call to iam_it_get() and until corresponding call to @@ -875,7 +880,7 @@ Index: iam/include/linux/lustre_iam.h * */ struct iam_iterator { -@@ -390,7 +548,8 @@ struct iam_iterator { +@@ -390,7 +545,8 @@ struct iam_iterator { __u32 ii_flags; enum iam_it_state ii_state; /* @@ -885,7 +890,7 @@ Index: iam/include/linux/lustre_iam.h */ struct iam_path ii_path; }; -@@ -405,133 +564,26 @@ void iam_path_compat_fini(struct iam_pat +@@ -405,133 +561,26 @@ void iam_path_compat_fini(struct iam_pat struct iam_path_descr *iam_ipd_alloc(int keysize); void iam_ipd_free(struct iam_path_descr *ipd); @@ -1024,7 +1029,7 @@ Index: iam/include/linux/lustre_iam.h int iam_it_load(struct iam_iterator *it, iam_pos_t pos); int iam_lookup(struct iam_container *c, const struct iam_key *k, -@@ -539,10 +591,10 @@ int iam_lookup(struct iam_container *c, +@@ -539,10 +588,10 @@ int iam_lookup(struct iam_container *c, int iam_delete(handle_t *h, struct iam_container *c, const struct iam_key *k, struct iam_path_descr *pd); int iam_update(handle_t *h, struct iam_container *c, const struct iam_key *k, @@ -1037,7 +1042,7 @@ Index: iam/include/linux/lustre_iam.h /* * Initialize container @c. */ -@@ -558,10 +610,6 @@ void iam_container_fini(struct iam_conta +@@ -558,10 +607,6 @@ void iam_container_fini(struct iam_conta */ int iam_container_setup(struct iam_container *c); @@ -1048,7 +1053,7 @@ Index: iam/include/linux/lustre_iam.h static inline struct iam_descr *iam_container_descr(struct iam_container *c) { return c->ic_descr; -@@ -577,16 +625,65 @@ static inline struct inode *iam_path_obj +@@ -577,16 +622,65 @@ static inline struct inode *iam_path_obj return p->ip_container->ic_object; } @@ -1120,7 +1125,38 @@ Index: iam/include/linux/lustre_iam.h } static inline void iam_reccpy(const struct iam_path *p, struct iam_rec *rec_dst, -@@ -604,7 +701,7 @@ static inline void *iam_entry_off(struct +@@ -600,11 +694,38 @@ static inline void *iam_entry_off(struct + return (void *)((char *)entry + off); + } + ++/* ++ * Leaf helpers. ++ */ ++ ++static inline struct iam_path *iam_leaf_path(const struct iam_leaf *leaf) ++{ ++ return leaf->il_path; ++} ++ ++static inline struct iam_container * ++iam_leaf_container(const struct iam_leaf *leaf) ++{ ++ return iam_leaf_path(leaf)->ip_container; ++} ++ ++static inline struct iam_descr *iam_leaf_descr(const struct iam_leaf *leaf) ++{ ++ return iam_leaf_container(leaf)->ic_descr; ++} ++ ++static inline struct iam_leaf_operations * ++iam_leaf_ops(const struct iam_leaf *leaf) ++{ ++ return iam_leaf_descr(leaf)->id_leaf_ops; ++} ++ ++ + /*XXX These stuff put here, just because they are used by iam.c and namei.c*/ static inline unsigned dx_get_block(struct iam_path *p, struct iam_entry *entry) { return le32_to_cpu(*(u32*)iam_entry_off(entry, @@ -1129,7 +1165,7 @@ Index: iam/include/linux/lustre_iam.h & 0x00ffffff; } -@@ -612,21 +709,64 @@ static inline void dx_set_block(struct i +@@ -612,21 +733,64 @@ static inline void dx_set_block(struct i struct iam_entry *entry, unsigned value) { *(u32*)iam_entry_off(entry, @@ -1198,14 +1234,14 @@ Index: iam/include/linux/lustre_iam.h static inline unsigned dx_get_count(struct iam_entry *entries) { return le16_to_cpu(((struct dx_countlimit *) entries)->count); -@@ -647,9 +787,21 @@ static inline unsigned dx_node_limit(str +@@ -647,9 +811,21 @@ static inline unsigned dx_node_limit(str struct iam_descr *param = iam_path_descr(p); unsigned entry_space = iam_path_obj(p)->i_sb->s_blocksize - param->id_node_gap; - return entry_space / (param->id_key_size + param->id_ptr_size); + return entry_space / (param->id_ikey_size + param->id_ptr_size); - } - ++} ++ +static inline unsigned dx_root_limit(struct iam_path *p) +{ + struct iam_descr *param = iam_path_descr(p); @@ -1215,13 +1251,13 @@ Index: iam/include/linux/lustre_iam.h + if (limit == dx_node_limit(p)) + limit--; + return limit; -+} -+ + } + + static inline struct iam_entry *dx_get_entries(struct iam_path *path, void *data, int root) { -@@ -665,7 +817,8 @@ static inline struct iam_entry *dx_node_ +@@ -665,7 +841,8 @@ static inline struct iam_entry *dx_node_ frame->bh->b_data, frame == path->ip_frames); } @@ -1231,7 +1267,7 @@ Index: iam/include/linux/lustre_iam.h { assert(0 <= nr && nr < ARRAY_SIZE(path->ip_data->ipd_key_scratch)); return path->ip_data->ipd_key_scratch[nr]; -@@ -674,6 +827,7 @@ static inline struct iam_key *iam_path_k +@@ -674,6 +851,7 @@ static inline struct iam_key *iam_path_k int dx_lookup(struct iam_path *path); void dx_insert_block(struct iam_path *path, struct iam_frame *frame, u32 hash, u32 block); @@ -1239,7 +1275,7 @@ Index: iam/include/linux/lustre_iam.h int ext3_htree_next_block(struct inode *dir, __u32 hash, struct iam_path *path, __u32 *start_hash); -@@ -681,6 +835,20 @@ int ext3_htree_next_block(struct inode * +@@ -681,6 +859,20 @@ int ext3_htree_next_block(struct inode * struct buffer_head *ext3_append(handle_t *handle, struct inode *inode, u32 *block, int *err); int split_index_node(handle_t *handle, struct iam_path *path); @@ -1260,7 +1296,7 @@ Index: iam/include/linux/lustre_iam.h /* * external -@@ -698,10 +866,12 @@ int iam_node_read(struct iam_container * +@@ -698,10 +890,12 @@ int iam_node_read(struct iam_container * handle_t *handle, struct buffer_head **bh); void iam_insert_key(struct iam_path *path, struct iam_frame *frame, @@ -1274,7 +1310,7 @@ Index: iam/include/linux/lustre_iam.h struct iam_path *iam_leaf_path(const struct iam_leaf *leaf); struct iam_container *iam_leaf_container(const struct iam_leaf *leaf); -@@ -709,14 +879,95 @@ struct iam_descr *iam_leaf_descr(const s +@@ -709,14 +903,95 @@ struct iam_descr *iam_leaf_descr(const s struct iam_leaf_operations *iam_leaf_ops(const struct iam_leaf *leaf); diff --git a/lustre/obdclass/mea.c b/lustre/obdclass/mea.c index 3e0673a..da769e2 100644 --- a/lustre/obdclass/mea.c +++ b/lustre/obdclass/mea.c @@ -63,12 +63,14 @@ static int mea_all_chars_hash(int count, char *name, int namelen) #ifdef __KERNEL__ /* This hash calculate method must be same as the lvar hash method */ -static int mea_hash_segment(int count, char *name, int namelen) + +#define LVAR_HASH_TEA (0) +#define LVAR_HASH_R5 (1) +#define LVAR_HASH_PREFIX (0) + +static __u32 hash_build(char *name, int namelen) { - struct ldiskfs_dx_hash_info hinfo; - int result; - __u64 hash; - __u64 hash_segment = MAX_HASH_SIZE; + __u32 result; if (namelen == 0) return 0; @@ -77,11 +79,31 @@ static int mea_hash_segment(int count, char *name, int namelen) if (strncmp(name, "..", 2) == 0 && namelen == 2) return 4; - hinfo.hash_version = LDISKFS_DX_HASH_TEA; - hinfo.seed = 0; - result = ldiskfsfs_dirhash(name, namelen, &hinfo); - LASSERT(result == 0); - hash = (hinfo.hash << 1) & 0x7fffffff; + if (LVAR_HASH_PREFIX) { + result = 0; + strncpy((void *)&result, + name, min(namelen, (int)sizeof result)); + } else { + struct ldiskfs_dx_hash_info hinfo; + + if (LVAR_HASH_TEA) + hinfo.hash_version = LDISKFS_DX_HASH_TEA; + else + hinfo.hash_version = LDISKFS_DX_HASH_R5; + hinfo.seed = 0; + ldiskfsfs_dirhash(name, namelen, &hinfo); + result = hinfo.hash; + } + + return (result << 1) & 0x7fffffff; +} + +static int mea_hash_segment(int count, char *name, int namelen) +{ + __u64 hash; + __u64 hash_segment = MAX_HASH_SIZE; + + hash = hash_build(name, namelen); do_div(hash_segment, count); do_div(hash, hash_segment); LASSERTF(hash <= count, "hash "LPU64" count %d \n", hash, count); -- 1.8.3.1