Xin Hao wrote: > The relative functions is copy from bcc tools > source code: libbpf-tools/trace_helpers.c. > URL: https://github.com/iovisor/bcc.git > > Log2 histogram can display the change of the collected > data more conveniently. > > Signed-off-by: Xin Hao <xhao@xxxxxxxxxxxxxxxxx> > --- > samples/bpf/common.h | 67 ++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 67 insertions(+) > create mode 100644 samples/bpf/common.h > > diff --git a/samples/bpf/common.h b/samples/bpf/common.h > new file mode 100644 > index 000000000000..ec60fb665544 > --- /dev/null > +++ b/samples/bpf/common.h > @@ -0,0 +1,67 @@ > +/* SPDX-License-Identifier: GPL-2.0 > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of version 2 of the GNU General Public > + * License as published by the Free Software Foundation. > + */ > + nit, for this patch and the last one we don't need the text. Just the SPDX identifier should be enough. Its at least in line with everything we have elsewhere. Also if there is a copyright on that original file we should pull it over as far as I understand it. I don't see anything there though so maybe not. > +#define min(x, y) ({ \ > + typeof(x) _min1 = (x); \ > + typeof(y) _min2 = (y); \ > + (void) (&_min1 == &_min2); \ > + _min1 < _min2 ? _min1 : _min2; }) What was wrong with 'min(a,b) ((a) < (b) ? (a) : (b))' looks like below its just used for comparing two unsigned ints? Thanks. > + > +static void print_stars(unsigned int val, unsigned int val_max, int width) > +{ > + int num_stars, num_spaces, i; > + bool need_plus; > + > + num_stars = min(val, val_max) * width / val_max; > + num_spaces = width - num_stars; > + need_plus = val > val_max; > + > + for (i = 0; i < num_stars; i++) > + printf("*"); > + for (i = 0; i < num_spaces; i++) > + printf(" "); > + if (need_plus) > + printf("+"); > +} > + > +static void print_log2_hist(unsigned int *vals, int vals_size, char *val_type) > +{ > + int stars_max = 40, idx_max = -1; > + unsigned int val, val_max = 0; > + unsigned long long low, high; > + int stars, width, i; > + > + for (i = 0; i < vals_size; i++) { > + val = vals[i]; > + if (val > 0) > + idx_max = i; > + if (val > val_max) > + val_max = val; > + } > + > + if (idx_max < 0) > + return; > + > + printf("%*s%-*s : count distribution\n", idx_max <= 32 ? 5 : 15, "", > + idx_max <= 32 ? 19 : 29, val_type); > + if (idx_max <= 32) > + stars = stars_max; > + else > + stars = stars_max / 2; > + > + for (i = 0; i <= idx_max; i++) { > + low = (1ULL << (i + 1)) >> 1; > + high = (1ULL << (i + 1)) - 1; > + if (low == high) > + low -= 1; > + val = vals[i]; > + width = idx_max <= 32 ? 10 : 20; > + printf("%*lld -> %-*lld : %-8d |", width, low, width, high, val); > + print_stars(val, val_max, stars); > + printf("|\n"); > + } > +} > -- > 2.28.0 >