ceph: make CRUSH hash functions non-inline
These are way to big to be inline. I missed crush/* when doing the inline audit for akpm's review. Signed-off-by: Sage Weil <sage@newdream.net>
This commit is contained in:
parent
1bdb70e590
commit
c6cf726316
@ -11,7 +11,7 @@ ceph-objs := super.o inode.o dir.o file.o addr.o ioctl.o \
|
|||||||
messenger.o msgpool.o buffer.o \
|
messenger.o msgpool.o buffer.o \
|
||||||
mds_client.o mdsmap.o \
|
mds_client.o mdsmap.o \
|
||||||
mon_client.o \
|
mon_client.o \
|
||||||
osd_client.o osdmap.o crush/crush.o crush/mapper.o \
|
osd_client.o osdmap.o crush/crush.o crush/mapper.o crush/hash.o \
|
||||||
debugfs.o \
|
debugfs.o \
|
||||||
ceph_fs.o ceph_strings.o ceph_frag.o
|
ceph_fs.o ceph_strings.o ceph_frag.o
|
||||||
|
|
||||||
|
@ -15,3 +15,4 @@ src/crush/crush.h fs/ceph/crush/crush.h
|
|||||||
src/crush/mapper.c fs/ceph/crush/mapper.c
|
src/crush/mapper.c fs/ceph/crush/mapper.c
|
||||||
src/crush/mapper.h fs/ceph/crush/mapper.h
|
src/crush/mapper.h fs/ceph/crush/mapper.h
|
||||||
src/crush/hash.h fs/ceph/crush/hash.h
|
src/crush/hash.h fs/ceph/crush/hash.h
|
||||||
|
src/crush/hash.c fs/ceph/crush/hash.c
|
||||||
|
@ -10,6 +10,17 @@
|
|||||||
|
|
||||||
#include "crush.h"
|
#include "crush.h"
|
||||||
|
|
||||||
|
const char *crush_bucket_alg_name(int alg)
|
||||||
|
{
|
||||||
|
switch (alg) {
|
||||||
|
case CRUSH_BUCKET_UNIFORM: return "uniform";
|
||||||
|
case CRUSH_BUCKET_LIST: return "list";
|
||||||
|
case CRUSH_BUCKET_TREE: return "tree";
|
||||||
|
case CRUSH_BUCKET_STRAW: return "straw";
|
||||||
|
default: return "unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* crush_get_bucket_item_weight - Get weight of an item in given bucket
|
* crush_get_bucket_item_weight - Get weight of an item in given bucket
|
||||||
* @b: bucket pointer
|
* @b: bucket pointer
|
||||||
|
@ -97,16 +97,7 @@ enum {
|
|||||||
CRUSH_BUCKET_TREE = 3,
|
CRUSH_BUCKET_TREE = 3,
|
||||||
CRUSH_BUCKET_STRAW = 4
|
CRUSH_BUCKET_STRAW = 4
|
||||||
};
|
};
|
||||||
static inline const char *crush_bucket_alg_name(int alg)
|
extern const char *crush_bucket_alg_name(int alg);
|
||||||
{
|
|
||||||
switch (alg) {
|
|
||||||
case CRUSH_BUCKET_UNIFORM: return "uniform";
|
|
||||||
case CRUSH_BUCKET_LIST: return "list";
|
|
||||||
case CRUSH_BUCKET_TREE: return "tree";
|
|
||||||
case CRUSH_BUCKET_STRAW: return "straw";
|
|
||||||
default: return "unknown";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct crush_bucket {
|
struct crush_bucket {
|
||||||
__s32 id; /* this'll be negative */
|
__s32 id; /* this'll be negative */
|
||||||
|
86
fs/ceph/crush/hash.c
Normal file
86
fs/ceph/crush/hash.c
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Robert Jenkins' function for mixing 32-bit values
|
||||||
|
* http://burtleburtle.net/bob/hash/evahash.html
|
||||||
|
* a, b = random bits, c = input and output
|
||||||
|
*/
|
||||||
|
#define crush_hashmix(a, b, c) do { \
|
||||||
|
a = a-b; a = a-c; a = a^(c>>13); \
|
||||||
|
b = b-c; b = b-a; b = b^(a<<8); \
|
||||||
|
c = c-a; c = c-b; c = c^(b>>13); \
|
||||||
|
a = a-b; a = a-c; a = a^(c>>12); \
|
||||||
|
b = b-c; b = b-a; b = b^(a<<16); \
|
||||||
|
c = c-a; c = c-b; c = c^(b>>5); \
|
||||||
|
a = a-b; a = a-c; a = a^(c>>3); \
|
||||||
|
b = b-c; b = b-a; b = b^(a<<10); \
|
||||||
|
c = c-a; c = c-b; c = c^(b>>15); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define crush_hash_seed 1315423911
|
||||||
|
|
||||||
|
__u32 crush_hash32(__u32 a)
|
||||||
|
{
|
||||||
|
__u32 hash = crush_hash_seed ^ a;
|
||||||
|
__u32 b = a;
|
||||||
|
__u32 x = 231232;
|
||||||
|
__u32 y = 1232;
|
||||||
|
crush_hashmix(b, x, hash);
|
||||||
|
crush_hashmix(y, a, hash);
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
__u32 crush_hash32_2(__u32 a, __u32 b)
|
||||||
|
{
|
||||||
|
__u32 hash = crush_hash_seed ^ a ^ b;
|
||||||
|
__u32 x = 231232;
|
||||||
|
__u32 y = 1232;
|
||||||
|
crush_hashmix(a, b, hash);
|
||||||
|
crush_hashmix(x, a, hash);
|
||||||
|
crush_hashmix(b, y, hash);
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
__u32 crush_hash32_3(__u32 a, __u32 b, __u32 c)
|
||||||
|
{
|
||||||
|
__u32 hash = crush_hash_seed ^ a ^ b ^ c;
|
||||||
|
__u32 x = 231232;
|
||||||
|
__u32 y = 1232;
|
||||||
|
crush_hashmix(a, b, hash);
|
||||||
|
crush_hashmix(c, x, hash);
|
||||||
|
crush_hashmix(y, a, hash);
|
||||||
|
crush_hashmix(b, x, hash);
|
||||||
|
crush_hashmix(y, c, hash);
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
__u32 crush_hash32_4(__u32 a, __u32 b, __u32 c, __u32 d)
|
||||||
|
{
|
||||||
|
__u32 hash = crush_hash_seed ^ a ^ b ^ c ^ d;
|
||||||
|
__u32 x = 231232;
|
||||||
|
__u32 y = 1232;
|
||||||
|
crush_hashmix(a, b, hash);
|
||||||
|
crush_hashmix(c, d, hash);
|
||||||
|
crush_hashmix(a, x, hash);
|
||||||
|
crush_hashmix(y, b, hash);
|
||||||
|
crush_hashmix(c, x, hash);
|
||||||
|
crush_hashmix(y, d, hash);
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
|
__u32 crush_hash32_5(__u32 a, __u32 b, __u32 c, __u32 d, __u32 e)
|
||||||
|
{
|
||||||
|
__u32 hash = crush_hash_seed ^ a ^ b ^ c ^ d ^ e;
|
||||||
|
__u32 x = 231232;
|
||||||
|
__u32 y = 1232;
|
||||||
|
crush_hashmix(a, b, hash);
|
||||||
|
crush_hashmix(c, d, hash);
|
||||||
|
crush_hashmix(e, x, hash);
|
||||||
|
crush_hashmix(y, a, hash);
|
||||||
|
crush_hashmix(b, x, hash);
|
||||||
|
crush_hashmix(y, c, hash);
|
||||||
|
crush_hashmix(d, x, hash);
|
||||||
|
crush_hashmix(y, e, hash);
|
||||||
|
return hash;
|
||||||
|
}
|
@ -1,90 +1,12 @@
|
|||||||
#ifndef _CRUSH_HASH_H
|
#ifndef _CRUSH_HASH_H
|
||||||
#define _CRUSH_HASH_H
|
#define _CRUSH_HASH_H
|
||||||
|
|
||||||
/*
|
extern __u32 crush_hash32(__u32 a);
|
||||||
* Robert Jenkins' function for mixing 32-bit values
|
extern __u32 crush_hash32_2(__u32 a, __u32 b);
|
||||||
* http://burtleburtle.net/bob/hash/evahash.html
|
extern __u32 crush_hash32_3(__u32 a, __u32 b, __u32 c);
|
||||||
* a, b = random bits, c = input and output
|
extern __u32 crush_hash32_4(__u32 a, __u32 b, __u32 c,
|
||||||
*/
|
__u32 d);
|
||||||
#define crush_hashmix(a, b, c) do { \
|
extern __u32 crush_hash32_5(__u32 a, __u32 b, __u32 c,
|
||||||
a = a-b; a = a-c; a = a^(c>>13); \
|
__u32 d, __u32 e);
|
||||||
b = b-c; b = b-a; b = b^(a<<8); \
|
|
||||||
c = c-a; c = c-b; c = c^(b>>13); \
|
|
||||||
a = a-b; a = a-c; a = a^(c>>12); \
|
|
||||||
b = b-c; b = b-a; b = b^(a<<16); \
|
|
||||||
c = c-a; c = c-b; c = c^(b>>5); \
|
|
||||||
a = a-b; a = a-c; a = a^(c>>3); \
|
|
||||||
b = b-c; b = b-a; b = b^(a<<10); \
|
|
||||||
c = c-a; c = c-b; c = c^(b>>15); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define crush_hash_seed 1315423911
|
|
||||||
|
|
||||||
static inline __u32 crush_hash32(__u32 a)
|
|
||||||
{
|
|
||||||
__u32 hash = crush_hash_seed ^ a;
|
|
||||||
__u32 b = a;
|
|
||||||
__u32 x = 231232;
|
|
||||||
__u32 y = 1232;
|
|
||||||
crush_hashmix(b, x, hash);
|
|
||||||
crush_hashmix(y, a, hash);
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __u32 crush_hash32_2(__u32 a, __u32 b)
|
|
||||||
{
|
|
||||||
__u32 hash = crush_hash_seed ^ a ^ b;
|
|
||||||
__u32 x = 231232;
|
|
||||||
__u32 y = 1232;
|
|
||||||
crush_hashmix(a, b, hash);
|
|
||||||
crush_hashmix(x, a, hash);
|
|
||||||
crush_hashmix(b, y, hash);
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __u32 crush_hash32_3(__u32 a, __u32 b, __u32 c)
|
|
||||||
{
|
|
||||||
__u32 hash = crush_hash_seed ^ a ^ b ^ c;
|
|
||||||
__u32 x = 231232;
|
|
||||||
__u32 y = 1232;
|
|
||||||
crush_hashmix(a, b, hash);
|
|
||||||
crush_hashmix(c, x, hash);
|
|
||||||
crush_hashmix(y, a, hash);
|
|
||||||
crush_hashmix(b, x, hash);
|
|
||||||
crush_hashmix(y, c, hash);
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __u32 crush_hash32_4(__u32 a, __u32 b, __u32 c,
|
|
||||||
__u32 d)
|
|
||||||
{
|
|
||||||
__u32 hash = crush_hash_seed ^ a ^ b ^ c ^ d;
|
|
||||||
__u32 x = 231232;
|
|
||||||
__u32 y = 1232;
|
|
||||||
crush_hashmix(a, b, hash);
|
|
||||||
crush_hashmix(c, d, hash);
|
|
||||||
crush_hashmix(a, x, hash);
|
|
||||||
crush_hashmix(y, b, hash);
|
|
||||||
crush_hashmix(c, x, hash);
|
|
||||||
crush_hashmix(y, d, hash);
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __u32 crush_hash32_5(__u32 a, __u32 b, __u32 c,
|
|
||||||
__u32 d, __u32 e)
|
|
||||||
{
|
|
||||||
__u32 hash = crush_hash_seed ^ a ^ b ^ c ^ d ^ e;
|
|
||||||
__u32 x = 231232;
|
|
||||||
__u32 y = 1232;
|
|
||||||
crush_hashmix(a, b, hash);
|
|
||||||
crush_hashmix(c, d, hash);
|
|
||||||
crush_hashmix(e, x, hash);
|
|
||||||
crush_hashmix(y, a, hash);
|
|
||||||
crush_hashmix(b, x, hash);
|
|
||||||
crush_hashmix(y, c, hash);
|
|
||||||
crush_hashmix(d, x, hash);
|
|
||||||
crush_hashmix(y, e, hash);
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user