RE: [bpf-next 2/3] sample/bpf: Add log2 histogram function support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
> 





[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux