util: add histogram as param to internal functions

No functional change - this just reduces the diff for
some upcoming changes.

Signed-off-by: Jim Harris <james.r.harris@intel.com>
Change-Id: Ic185d32b38d5ccbc81cab49a6a38ebde0da71afd

Reviewed-on: https://review.gerrithub.io/392705
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Jim Harris 2017-12-21 13:12:46 -07:00 committed by Daniel Verkamp
parent ea17499c6c
commit 87b8c7db3c

View File

@ -45,11 +45,11 @@
extern "C" { extern "C" {
#endif #endif
#define SPDK_HISTOGRAM_BUCKET_SHIFT 7 #define SPDK_HISTOGRAM_BUCKET_SHIFT(h) 7
#define SPDK_HISTOGRAM_BUCKET_LSB (64 - SPDK_HISTOGRAM_BUCKET_SHIFT) #define SPDK_HISTOGRAM_BUCKET_LSB(h) (64 - SPDK_HISTOGRAM_BUCKET_SHIFT(h))
#define SPDK_HISTOGRAM_NUM_BUCKETS_PER_RANGE (1ULL << SPDK_HISTOGRAM_BUCKET_SHIFT) #define SPDK_HISTOGRAM_NUM_BUCKETS_PER_RANGE(h) (1ULL << SPDK_HISTOGRAM_BUCKET_SHIFT(h))
#define SPDK_HISTOGRAM_BUCKET_MASK (SPDK_HISTOGRAM_NUM_BUCKETS_PER_RANGE - 1) #define SPDK_HISTOGRAM_BUCKET_MASK(h) (SPDK_HISTOGRAM_NUM_BUCKETS_PER_RANGE(h) - 1)
#define SPDK_HISTOGRAM_NUM_BUCKET_RANGES (SPDK_HISTOGRAM_BUCKET_LSB + 1) #define SPDK_HISTOGRAM_NUM_BUCKET_RANGES(h) (SPDK_HISTOGRAM_BUCKET_LSB(h) + 1)
/* /*
* SPDK histograms are implemented using ranges of bucket arrays. The most common usage * SPDK histograms are implemented using ranges of bucket arrays. The most common usage
@ -83,7 +83,11 @@ extern "C" {
struct spdk_histogram_data { struct spdk_histogram_data {
uint64_t bucket[SPDK_HISTOGRAM_NUM_BUCKET_RANGES][SPDK_HISTOGRAM_NUM_BUCKETS_PER_RANGE]; /*
* "x" is just a filler here for now - a future patch will make this a dynamic array of
* uint64_t's and this will go away.
*/
uint64_t bucket[SPDK_HISTOGRAM_NUM_BUCKET_RANGES(x)][SPDK_HISTOGRAM_NUM_BUCKETS_PER_RANGE(x)];
}; };
@ -94,7 +98,7 @@ spdk_histogram_data_reset(struct spdk_histogram_data *histogram)
} }
static inline uint32_t static inline uint32_t
__spdk_histogram_data_get_bucket_range(uint64_t datapoint) __spdk_histogram_data_get_bucket_range(struct spdk_histogram_data *h, uint64_t datapoint)
{ {
uint32_t clz, range; uint32_t clz, range;
@ -102,8 +106,8 @@ __spdk_histogram_data_get_bucket_range(uint64_t datapoint)
clz = __builtin_clzll(datapoint); clz = __builtin_clzll(datapoint);
if (clz <= SPDK_HISTOGRAM_BUCKET_LSB) { if (clz <= SPDK_HISTOGRAM_BUCKET_LSB(h)) {
range = SPDK_HISTOGRAM_BUCKET_LSB - clz; range = SPDK_HISTOGRAM_BUCKET_LSB(h) - clz;
} else { } else {
range = 0; range = 0;
} }
@ -112,7 +116,8 @@ __spdk_histogram_data_get_bucket_range(uint64_t datapoint)
} }
static inline uint32_t static inline uint32_t
__spdk_histogram_data_get_bucket_index(uint64_t datapoint, uint32_t range) __spdk_histogram_data_get_bucket_index(struct spdk_histogram_data *h, uint64_t datapoint,
uint32_t range)
{ {
uint32_t shift; uint32_t shift;
@ -122,26 +127,27 @@ __spdk_histogram_data_get_bucket_index(uint64_t datapoint, uint32_t range)
shift = range - 1; shift = range - 1;
} }
return (datapoint >> shift) & SPDK_HISTOGRAM_BUCKET_MASK; return (datapoint >> shift) & SPDK_HISTOGRAM_BUCKET_MASK(h);
} }
static inline void static inline void
spdk_histogram_data_tally(struct spdk_histogram_data *histogram, uint64_t datapoint) spdk_histogram_data_tally(struct spdk_histogram_data *histogram, uint64_t datapoint)
{ {
uint32_t range = __spdk_histogram_data_get_bucket_range(datapoint); uint32_t range = __spdk_histogram_data_get_bucket_range(histogram, datapoint);
uint32_t index = __spdk_histogram_data_get_bucket_index(datapoint, range); uint32_t index = __spdk_histogram_data_get_bucket_index(histogram, datapoint, range);
histogram->bucket[range][index]++; histogram->bucket[range][index]++;
} }
static inline uint64_t static inline uint64_t
__spdk_histogram_data_get_bucket_start(uint32_t range, uint32_t index) __spdk_histogram_data_get_bucket_start(const struct spdk_histogram_data *h, uint32_t range,
uint32_t index)
{ {
uint64_t bucket; uint64_t bucket;
index += 1; index += 1;
if (range > 0) { if (range > 0) {
bucket = 1ULL << (range + SPDK_HISTOGRAM_BUCKET_SHIFT - 1); bucket = 1ULL << (range + SPDK_HISTOGRAM_BUCKET_SHIFT(h) - 1);
bucket += (uint64_t)index << (range - 1); bucket += (uint64_t)index << (range - 1);
} else { } else {
bucket = index; bucket = index;
@ -162,8 +168,8 @@ spdk_histogram_data_iterate(const struct spdk_histogram_data *histogram,
total = 0; total = 0;
for (i = 0; i < SPDK_HISTOGRAM_NUM_BUCKET_RANGES; i++) { for (i = 0; i < SPDK_HISTOGRAM_NUM_BUCKET_RANGES(histogram); i++) {
for (j = 0; j < SPDK_HISTOGRAM_NUM_BUCKETS_PER_RANGE; j++) { for (j = 0; j < SPDK_HISTOGRAM_NUM_BUCKETS_PER_RANGE(histogram); j++) {
total += histogram->bucket[i][j]; total += histogram->bucket[i][j];
} }
} }
@ -171,12 +177,12 @@ spdk_histogram_data_iterate(const struct spdk_histogram_data *histogram,
so_far = 0; so_far = 0;
bucket = 0; bucket = 0;
for (i = 0; i < SPDK_HISTOGRAM_NUM_BUCKET_RANGES; i++) { for (i = 0; i < SPDK_HISTOGRAM_NUM_BUCKET_RANGES(histogram); i++) {
for (j = 0; j < SPDK_HISTOGRAM_NUM_BUCKETS_PER_RANGE; j++) { for (j = 0; j < SPDK_HISTOGRAM_NUM_BUCKETS_PER_RANGE(histogram); j++) {
count = histogram->bucket[i][j]; count = histogram->bucket[i][j];
so_far += count; so_far += count;
last_bucket = bucket; last_bucket = bucket;
bucket = __spdk_histogram_data_get_bucket_start(i, j); bucket = __spdk_histogram_data_get_bucket_start(histogram, i, j);
fn(ctx, last_bucket, bucket, count, total, so_far); fn(ctx, last_bucket, bucket, count, total, so_far);
} }
} }