From 5d1f5103e20dc2a03ebf197434f539f89718ae07 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Aug 01 2019 18:34:48 +0000 Subject: import bcc-0.8.0-2.el8 --- diff --git a/.bcc.metadata b/.bcc.metadata new file mode 100644 index 0000000..4c0f80b --- /dev/null +++ b/.bcc.metadata @@ -0,0 +1 @@ +168b517240fd27aaa48f480d2470907fe1875dac SOURCES/bcc-0.8.0.tar.gz diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8294aed --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/bcc-0.8.0.tar.gz diff --git a/SOURCES/bcc-0.8.0-print_log2_hist-check-and-skip-possible-paddings-215.patch b/SOURCES/bcc-0.8.0-print_log2_hist-check-and-skip-possible-paddings-215.patch new file mode 100644 index 0000000..de3dbc3 --- /dev/null +++ b/SOURCES/bcc-0.8.0-print_log2_hist-check-and-skip-possible-paddings-215.patch @@ -0,0 +1,50 @@ +From 3f7b59660037c0d5dea785d115df25d9b95f07dc Mon Sep 17 00:00:00 2001 +From: Xiaozhou Liu +Date: Mon, 21 Jan 2019 11:23:42 +0800 +Subject: [PATCH] print_log2_hist(): check and skip possible paddings (#2155) + +Address issue 2154. + +When a struct S is used as key to a BPF_HISTOGRAM, it is assumed that the second +member of S holds the slot. But when S is converted to python from bpf C, +a padding may be inserted as a second member. This breaks print_log2_hist(). + + root@debian:~/bcc/tools# ./softirqs.py -d + Tracing soft irq event time... Hit Ctrl-C to end. + ^C + Traceback (most recent call last): + File "./softirqs.py", line 144, in + dist.print_log2_hist(label, "softirq", section_print_fn=vec_to_name) + File "/usr/local/lib/python2.7/dist-packages/bcc/table.py", line 326, in print_log2_hist + vals[slot] = v.value + TypeError: list indices must be integers, not str + +Fix it by skipping the possible padding. Future work would be fixing/working +around in the library where the padding is introduced. +--- + src/python/bcc/table.py | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/src/python/bcc/table.py b/src/python/bcc/table.py +index 6f598353..f6449de7 100644 +--- a/src/python/bcc/table.py ++++ b/src/python/bcc/table.py +@@ -317,6 +317,15 @@ linear_index_max = 1025 + tmp = {} + f1 = self.Key._fields_[0][0] + f2 = self.Key._fields_[1][0] ++ ++ # The above code assumes that self.Key._fields_[1][0] holds the ++ # slot. But a padding member may have been inserted here, which ++ # breaks the assumption and leads to chaos. ++ # TODO: this is a quick fix. Fixing/working around in the BCC ++ # internal library is the right thing to do. ++ if f2 == '__pad_1' and len(self.Key._fields_) == 3: ++ f2 = self.Key._fields_[2][0] ++ + for k, v in self.items(): + bucket = getattr(k, f1) + if bucket_fn: +-- +2.20.1 + diff --git a/SOURCES/bcc-0.8.0-tools-fix-some-python3-bytes-vs-strings-issues-2205.patch b/SOURCES/bcc-0.8.0-tools-fix-some-python3-bytes-vs-strings-issues-2205.patch new file mode 100644 index 0000000..7942084 --- /dev/null +++ b/SOURCES/bcc-0.8.0-tools-fix-some-python3-bytes-vs-strings-issues-2205.patch @@ -0,0 +1,111 @@ +From f03beca4d6e6bc3fa7089416d752387bd26904dc Mon Sep 17 00:00:00 2001 +From: Jerome Marchand +Date: Fri, 15 Feb 2019 17:35:37 +0100 +Subject: [PATCH] tools: fix some python3 bytes vs strings issues (#2205) + +It fixes the following errors: + +$ execsnoop.py -q +PCOMM PID PPID RET ARGS +Traceback (most recent call last): + File "_ctypes/callbacks.c", line 234, in 'calling callback function' + File "/usr/lib/python3.6/site-packages/bcc/table.py", line 572, in raw_cb_ + callback(cpu, data, size) + File "tools/execsnoop.py", line 229, in print_event + for arg in argv[event.pid] + File "tools/execsnoop.py", line 229, in + for arg in argv[event.pid] +TypeError: a bytes-like object is required, not 'str' + +$ offcputime.py -K -f 5 +Traceback (most recent call last): + File "./tools/offcputime.py", line 298, in + print("%s %d" % (";".join(line), v.value)) +TypeError: sequence item 1: expected str instance, bytes found + +$ offwaketime.py -f 5 +Traceback (most recent call last): + File "./tools/offwaketime.py", line 350, in + print("%s %d" % (";".join(line), v.value)) +TypeError: sequence item 1: expected str instance, bytes found +--- + tools/execsnoop.py | 2 +- + tools/offcputime.py | 6 ++++-- + tools/offwaketime.py | 8 ++++---- + 3 files changed, 9 insertions(+), 7 deletions(-) + +diff --git a/tools/execsnoop.py b/tools/execsnoop.py +index c4021165..1ce83e07 100755 +--- a/tools/execsnoop.py ++++ b/tools/execsnoop.py +@@ -210,7 +210,7 @@ argv = defaultdict(list) + skip = True + if args.quote: + argv[event.pid] = [ +- "\"" + arg.replace("\"", "\\\"") + "\"" ++ b"\"" + arg.replace(b"\"", b"\\\"") + b"\"" + for arg in argv[event.pid] + ] + +diff --git a/tools/offcputime.py b/tools/offcputime.py +index d84ae529..ac3b7281 100755 +--- a/tools/offcputime.py ++++ b/tools/offcputime.py +@@ -288,13 +288,15 @@ stack_traces = b.get_table("stack_traces") + if stack_id_err(k.user_stack_id): + line.append("[Missed User Stack]") + else: +- line.extend([b.sym(addr, k.tgid) for addr in reversed(user_stack)]) ++ line.extend([b.sym(addr, k.tgid).decode('utf-8', 'replace') ++ for addr in reversed(user_stack)]) + if not args.user_stacks_only: + line.extend(["-"] if (need_delimiter and k.kernel_stack_id >= 0 and k.user_stack_id >= 0) else []) + if stack_id_err(k.kernel_stack_id): + line.append("[Missed Kernel Stack]") + else: +- line.extend([b.ksym(addr) for addr in reversed(kernel_stack)]) ++ line.extend([b.ksym(addr).decode('utf-8', 'replace') ++ for addr in reversed(kernel_stack)]) + print("%s %d" % (";".join(line), v.value)) + else: + # print default multi-line stack output +diff --git a/tools/offwaketime.py b/tools/offwaketime.py +index 38a9ff25..4a1cebab 100755 +--- a/tools/offwaketime.py ++++ b/tools/offwaketime.py +@@ -323,28 +323,28 @@ need_delimiter = args.delimited and not (args.kernel_stacks_only or + if stack_id_err(k.t_u_stack_id): + line.append("[Missed User Stack]") + else: +- line.extend([b.sym(addr, k.t_tgid) ++ line.extend([b.sym(addr, k.t_tgid).decode('utf-8', 'replace') + for addr in reversed(list(target_user_stack)[1:])]) + if not args.user_stacks_only: + line.extend(["-"] if (need_delimiter and k.t_k_stack_id > 0 and k.t_u_stack_id > 0) else []) + if stack_id_err(k.t_k_stack_id): + line.append("[Missed Kernel Stack]") + else: +- line.extend([b.ksym(addr) ++ line.extend([b.ksym(addr).decode('utf-8', 'replace') + for addr in reversed(list(target_kernel_stack)[1:])]) + line.append("--") + if not args.user_stacks_only: + if stack_id_err(k.w_k_stack_id): + line.append("[Missed Kernel Stack]") + else: +- line.extend([b.ksym(addr) ++ line.extend([b.ksym(addr).decode('utf-8', 'replace') + for addr in reversed(list(waker_kernel_stack))]) + if not args.kernel_stacks_only: + line.extend(["-"] if (need_delimiter and k.w_u_stack_id > 0 and k.w_k_stack_id > 0) else []) + if stack_id_err(k.w_u_stack_id): + line.append("[Missed User Stack]") + else: +- line.extend([b.sym(addr, k.w_tgid) ++ line.extend([b.sym(addr, k.w_tgid).decode('utf-8', 'replace') + for addr in reversed(list(waker_user_stack))]) + line.append(k.waker.decode('utf-8', 'replace')) + print("%s %d" % (";".join(line), v.value)) +-- +2.20.1 + diff --git a/SOURCES/bcc-0.8.0-usdt-s390x.patch b/SOURCES/bcc-0.8.0-usdt-s390x.patch new file mode 100644 index 0000000..54670c3 --- /dev/null +++ b/SOURCES/bcc-0.8.0-usdt-s390x.patch @@ -0,0 +1,180 @@ +From ba41501bb2ca89312061b31c08e570a11c092370 Mon Sep 17 00:00:00 2001 +From: mephi42 +Date: Tue, 12 Mar 2019 07:02:56 +0100 +Subject: [PATCH] Add basic USDT support for s390x (#2266) + +Approach and code shamelessly borrowed from "422db709: Add basic USDT +support for powerpc64". +--- + src/cc/usdt.h | 7 +++++ + src/cc/usdt/usdt.cc | 2 ++ + src/cc/usdt/usdt_args.cc | 53 ++++++++++++++++++++++++++++++++++++++ + tests/cc/test_usdt_args.cc | 46 +++++++++++++++++++++++++++++++++ + 4 files changed, 108 insertions(+) + +diff --git a/src/cc/usdt.h b/src/cc/usdt.h +index 6d89fd644..406cfd546 100644 +--- a/src/cc/usdt.h ++++ b/src/cc/usdt.h +@@ -81,6 +81,7 @@ class Argument { + friend class ArgumentParser; + friend class ArgumentParser_aarch64; + friend class ArgumentParser_powerpc64; ++ friend class ArgumentParser_s390x; + friend class ArgumentParser_x64; + }; + +@@ -130,6 +131,12 @@ class ArgumentParser_powerpc64 : public ArgumentParser { + ArgumentParser_powerpc64(const char *arg) : ArgumentParser(arg) {} + }; + ++class ArgumentParser_s390x : public ArgumentParser { ++public: ++ bool parse(Argument *dest); ++ ArgumentParser_s390x(const char *arg) : ArgumentParser(arg) {} ++}; ++ + class ArgumentParser_x64 : public ArgumentParser { + private: + enum Register { +diff --git a/src/cc/usdt/usdt.cc b/src/cc/usdt/usdt.cc +index 0914fe3a5..c91faa016 100644 +--- a/src/cc/usdt/usdt.cc ++++ b/src/cc/usdt/usdt.cc +@@ -40,6 +40,8 @@ Location::Location(uint64_t addr, const std::string &bin_path, const char *arg_f + ArgumentParser_aarch64 parser(arg_fmt); + #elif __powerpc64__ + ArgumentParser_powerpc64 parser(arg_fmt); ++#elif __s390x__ ++ ArgumentParser_s390x parser(arg_fmt); + #else + ArgumentParser_x64 parser(arg_fmt); + #endif +diff --git a/src/cc/usdt/usdt_args.cc b/src/cc/usdt/usdt_args.cc +index b27e515f4..3e2045575 100644 +--- a/src/cc/usdt/usdt_args.cc ++++ b/src/cc/usdt/usdt_args.cc +@@ -285,6 +285,59 @@ bool ArgumentParser_powerpc64::parse(Argument *dest) { + return true; + } + ++bool ArgumentParser_s390x::parse(Argument *dest) { ++ if (done()) ++ return false; ++ ++ bool matched; ++ std::cmatch matches; ++#define S390X_IMM "(-?[0-9]+)" ++ std::regex arg_n_regex("^" S390X_IMM "@"); ++ // ++ std::regex arg_op_regex_imm("^" S390X_IMM "(?: +|$)"); ++ // %r ++#define S390X_REG "%r([0-9]|1[0-5])" ++ std::regex arg_op_regex_reg("^" S390X_REG "(?: +|$)"); ++ // (%r,%r) ++ std::regex arg_op_regex_mem("^" S390X_IMM "?\\(" S390X_REG ++ "(?:," S390X_REG ")?\\)(?: +|$)"); ++#undef S390X_IMM ++#undef S390X_REG ++ ++ matched = std::regex_search(arg_ + cur_pos_, matches, arg_n_regex); ++ if (matched) { ++ dest->arg_size_ = stoi(matches.str(1)); ++ cur_pos_ += matches.length(0); ++ ++ if (std::regex_search(arg_ + cur_pos_, matches, arg_op_regex_imm)) { ++ dest->constant_ = stoi(matches.str(1)); ++ } else if (std::regex_search(arg_ + cur_pos_, matches, arg_op_regex_reg)) { ++ dest->base_register_name_ = "gprs[" + matches.str(1) + "]"; ++ } else if (std::regex_search(arg_ + cur_pos_, matches, arg_op_regex_mem)) { ++ if (matches.length(1) > 0) { ++ dest->deref_offset_ = stoi(matches.str(1)); ++ } ++ dest->base_register_name_ = "gprs[" + matches.str(2) + "]"; ++ if (matches.length(3) > 0) { ++ dest->index_register_name_ = "gprs[" + matches.str(3) + "]"; ++ } ++ } else { ++ matched = false; ++ } ++ } ++ ++ if (!matched) { ++ print_error(cur_pos_); ++ skip_until_whitespace_from(cur_pos_); ++ skip_whitespace_from(cur_pos_); ++ return false; ++ } ++ ++ cur_pos_ += matches.length(0); ++ skip_whitespace_from(cur_pos_); ++ return true; ++} ++ + ssize_t ArgumentParser_x64::parse_identifier(ssize_t pos, + optional *result) { + if (isalpha(arg_[pos]) || arg_[pos] == '_') { +diff --git a/tests/cc/test_usdt_args.cc b/tests/cc/test_usdt_args.cc +index 3a96c5aac..db1f8c8e6 100644 +--- a/tests/cc/test_usdt_args.cc ++++ b/tests/cc/test_usdt_args.cc +@@ -58,6 +58,8 @@ TEST_CASE("test usdt argument parsing", "[usdt]") { + USDT::ArgumentParser_aarch64 parser("4@[x32,200]"); + #elif __powerpc64__ + USDT::ArgumentParser_powerpc64 parser("4@-12(42)"); ++#elif __s390x__ ++ USDT::ArgumentParser_s390x parser("4@-12(%r42)"); + #elif defined(__x86_64__) + USDT::ArgumentParser_x64 parser("4@i%ra+1r"); + #endif +@@ -121,6 +123,50 @@ TEST_CASE("test usdt argument parsing", "[usdt]") { + verify_register(parser, 2, 1097); + verify_register(parser, 4, "gpr[30]", 108); + verify_register(parser, -2, "gpr[31]", -4); ++#elif __s390x__ ++ USDT::ArgumentParser_s390x parser( ++ "-4@%r0 8@%r0 8@0 4@0(%r0) -2@0(%r0) " ++ "1@%r0 -2@%r3 -8@9 -1@0(%r4) -4@16(%r6) " ++ "2@%r7 4@%r11 4@-67 8@-16(%r15) 1@-52(%r11) " ++ "-8@%r4 -8@%r14 2@-11 -2@14(%r13) -8@-32(%r12) " ++ "4@%r5 2@%r11 -8@-693 -1@-23(%r10) 4@28(%r9) " ++ "-2@%r3 -4@%r8 2@1097 4@108(%r7) -2@-4(%r6)"); ++ ++ verify_register(parser, -4, "gprs[0]"); ++ verify_register(parser, 8, "gprs[0]"); ++ verify_register(parser, 8, 0); ++ verify_register(parser, 4, "gprs[0]", 0); ++ verify_register(parser, -2, "gprs[0]", 0); ++ ++ verify_register(parser, 1, "gprs[0]"); ++ verify_register(parser, -2, "gprs[3]"); ++ verify_register(parser, -8, 9); ++ verify_register(parser, -1, "gprs[4]", 0); ++ verify_register(parser, -4, "gprs[6]", 16); ++ ++ verify_register(parser, 2, "gprs[7]"); ++ verify_register(parser, 4, "gprs[11]"); ++ verify_register(parser, 4, -67); ++ verify_register(parser, 8, "gprs[15]", -16); ++ verify_register(parser, 1, "gprs[11]", -52); ++ ++ verify_register(parser, -8, "gprs[4]"); ++ verify_register(parser, -8, "gprs[14]"); ++ verify_register(parser, 2, -11); ++ verify_register(parser, -2, "gprs[13]", 14); ++ verify_register(parser, -8, "gprs[12]", -32); ++ ++ verify_register(parser, 4, "gprs[5]"); ++ verify_register(parser, 2, "gprs[11]"); ++ verify_register(parser, -8, -693); ++ verify_register(parser, -1, "gprs[10]", -23); ++ verify_register(parser, 4, "gprs[9]", 28); ++ ++ verify_register(parser, -2, "gprs[3]"); ++ verify_register(parser, -4, "gprs[8]"); ++ verify_register(parser, 2, 1097); ++ verify_register(parser, 4, "gprs[7]", 108); ++ verify_register(parser, -2, "gprs[6]", -4); + #elif defined(__x86_64__) + USDT::ArgumentParser_x64 parser( + "-4@$0 8@$1234 %rdi %rax %rsi " diff --git a/SPECS/bcc.spec b/SPECS/bcc.spec new file mode 100644 index 0000000..796757e --- /dev/null +++ b/SPECS/bcc.spec @@ -0,0 +1,301 @@ +# luajit is not available RHEL 8 +%bcond_with lua + +%bcond_without llvm_static + +Name: bcc +Version: 0.8.0 +Release: 2%{?dist} +Summary: BPF Compiler Collection (BCC) +License: ASL 2.0 +URL: https://github.com/iovisor/bcc +Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz +Patch0: %{name}-%{version}-usdt-s390x.patch +Patch1: %{name}-%{version}-print_log2_hist-check-and-skip-possible-paddings-215.patch +Patch2: %{name}-%{version}-tools-fix-some-python3-bytes-vs-strings-issues-2205.patch + +# Arches will be included as upstream support is added and dependencies are +# satisfied in the respective arches +ExcludeArch: i686 + +BuildRequires: bison, cmake >= 2.8.7, flex, libxml2-devel +BuildRequires: python3-devel +BuildRequires: elfutils-libelf-devel +BuildRequires: llvm-devel +BuildRequires: clang-devel +BuildRequires: ncurses-devel +%if %{with lua} +BuildRequires: pkgconfig(luajit) +%endif +%if %{with llvm_static} +BuildRequires: llvm-static +%endif + +BuildRequires: clang + +Requires: %{name}-tools = %{version}-%{release} + +%description +BCC is a toolkit for creating efficient kernel tracing and manipulation +programs, and includes several useful tools and examples. It makes use of +extended BPF (Berkeley Packet Filters), formally known as eBPF, a new feature +that was first added to Linux 3.15. BCC makes BPF programs easier to write, +with kernel instrumentation in C (and includes a C wrapper around LLVM), and +front-ends in Python and lua. It is suited for many tasks, including +performance analysis and network traffic control. + + +%package devel +Summary: Shared library for BPF Compiler Collection (BCC) +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description devel +The %{name}-devel package contains libraries and header files for developing +application that use BPF Compiler Collection (BCC). + + +%package doc +Summary: Examples for BPF Compiler Collection (BCC) +Recommends: python3-%{name} = %{version}-%{release} +%if %{with lua} +Recommends: %{name}-lua = %{version}-%{release} +%endif +BuildArch: noarch + +%description doc +Examples for BPF Compiler Collection (BCC) + + +%package -n python3-%{name} +Summary: Python3 bindings for BPF Compiler Collection (BCC) +Requires: %{name}%{?_isa} = %{version}-%{release} +%{?python_provide:%python_provide python3-%{srcname}} + +%description -n python3-%{name} +Python3 bindings for BPF Compiler Collection (BCC) + + +%if %{with lua} +%package lua +Summary: Standalone tool to run BCC tracers written in Lua +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description lua +Standalone tool to run BCC tracers written in Lua +%endif + + +%package tools +Summary: Command line tools for BPF Compiler Collection (BCC) +Requires: python3-%{name} = %{version}-%{release} +Requires: python3-netaddr +Requires: kernel-devel + +%description tools +Command line tools for BPF Compiler Collection (BCC) + +%prep +%autosetup -p1 + +%build +%cmake . \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DREVISION_LAST=%{version} -DREVISION=%{version} -DPYTHON_CMD=python3 +%make_build + +%install +%make_install + +# Fix python shebangs +# This messes the timestamp and rpmdiff complains about it +# Let's set the all thing according to a reference file +touch -r %{buildroot}%{_datadir}/%{name}/examples/hello_world.py %{_tmppath}/timestamp + +find %{buildroot}%{_datadir}/%{name}/{tools,examples} -type f -exec \ + sed -i -e '1s=^#!/usr/bin/python\([0-9.]\+\)\?$=#!%{__python3}=' \ + -e '1s=^#!/usr/bin/env python\([0-9.]\+\)\?$=#!%{__python3}=' \ + -e '1s=^#!/usr/bin/env bcc-lua$=#!/usr/bin/bcc-lua=' {} \; + +for i in `find %{buildroot}%{_datadir}/%{name}/examples/` ; do + touch -h -r %{_tmppath}/timestamp $i +done + +# Move man pages to the right location +mkdir -p %{buildroot}%{_mandir} +mv %{buildroot}%{_datadir}/%{name}/man/* %{buildroot}%{_mandir}/ +# Avoid conflict with other manpages +# https://bugzilla.redhat.com/show_bug.cgi?id=1517408 +for i in `find %{buildroot}%{_mandir} -name "*.gz"`; do + tname=$(basename $i) + rename $tname %{name}-$tname $i +done +# Fix the symlink too +for i in `find %{buildroot}%{_mandir} -lname \*.gz` ; do + target=`readlink $i`; + ln -sf bcc-$target $i; +done + +# We cannot run the test suit since it requires root and it makes changes to +# the machine (e.g, IP address) +#%check + +%ldconfig_scriptlets + +%files +%doc README.md +%license LICENSE.txt +%{_libdir}/lib%{name}.so.* +%{_libdir}/libbpf.so.* + +%files devel +%{_libdir}/lib%{name}.so +%{_libdir}/libbpf.so +%{_libdir}/pkgconfig/lib%{name}.pc +%{_includedir}/%{name}/ + +%files -n python3-%{name} +%{python3_sitelib}/%{name}* + +%files doc +# % dir % {_docdir}/% {name} +%doc %{_datadir}/%{name}/examples/ +%if %{without lua} +%exclude %{_datadir}/%{name}/examples/lua +%endif + +%files tools +%dir %{_datadir}/%{name} +%dir %{_datadir}/%{name}/tools +%dir %{_datadir}/%{name}/introspection +%{_datadir}/%{name}/tools/* +%{_datadir}/%{name}/introspection/* +%exclude %{_datadir}/%{name}/tools/old/ +# inject relies on BPF_KPROBE_OVERRIDE which is not set on RHEL 8 +%exclude %{_datadir}/%{name}/tools/inject +%exclude %{_datadir}/%{name}/tools/doc/inject_example.txt +%exclude %{_mandir}/man8/bcc-inject.8.gz +# Neither btrfs nor zfs are available on RHEL8 +%exclude %{_datadir}/%{name}/tools/btrfs* +%exclude %{_datadir}/%{name}/tools/doc/btrfs* +%exclude %{_mandir}/man8/bcc-btrfs* +%exclude %{_datadir}/%{name}/tools/zfs* +%exclude %{_datadir}/%{name}/tools/doc/zfs* +%exclude %{_mandir}/man8/bcc-zfs* +%{_mandir}/man8/* + +%if %{with lua} +%files lua +%{_bindir}/bcc-lua +%endif + + +%changelog +* Wed May 15 2019 Jerome Marchand - 0.8.0-2 +- Rebuild for llvm 8 + +* Thu Apr 11 2019 Jerome Marchand - 0.8.0-1 +- Rebase on bcc-8.0.0 +- Replace the temporary s390x workaround by a proper fix +- Remove the doc of excluded tool from the package +- Fix print_log2_hist +- Fix yet a few other python3 bytes vs strings issues + +* Mon Mar 25 2019 Jerome Marchand - 0.7.0-6 +- Add CI gating + +* Thu Dec 13 2018 Jerome Marchand - 0.7.0-5 +- Fix biolatency -D +- Fix biotop manpage +- Rebuild for LLVM 7.0.1 (from Tom Stellard) + +* Mon Dec 10 2018 Jerome Marchand - 0.7.0-4 +- Fix bio* tools + +* Mon Nov 05 2018 Jerome Marchand - 0.7.0-3 +- Fix multiple bytes/string encoding issues +- Fix misc covscan warning + +* Mon Oct 15 2018 Tom Stellard - 0.7.0-2 +- Drop explicit dependency on clang-libs + +* Fri Oct 12 2018 Jerome Marchand - 0.7.0-1 +- Rebase on bcc-7.0.0 +- Remove useless tools (zfs*, btrfs* and inject) + +* Thu Sep 20 2018 Jerome Marchand - 0.6.1-1 +- Rebase on bcc-0.6.1 + +* Thu Sep 20 2018 Jerome Marchand - 0.6.0-6 +- llcstat: print a nicer error message on virtual machine +- Add NSS support to sslsniff +- Fixes miscellaneous error uncovered by covscan + +* Wed Aug 08 2018 Tom Stellard - 0.6.0-5 +- Use llvm-toolset-6.0 prefix for clang-libs dependency + +* Fri Aug 03 2018 Tom Stellard - 0.6.0-4 +- Rebuld for llvm-toolset-6.0 + +* Wed Jul 18 2018 Jerome Marchand - 0.6.0-3 + - Disable lua on all arches + +* Tue Jun 26 2018 Jerome Marchand - 0.6.0-2 +- Add clang-libs requirement +- Fix manpages symlinks + +* Tue Jun 19 2018 Jerome Marchand - 0.6.0-1 +- Rebase on bcc-0.6.0 + +* Thu May 24 2018 Jerome Marchand - 0.5.0-5 +- Enables build on ppc64(le) and s390x arches + +* Thu Apr 05 2018 Rafael Santos - 0.5.0-4 +- Resolves #1555627 - fix compilation error with latest llvm/clang + +* Wed Feb 07 2018 Fedora Release Engineering - 0.5.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Fri Feb 02 2018 Igor Gnatenko - 0.5.0-2 +- Switch to %%ldconfig_scriptlets + +* Wed Jan 03 2018 Rafael Santos - 0.5.0-1 +- Rebase to new released version + +* Thu Nov 16 2017 Rafael Santos - 0.4.0-4 +- Resolves #1517408 - avoid conflict with other manpages + +* Thu Nov 02 2017 Rafael Santos - 0.4.0-3 +- Use weak deps to not require lua subpkg on ppc64(le) + +* Wed Nov 01 2017 Igor Gnatenko - 0.4.0-2 +- Rebuild for LLVM5 + +* Wed Nov 01 2017 Rafael Fonseca - 0.4.0-1 +- Resolves #1460482 - rebase to new release +- Resolves #1505506 - add support for LLVM 5.0 +- Resolves #1460482 - BPF module compilation issue +- Partially address #1479990 - location of man pages +- Enable ppc64(le) support without lua +- Soname versioning for libbpf by ignatenkobrain + +* Wed Aug 02 2017 Fedora Release Engineering - 0.3.0-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 0.3.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Thu Mar 30 2017 Igor Gnatenko - 0.3.0-2 +- Rebuild for LLVM4 +- Trivial fixes in spec + +* Fri Mar 10 2017 Rafael Fonseca - 0.3.0-1 +- Rebase to new release. + +* Fri Feb 10 2017 Fedora Release Engineering - 0.2.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Tue Jan 10 2017 Rafael Fonseca - 0.2.0-2 +- Fix typo + +* Tue Nov 29 2016 Rafael Fonseca - 0.2.0-1 +- Initial import