commit
562876e9df
@ -0,0 +1 @@
|
|||||||
|
059187f62e915eb74ea7b18e19fcb185f9d18255 SOURCES/bcc-0.25.0.tar.gz
|
@ -0,0 +1 @@
|
|||||||
|
SOURCES/bcc-0.25.0.tar.gz
|
@ -0,0 +1,77 @@
|
|||||||
|
From c17a12ac030c5d9c812e611f8132570af0e795af Mon Sep 17 00:00:00 2001
|
||||||
|
From: Yonghong Song <yhs@fb.com>
|
||||||
|
Date: Sat, 13 Aug 2022 17:50:07 -0700
|
||||||
|
Subject: [PATCH 1/2] Fix bpf_pseudo_fd() type conversion error
|
||||||
|
|
||||||
|
With llvm15 and llvm16, the following command line
|
||||||
|
sudo ./trace.py 'smp_call_function_single "%K", arg1'
|
||||||
|
will cause error:
|
||||||
|
/virtual/main.c:60:36: error: incompatible integer to pointer conversion passing 'u64'
|
||||||
|
(aka 'unsigned long long') to parameter of type 'void *' [-Wint-conversion]
|
||||||
|
bpf_perf_event_output(ctx, bpf_pseudo_fd(1, -1), CUR_CPU_IDENTIFIER, &__data, sizeof(__data));
|
||||||
|
^~~~~~~~~~~~~~~~~~~~
|
||||||
|
1 error generated.
|
||||||
|
Failed to compile BPF module <text>
|
||||||
|
|
||||||
|
In helpers.h, we have
|
||||||
|
u64 bpf_pseudo_fd(u64, u64) asm("llvm.bpf.pseudo");
|
||||||
|
Apparently, <= llvm14 can tolerate u64 -> 'void *' conversion, but
|
||||||
|
llvm15 by default will cause an error.
|
||||||
|
|
||||||
|
Let us explicitly convert bpf_pseudo_fd to 'void *' to avoid
|
||||||
|
such errors.
|
||||||
|
|
||||||
|
Signed-off-by: Yonghong Song <yhs@fb.com>
|
||||||
|
---
|
||||||
|
src/cc/frontends/clang/b_frontend_action.cc | 10 +++++-----
|
||||||
|
1 file changed, 5 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/cc/frontends/clang/b_frontend_action.cc b/src/cc/frontends/clang/b_frontend_action.cc
|
||||||
|
index a4e05b16..dbeba3e4 100644
|
||||||
|
--- a/src/cc/frontends/clang/b_frontend_action.cc
|
||||||
|
+++ b/src/cc/frontends/clang/b_frontend_action.cc
|
||||||
|
@@ -957,7 +957,7 @@ bool BTypeVisitor::VisitCallExpr(CallExpr *Call) {
|
||||||
|
string arg0 = rewriter_.getRewrittenText(expansionRange(Call->getArg(0)->getSourceRange()));
|
||||||
|
string args_other = rewriter_.getRewrittenText(expansionRange(SourceRange(GET_BEGINLOC(Call->getArg(1)),
|
||||||
|
GET_ENDLOC(Call->getArg(2)))));
|
||||||
|
- txt = "bpf_perf_event_output(" + arg0 + ", bpf_pseudo_fd(1, " + fd + ")";
|
||||||
|
+ txt = "bpf_perf_event_output(" + arg0 + ", (void *)bpf_pseudo_fd(1, " + fd + ")";
|
||||||
|
txt += ", CUR_CPU_IDENTIFIER, " + args_other + ")";
|
||||||
|
|
||||||
|
// e.g.
|
||||||
|
@@ -986,7 +986,7 @@ bool BTypeVisitor::VisitCallExpr(CallExpr *Call) {
|
||||||
|
string meta_len = rewriter_.getRewrittenText(expansionRange(Call->getArg(3)->getSourceRange()));
|
||||||
|
txt = "bpf_perf_event_output(" +
|
||||||
|
skb + ", " +
|
||||||
|
- "bpf_pseudo_fd(1, " + fd + "), " +
|
||||||
|
+ "(void *)bpf_pseudo_fd(1, " + fd + "), " +
|
||||||
|
"((__u64)" + skb_len + " << 32) | BPF_F_CURRENT_CPU, " +
|
||||||
|
meta + ", " +
|
||||||
|
meta_len + ");";
|
||||||
|
@@ -1006,12 +1006,12 @@ bool BTypeVisitor::VisitCallExpr(CallExpr *Call) {
|
||||||
|
string keyp = rewriter_.getRewrittenText(expansionRange(Call->getArg(1)->getSourceRange()));
|
||||||
|
string flag = rewriter_.getRewrittenText(expansionRange(Call->getArg(2)->getSourceRange()));
|
||||||
|
txt = "bpf_" + string(memb_name) + "(" + ctx + ", " +
|
||||||
|
- "bpf_pseudo_fd(1, " + fd + "), " + keyp + ", " + flag + ");";
|
||||||
|
+ "(void *)bpf_pseudo_fd(1, " + fd + "), " + keyp + ", " + flag + ");";
|
||||||
|
} else if (memb_name == "ringbuf_output") {
|
||||||
|
string name = string(Ref->getDecl()->getName());
|
||||||
|
string args = rewriter_.getRewrittenText(expansionRange(SourceRange(GET_BEGINLOC(Call->getArg(0)),
|
||||||
|
GET_ENDLOC(Call->getArg(2)))));
|
||||||
|
- txt = "bpf_ringbuf_output(bpf_pseudo_fd(1, " + fd + ")";
|
||||||
|
+ txt = "bpf_ringbuf_output((void *)bpf_pseudo_fd(1, " + fd + ")";
|
||||||
|
txt += ", " + args + ")";
|
||||||
|
|
||||||
|
// e.g.
|
||||||
|
@@ -1033,7 +1033,7 @@ bool BTypeVisitor::VisitCallExpr(CallExpr *Call) {
|
||||||
|
} else if (memb_name == "ringbuf_reserve") {
|
||||||
|
string name = string(Ref->getDecl()->getName());
|
||||||
|
string arg0 = rewriter_.getRewrittenText(expansionRange(Call->getArg(0)->getSourceRange()));
|
||||||
|
- txt = "bpf_ringbuf_reserve(bpf_pseudo_fd(1, " + fd + ")";
|
||||||
|
+ txt = "bpf_ringbuf_reserve((void *)bpf_pseudo_fd(1, " + fd + ")";
|
||||||
|
txt += ", " + arg0 + ", 0)"; // Flags in reserve are meaningless
|
||||||
|
} else if (memb_name == "ringbuf_discard") {
|
||||||
|
string name = string(Ref->getDecl()->getName());
|
||||||
|
--
|
||||||
|
2.38.1
|
||||||
|
|
@ -0,0 +1,96 @@
|
|||||||
|
From 9ae3908ae38b3e8d8e36a52c0e5664c453d4c015 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Marchand <jmarchan@redhat.com>
|
||||||
|
Date: Wed, 26 Oct 2022 14:41:54 +0200
|
||||||
|
Subject: [PATCH 2/2] Fix clang 15 int to pointer conversion errors
|
||||||
|
|
||||||
|
Since version 15, clang issues error for implicit conversion of
|
||||||
|
integer to pointer. Several tools are broken. This patch add explicit
|
||||||
|
pointer cast where needed.
|
||||||
|
|
||||||
|
Fixes the following errors:
|
||||||
|
/virtual/main.c:37:18: error: incompatible integer to pointer conversion initializing 'struct request *' with an expression of type 'unsigned long' [-Wint-conversion]
|
||||||
|
struct request *req = ctx->di;
|
||||||
|
^ ~~~~~~~
|
||||||
|
/virtual/main.c:49:18: error: incompatible integer to pointer conversion initializing 'struct request *' with an expression of type 'unsigned long' [-Wint-conversion]
|
||||||
|
struct request *req = ctx->di;
|
||||||
|
^ ~~~~~~~
|
||||||
|
2 errors generated.
|
||||||
|
|
||||||
|
/virtual/main.c:73:19: error: incompatible integer to pointer conversion initializing 'struct pt_regs *' with an expression of type 'unsigned long' [-Wint-conversion]
|
||||||
|
struct pt_regs * __ctx = ctx->di;
|
||||||
|
^ ~~~~~~~
|
||||||
|
/virtual/main.c:100:240: error: incompatible integer to pointer conversion passing 'u64' (aka 'unsigned long long') to parameter of type 'const void *' [-Wint-conversion]
|
||||||
|
data.ppid = ({ typeof(pid_t) _val; __builtin_memset(&_val, 0, sizeof(_val)); bpf_probe_read(&_val, sizeof(_val), (u64)&({ typeof(struct task_struct *) _val; __builtin_memset(&_val, 0, sizeof(_val)); bpf_probe_read(&_val, sizeof(_val), (u64)&task->real_parent); _val; })->tgid); _val; });
|
||||||
|
^~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
/virtual/main.c:100:118: error: incompatible integer to pointer conversion passing 'u64' (aka 'unsigned long long') to parameter of type 'const void *' [-Wint-conversion]
|
||||||
|
data.ppid = ({ typeof(pid_t) _val; __builtin_memset(&_val, 0, sizeof(_val)); bpf_probe_read(&_val, sizeof(_val), (u64)&({ typeof(struct task_struct *) _val; __builtin_memset(&_val, 0, sizeof(_val)); bpf_probe_read(&_val, sizeof(_val), (u64)&task->real_parent); _val; })->tgid); _val; });
|
||||||
|
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Signed-off-by: Jerome Marchand <jmarchan@redhat.com>
|
||||||
|
---
|
||||||
|
src/cc/frontends/clang/b_frontend_action.cc | 18 +++++++++---------
|
||||||
|
1 file changed, 9 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/cc/frontends/clang/b_frontend_action.cc b/src/cc/frontends/clang/b_frontend_action.cc
|
||||||
|
index dbeba3e4..c0582464 100644
|
||||||
|
--- a/src/cc/frontends/clang/b_frontend_action.cc
|
||||||
|
+++ b/src/cc/frontends/clang/b_frontend_action.cc
|
||||||
|
@@ -517,9 +517,9 @@ bool ProbeVisitor::VisitUnaryOperator(UnaryOperator *E) {
|
||||||
|
string pre, post;
|
||||||
|
pre = "({ typeof(" + E->getType().getAsString() + ") _val; __builtin_memset(&_val, 0, sizeof(_val));";
|
||||||
|
if (cannot_fall_back_safely)
|
||||||
|
- pre += " bpf_probe_read_kernel(&_val, sizeof(_val), (u64)";
|
||||||
|
+ pre += " bpf_probe_read_kernel(&_val, sizeof(_val), (void *)";
|
||||||
|
else
|
||||||
|
- pre += " bpf_probe_read(&_val, sizeof(_val), (u64)";
|
||||||
|
+ pre += " bpf_probe_read(&_val, sizeof(_val), (void *)";
|
||||||
|
post = "); _val; })";
|
||||||
|
rewriter_.ReplaceText(expansionLoc(E->getOperatorLoc()), 1, pre);
|
||||||
|
rewriter_.InsertTextAfterToken(expansionLoc(GET_ENDLOC(sub)), post);
|
||||||
|
@@ -581,9 +581,9 @@ bool ProbeVisitor::VisitMemberExpr(MemberExpr *E) {
|
||||||
|
string pre, post;
|
||||||
|
pre = "({ typeof(" + E->getType().getAsString() + ") _val; __builtin_memset(&_val, 0, sizeof(_val));";
|
||||||
|
if (cannot_fall_back_safely)
|
||||||
|
- pre += " bpf_probe_read_kernel(&_val, sizeof(_val), (u64)&";
|
||||||
|
+ pre += " bpf_probe_read_kernel(&_val, sizeof(_val), (void *)&";
|
||||||
|
else
|
||||||
|
- pre += " bpf_probe_read(&_val, sizeof(_val), (u64)&";
|
||||||
|
+ pre += " bpf_probe_read(&_val, sizeof(_val), (void *)&";
|
||||||
|
post = rhs + "); _val; })";
|
||||||
|
rewriter_.InsertText(expansionLoc(GET_BEGINLOC(E)), pre);
|
||||||
|
rewriter_.ReplaceText(expansionRange(SourceRange(member, GET_ENDLOC(E))), post);
|
||||||
|
@@ -635,9 +635,9 @@ bool ProbeVisitor::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
|
||||||
|
|
||||||
|
pre = "({ typeof(" + E->getType().getAsString() + ") _val; __builtin_memset(&_val, 0, sizeof(_val));";
|
||||||
|
if (cannot_fall_back_safely)
|
||||||
|
- pre += " bpf_probe_read_kernel(&_val, sizeof(_val), (u64)((";
|
||||||
|
+ pre += " bpf_probe_read_kernel(&_val, sizeof(_val), (void *)((";
|
||||||
|
else
|
||||||
|
- pre += " bpf_probe_read(&_val, sizeof(_val), (u64)((";
|
||||||
|
+ pre += " bpf_probe_read(&_val, sizeof(_val), (void *)((";
|
||||||
|
if (isMemberDereference(base)) {
|
||||||
|
pre += "&";
|
||||||
|
// If the base of the array subscript is a member dereference, we'll rewrite
|
||||||
|
@@ -747,8 +747,8 @@ void BTypeVisitor::genParamDirectAssign(FunctionDecl *D, string& preamble,
|
||||||
|
arg->addAttr(UnavailableAttr::CreateImplicit(C, "ptregs"));
|
||||||
|
size_t d = idx - 1;
|
||||||
|
const char *reg = calling_conv_regs[d];
|
||||||
|
- preamble += " " + text + " = " + fn_args_[0]->getName().str() + "->" +
|
||||||
|
- string(reg) + ";";
|
||||||
|
+ preamble += " " + text + " = (" + arg->getType().getAsString() + ")" +
|
||||||
|
+ fn_args_[0]->getName().str() + "->" + string(reg) + ";";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -762,7 +762,7 @@ void BTypeVisitor::genParamIndirectAssign(FunctionDecl *D, string& preamble,
|
||||||
|
|
||||||
|
if (idx == 0) {
|
||||||
|
new_ctx = "__" + arg->getName().str();
|
||||||
|
- preamble += " struct pt_regs * " + new_ctx + " = " +
|
||||||
|
+ preamble += " struct pt_regs * " + new_ctx + " = (void *)" +
|
||||||
|
arg->getName().str() + "->" +
|
||||||
|
string(calling_conv_regs[0]) + ";";
|
||||||
|
} else {
|
||||||
|
--
|
||||||
|
2.38.1
|
||||||
|
|
@ -0,0 +1,222 @@
|
|||||||
|
From 2f6565681e627d11dde0177503100669df020684 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Marchand <jmarchan@redhat.com>
|
||||||
|
Date: Sun, 28 Aug 2022 07:44:01 +0200
|
||||||
|
Subject: [PATCH] Fix some documentation issues (#4197)
|
||||||
|
|
||||||
|
* compactsnoop-manpage: fix the name of the tool in the NAME section
|
||||||
|
In its manpage, compactsnoop tools is called compacstall in the NAME
|
||||||
|
section. I don't know where that name comes from, but it should be
|
||||||
|
compactsnoop.
|
||||||
|
|
||||||
|
* dirtop-manpage: use '-d' option in the EXAMPLES section
|
||||||
|
The mandatory '-d' option of dirtop is missing in the EXAMPLES
|
||||||
|
section. Copy it from the usage message. Also remove '.py' suffixes.
|
||||||
|
|
||||||
|
* funclatency-manpage: fix typo in one of the examples
|
||||||
|
There is a spurious colon in one of the manpage examples. Remove it.
|
||||||
|
|
||||||
|
* tools/killsnoop: add '-s' option in the synopsis of the example file
|
||||||
|
Commit 33c8b1ac ("Update man page and example file") added '-s' option
|
||||||
|
to the manpage and an example in the example file, but missed the
|
||||||
|
sysnopsis in that later case.
|
||||||
|
|
||||||
|
* trace-manpage: add missing options (-c,-n,-f and -B) to the synopsis
|
||||||
|
Copy the full sysopsis from the usage message.
|
||||||
|
|
||||||
|
* tcptracer-manpage: add missing '-t' option in the manpage
|
||||||
|
Add '-t' option to the synopsis and description.
|
||||||
|
|
||||||
|
* tcpsubnet-manpage: remove '--ebpf' option from the manpage
|
||||||
|
This option is explicitly suppressed in argparse and no manpage of
|
||||||
|
other tools mentions it.
|
||||||
|
|
||||||
|
* manpages: remove '.py' suffix from the synopsis of some *snoop tools
|
||||||
|
Other manpages don't show the suffix, nor do the usage messages.
|
||||||
|
---
|
||||||
|
man/man8/bindsnoop.8 | 2 +-
|
||||||
|
man/man8/compactsnoop.8 | 4 ++--
|
||||||
|
man/man8/dirtop.8 | 8 ++++----
|
||||||
|
man/man8/drsnoop.8 | 2 +-
|
||||||
|
man/man8/funclatency.8 | 2 +-
|
||||||
|
man/man8/opensnoop.8 | 2 +-
|
||||||
|
man/man8/tcpsubnet.8 | 5 +----
|
||||||
|
man/man8/tcptracer.8 | 5 ++++-
|
||||||
|
man/man8/trace.8 | 6 ++++--
|
||||||
|
tools/killsnoop_example.txt | 2 ++
|
||||||
|
10 files changed, 21 insertions(+), 17 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/man/man8/bindsnoop.8 b/man/man8/bindsnoop.8
|
||||||
|
index f8fa1850..0eb42ccb 100644
|
||||||
|
--- a/man/man8/bindsnoop.8
|
||||||
|
+++ b/man/man8/bindsnoop.8
|
||||||
|
@@ -2,7 +2,7 @@
|
||||||
|
.SH NAME
|
||||||
|
bindsnoop \- Trace bind() system calls.
|
||||||
|
.SH SYNOPSIS
|
||||||
|
-.B bindsnoop.py [\fB-h\fP] [\fB-w\fP] [\fB-t\fP] [\fB-p\fP PID] [\fB-P\fP PORT] [\fB-E\fP] [\fB-U\fP] [\fB-u\fP UID] [\fB--count\fP] [\fB--cgroupmap MAP\fP] [\fB--mntnsmap MNTNSMAP\fP]
|
||||||
|
+.B bindsnoop [\fB-h\fP] [\fB-w\fP] [\fB-t\fP] [\fB-p\fP PID] [\fB-P\fP PORT] [\fB-E\fP] [\fB-U\fP] [\fB-u\fP UID] [\fB--count\fP] [\fB--cgroupmap MAP\fP] [\fB--mntnsmap MNTNSMAP\fP]
|
||||||
|
.SH DESCRIPTION
|
||||||
|
bindsnoop reports socket options set before the bind call that would impact this system call behavior.
|
||||||
|
.PP
|
||||||
|
diff --git a/man/man8/compactsnoop.8 b/man/man8/compactsnoop.8
|
||||||
|
index a2933d7a..e9cde0ce 100644
|
||||||
|
--- a/man/man8/compactsnoop.8
|
||||||
|
+++ b/man/man8/compactsnoop.8
|
||||||
|
@@ -1,8 +1,8 @@
|
||||||
|
.TH compactsnoop 8 "2019-11-1" "USER COMMANDS"
|
||||||
|
.SH NAME
|
||||||
|
-compactstall \- Trace compact zone events. Uses Linux eBPF/bcc.
|
||||||
|
+compactsnoop \- Trace compact zone events. Uses Linux eBPF/bcc.
|
||||||
|
.SH SYNOPSIS
|
||||||
|
-.B compactsnoop.py [\-h] [\-T] [\-p PID] [\-d DURATION] [\-K] [\-e]
|
||||||
|
+.B compactsnoop [\-h] [\-T] [\-p PID] [\-d DURATION] [\-K] [\-e]
|
||||||
|
.SH DESCRIPTION
|
||||||
|
compactsnoop traces the compact zone events, showing which processes are
|
||||||
|
allocing pages with memory compaction. This can be useful for discovering
|
||||||
|
diff --git a/man/man8/dirtop.8 b/man/man8/dirtop.8
|
||||||
|
index cc61a676..eaa0c0c4 100644
|
||||||
|
--- a/man/man8/dirtop.8
|
||||||
|
+++ b/man/man8/dirtop.8
|
||||||
|
@@ -55,19 +55,19 @@ Number of interval summaries.
|
||||||
|
.TP
|
||||||
|
Summarize block device I/O by directory, 1 second screen refresh:
|
||||||
|
#
|
||||||
|
-.B dirtop.py
|
||||||
|
+.B dirtop -d '/hdfs/uuid/*/yarn'
|
||||||
|
.TP
|
||||||
|
Don't clear the screen, and top 8 rows only:
|
||||||
|
#
|
||||||
|
-.B dirtop.py -Cr 8
|
||||||
|
+.B dirtop -d '/hdfs/uuid/*/yarn' -Cr 8
|
||||||
|
.TP
|
||||||
|
5 second summaries, 10 times only:
|
||||||
|
#
|
||||||
|
-.B dirtop.py 5 10
|
||||||
|
+.B dirtop -d '/hdfs/uuid/*/yarn' 5 10
|
||||||
|
.TP
|
||||||
|
Report read & write IOs generated in mutliple yarn and data directories:
|
||||||
|
#
|
||||||
|
-.B dirtop.py -d '/hdfs/uuid/*/yarn,/hdfs/uuid/*/data'
|
||||||
|
+.B dirtop -d '/hdfs/uuid/*/yarn,/hdfs/uuid/*/data'
|
||||||
|
.SH FIELDS
|
||||||
|
.TP
|
||||||
|
loadavg:
|
||||||
|
diff --git a/man/man8/drsnoop.8 b/man/man8/drsnoop.8
|
||||||
|
index 90ca901f..8fb3789a 100644
|
||||||
|
--- a/man/man8/drsnoop.8
|
||||||
|
+++ b/man/man8/drsnoop.8
|
||||||
|
@@ -2,7 +2,7 @@
|
||||||
|
.SH NAME
|
||||||
|
drsnoop \- Trace direct reclaim events. Uses Linux eBPF/bcc.
|
||||||
|
.SH SYNOPSIS
|
||||||
|
-.B drsnoop.py [\-h] [\-T] [\-U] [\-p PID] [\-t TID] [\-u UID] [\-d DURATION] [-n name] [-v]
|
||||||
|
+.B drsnoop [\-h] [\-T] [\-U] [\-p PID] [\-t TID] [\-u UID] [\-d DURATION] [-n name] [-v]
|
||||||
|
.SH DESCRIPTION
|
||||||
|
drsnoop trace direct reclaim events, showing which processes are allocing pages
|
||||||
|
with direct reclaiming. This can be useful for discovering when allocstall (/p-
|
||||||
|
diff --git a/man/man8/funclatency.8 b/man/man8/funclatency.8
|
||||||
|
index 9012b832..f96f6098 100644
|
||||||
|
--- a/man/man8/funclatency.8
|
||||||
|
+++ b/man/man8/funclatency.8
|
||||||
|
@@ -89,7 +89,7 @@ Print the BPF program (for debugging purposes).
|
||||||
|
.TP
|
||||||
|
Time vfs_read() for process ID 181 only:
|
||||||
|
#
|
||||||
|
-.B funclatency \-p 181 vfs_read:
|
||||||
|
+.B funclatency \-p 181 vfs_read
|
||||||
|
.TP
|
||||||
|
Time both vfs_fstat() and vfs_fstatat() calls, by use of a wildcard:
|
||||||
|
#
|
||||||
|
diff --git a/man/man8/opensnoop.8 b/man/man8/opensnoop.8
|
||||||
|
index fee83263..d1888772 100644
|
||||||
|
--- a/man/man8/opensnoop.8
|
||||||
|
+++ b/man/man8/opensnoop.8
|
||||||
|
@@ -2,7 +2,7 @@
|
||||||
|
.SH NAME
|
||||||
|
opensnoop \- Trace open() syscalls. Uses Linux eBPF/bcc.
|
||||||
|
.SH SYNOPSIS
|
||||||
|
-.B opensnoop.py [\-h] [\-T] [\-U] [\-x] [\-p PID] [\-t TID] [\-u UID]
|
||||||
|
+.B opensnoop [\-h] [\-T] [\-U] [\-x] [\-p PID] [\-t TID] [\-u UID]
|
||||||
|
[\-d DURATION] [\-n NAME] [\-e] [\-f FLAG_FILTER]
|
||||||
|
[--cgroupmap MAPPATH] [--mntnsmap MAPPATH]
|
||||||
|
.SH DESCRIPTION
|
||||||
|
diff --git a/man/man8/tcpsubnet.8 b/man/man8/tcpsubnet.8
|
||||||
|
index 525b8082..ad5f1be1 100644
|
||||||
|
--- a/man/man8/tcpsubnet.8
|
||||||
|
+++ b/man/man8/tcpsubnet.8
|
||||||
|
@@ -2,7 +2,7 @@
|
||||||
|
.SH NAME
|
||||||
|
tcpsubnet \- Summarize and aggregate IPv4 TCP traffic by subnet.
|
||||||
|
.SH SYNOPSIS
|
||||||
|
-.B tcpsubnet [\-h] [\-v] [\--ebpf] [\-J] [\-f FORMAT] [\-i INTERVAL] [subnets]
|
||||||
|
+.B tcpsubnet [\-h] [\-v] [\-J] [\-f FORMAT] [\-i INTERVAL] [subnets]
|
||||||
|
.SH DESCRIPTION
|
||||||
|
This tool summarizes and aggregates IPv4 TCP sent to the subnets
|
||||||
|
passed in argument and prints to stdout on a fixed interval.
|
||||||
|
@@ -35,9 +35,6 @@ Interval between updates, seconds (default 1).
|
||||||
|
Format output units. Supported values are bkmBKM. When using
|
||||||
|
kmKM the output will be rounded to floor.
|
||||||
|
.TP
|
||||||
|
-\--ebpf
|
||||||
|
-Prints the BPF program.
|
||||||
|
-.TP
|
||||||
|
subnets
|
||||||
|
Comma separated list of subnets. Traffic will be categorized
|
||||||
|
in theses subnets. Order matters.
|
||||||
|
diff --git a/man/man8/tcptracer.8 b/man/man8/tcptracer.8
|
||||||
|
index 59240f4b..19a6164d 100644
|
||||||
|
--- a/man/man8/tcptracer.8
|
||||||
|
+++ b/man/man8/tcptracer.8
|
||||||
|
@@ -2,7 +2,7 @@
|
||||||
|
.SH NAME
|
||||||
|
tcptracer \- Trace TCP established connections. Uses Linux eBPF/bcc.
|
||||||
|
.SH SYNOPSIS
|
||||||
|
-.B tcptracer [\-h] [\-v] [\-p PID] [\-N NETNS] [\-\-cgroupmap MAPPATH] [--mntnsmap MAPPATH] [\-4 | \-6]
|
||||||
|
+.B tcptracer [\-h] [\-v] [-t] [\-p PID] [\-N NETNS] [\-\-cgroupmap MAPPATH] [--mntnsmap MAPPATH] [\-4 | \-6]
|
||||||
|
.SH DESCRIPTION
|
||||||
|
This tool traces established TCP connections that open and close while tracing,
|
||||||
|
and prints a line of output per connect, accept and close events. This includes
|
||||||
|
@@ -23,6 +23,9 @@ Print usage message.
|
||||||
|
\-v
|
||||||
|
Print full lines, with long event type names and network namespace numbers.
|
||||||
|
.TP
|
||||||
|
+\-t
|
||||||
|
+Include timestamp on output
|
||||||
|
+.TP
|
||||||
|
\-p PID
|
||||||
|
Trace this process ID only (filtered in-kernel).
|
||||||
|
.TP
|
||||||
|
diff --git a/man/man8/trace.8 b/man/man8/trace.8
|
||||||
|
index c4417e5f..64a5e799 100644
|
||||||
|
--- a/man/man8/trace.8
|
||||||
|
+++ b/man/man8/trace.8
|
||||||
|
@@ -2,9 +2,11 @@
|
||||||
|
.SH NAME
|
||||||
|
trace \- Trace a function and print its arguments or return value, optionally evaluating a filter. Uses Linux eBPF/bcc.
|
||||||
|
.SH SYNOPSIS
|
||||||
|
-.B trace [-h] [-b BUFFER_PAGES] [-p PID] [-L TID] [--uid UID] [-v] [-Z STRING_SIZE] [-S] [-s SYM_FILE_LIST]
|
||||||
|
- [-M MAX_EVENTS] [-t] [-u] [-T] [-C] [-K] [-U] [-a] [-I header] [-A]
|
||||||
|
+.B trace [-h] [-b BUFFER_PAGES] [-p PID] [-L TID] [--uid UID] [-v] [-Z STRING_SIZE] [-S] [-M MAX_EVENTS] [-t]
|
||||||
|
+ [-u] [-T] [-C] [-c CGROUP_PATH] [-n NAME] [-f MSG_FILTER] [-B] [-s SYM_FILE_LIST] [-K] [-U] [-a]
|
||||||
|
+ [-I header] [-A]
|
||||||
|
probe [probe ...]
|
||||||
|
+
|
||||||
|
.SH DESCRIPTION
|
||||||
|
trace probes functions you specify and displays trace messages if a particular
|
||||||
|
condition is met. You can control the message format to display function
|
||||||
|
diff --git a/tools/killsnoop_example.txt b/tools/killsnoop_example.txt
|
||||||
|
index 7746f2a0..038d09c6 100644
|
||||||
|
--- a/tools/killsnoop_example.txt
|
||||||
|
+++ b/tools/killsnoop_example.txt
|
||||||
|
@@ -27,6 +27,8 @@ Trace signals issued by the kill() syscall
|
||||||
|
-h, --help show this help message and exit
|
||||||
|
-x, --failed only show failed kill syscalls
|
||||||
|
-p PID, --pid PID trace this PID only
|
||||||
|
+ -s SIGNAL, --signal SIGNAL
|
||||||
|
+ trace this signal only
|
||||||
|
|
||||||
|
examples:
|
||||||
|
./killsnoop # trace all kill() signals
|
||||||
|
--
|
||||||
|
2.38.1
|
||||||
|
|
@ -0,0 +1,100 @@
|
|||||||
|
From 2e14fbaf9105e0b504f243ffc6d7d5a16e13a2a7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Alan Maguire <alan.maguire@oracle.com>
|
||||||
|
Date: Fri, 14 Oct 2022 13:01:58 +0000
|
||||||
|
Subject: [PATCH] bcc: support building with external libbpf package and older
|
||||||
|
uapi linux/bpf.h
|
||||||
|
|
||||||
|
When building bcc with a relatively new packaged libbpf (0.8.1)
|
||||||
|
and -DCMAKE_USE_LIBBPF_PACKAGE:BOOL=TRUE, multiple compilation
|
||||||
|
failures are encountered due the fact the system uapi header
|
||||||
|
in /usr/include/linux/bpf.h is not very recent (this is often
|
||||||
|
the case for distros, which sync it via a kernel headers
|
||||||
|
package quite conservatively due to use by glibc).
|
||||||
|
|
||||||
|
With libbpf built via git submodule, the uapi header included in
|
||||||
|
the libbpf package is used, so here a similar approach is proposed
|
||||||
|
for the external package build. Instead of having to sync
|
||||||
|
another file the already present compat/linux/virtual_bpf.h
|
||||||
|
is used; we copy it to compat/linux/bpf.h (eliminating the
|
||||||
|
string prefix/suffix on first/last lines).
|
||||||
|
|
||||||
|
From there, we ensure that places that assume the presence of
|
||||||
|
the libbpf git submodule point at compat/ as a location to
|
||||||
|
find the uapi header.
|
||||||
|
|
||||||
|
Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
|
||||||
|
---
|
||||||
|
examples/cpp/CMakeLists.txt | 4 ++++
|
||||||
|
introspection/CMakeLists.txt | 4 ++++
|
||||||
|
src/cc/CMakeLists.txt | 6 ++++++
|
||||||
|
tests/cc/CMakeLists.txt | 4 ++++
|
||||||
|
4 files changed, 18 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/examples/cpp/CMakeLists.txt b/examples/cpp/CMakeLists.txt
|
||||||
|
index 801e6bad..8d09ae11 100644
|
||||||
|
--- a/examples/cpp/CMakeLists.txt
|
||||||
|
+++ b/examples/cpp/CMakeLists.txt
|
||||||
|
@@ -4,7 +4,11 @@
|
||||||
|
include_directories(${PROJECT_BINARY_DIR}/src/cc)
|
||||||
|
include_directories(${PROJECT_SOURCE_DIR}/src/cc)
|
||||||
|
include_directories(${PROJECT_SOURCE_DIR}/src/cc/api)
|
||||||
|
+if (CMAKE_USE_LIBBPF_PACKAGE AND LIBBPF_FOUND)
|
||||||
|
+include_directories(${PROJECT_SOURCE_DIR}/src/cc/compat)
|
||||||
|
+else()
|
||||||
|
include_directories(${PROJECT_SOURCE_DIR}/src/cc/libbpf/include/uapi)
|
||||||
|
+endif()
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
|
||||||
|
diff --git a/introspection/CMakeLists.txt b/introspection/CMakeLists.txt
|
||||||
|
index dcbe69a3..ce2d03dc 100644
|
||||||
|
--- a/introspection/CMakeLists.txt
|
||||||
|
+++ b/introspection/CMakeLists.txt
|
||||||
|
@@ -3,7 +3,11 @@
|
||||||
|
|
||||||
|
include_directories(${PROJECT_SOURCE_DIR}/src/cc)
|
||||||
|
include_directories(${PROJECT_SOURCE_DIR}/src/cc/api)
|
||||||
|
+if (CMAKE_USE_LIBBPF_PACKAGE AND LIBBPF_FOUND)
|
||||||
|
+include_directories(${PROJECT_SOURCE_DIR}/src/cc/compat)
|
||||||
|
+else()
|
||||||
|
include_directories(${PROJECT_SOURCE_DIR}/src/cc/libbpf/include/uapi)
|
||||||
|
+endif()
|
||||||
|
|
||||||
|
option(INSTALL_INTROSPECTION "Install BPF introspection tools" ON)
|
||||||
|
option(BPS_LINK_RT "Pass -lrt to linker when linking bps tool" ON)
|
||||||
|
diff --git a/src/cc/CMakeLists.txt b/src/cc/CMakeLists.txt
|
||||||
|
index ffe8feec..c7f53530 100644
|
||||||
|
--- a/src/cc/CMakeLists.txt
|
||||||
|
+++ b/src/cc/CMakeLists.txt
|
||||||
|
@@ -15,6 +15,12 @@ endif (LIBDEBUGINFOD_FOUND)
|
||||||
|
# todo: if check for kernel version
|
||||||
|
if (CMAKE_USE_LIBBPF_PACKAGE AND LIBBPF_FOUND)
|
||||||
|
include_directories(${LIBBPF_INCLUDE_DIRS})
|
||||||
|
+ # create up-to-date linux/bpf.h from virtual_bpf.h (remove string wrapper);
|
||||||
|
+ # when libbpf is built as a submodule we use its version of linux/bpf.h
|
||||||
|
+ # so this does similar for the libbpf package, removing reliance on the
|
||||||
|
+ # system uapi header which can be out of date.
|
||||||
|
+ execute_process(COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/compat/linux && grep -ve '\\*\\*\\*\\*' virtual_bpf.h > bpf.h")
|
||||||
|
+ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/compat)
|
||||||
|
else()
|
||||||
|
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/libbpf/include)
|
||||||
|
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/libbpf/include/uapi)
|
||||||
|
diff --git a/tests/cc/CMakeLists.txt b/tests/cc/CMakeLists.txt
|
||||||
|
index 677867d7..47056455 100644
|
||||||
|
--- a/tests/cc/CMakeLists.txt
|
||||||
|
+++ b/tests/cc/CMakeLists.txt
|
||||||
|
@@ -3,7 +3,11 @@
|
||||||
|
|
||||||
|
include_directories(${PROJECT_SOURCE_DIR}/src/cc)
|
||||||
|
include_directories(${PROJECT_SOURCE_DIR}/src/cc/api)
|
||||||
|
+if (CMAKE_USE_LIBBPF_PACKAGE AND LIBBPF_FOUND)
|
||||||
|
+include_directories(${PROJECT_SOURCE_DIR}/src/cc/compat)
|
||||||
|
+else()
|
||||||
|
include_directories(${PROJECT_SOURCE_DIR}/src/cc/libbpf/include/uapi)
|
||||||
|
+endif()
|
||||||
|
include_directories(${PROJECT_SOURCE_DIR}/tests/python/include)
|
||||||
|
|
||||||
|
add_executable(test_static test_static.c)
|
||||||
|
--
|
||||||
|
2.37.3
|
||||||
|
|
@ -0,0 +1,64 @@
|
|||||||
|
From acc8800b6f4380b6f4c7f04ee9a1263cf11deb35 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jerome Marchand <jmarchan@redhat.com>
|
||||||
|
Date: Tue, 20 Dec 2022 11:33:51 +0100
|
||||||
|
Subject: [PATCH] tools: nfsslower: fix an uninitialized struct error
|
||||||
|
|
||||||
|
Fixes the following error:
|
||||||
|
bpf: Failed to load program: Permission denied
|
||||||
|
reg type unsupported for arg#0 function trace_read_return#22
|
||||||
|
0: R1=ctx(off=0,imm=0) R10=fp0
|
||||||
|
; int trace_read_return(struct pt_regs *ctx)
|
||||||
|
0: (bf) r6 = r1 ; R1=ctx(off=0,imm=0) R6_w=ctx(off=0,imm=0)
|
||||||
|
|
||||||
|
[...]
|
||||||
|
|
||||||
|
; bpf_probe_read_kernel(&data.file, sizeof(data.file), (void *)qs.name);
|
||||||
|
75: (b7) r2 = 32 ; R2_w=32
|
||||||
|
76: (85) call bpf_probe_read_kernel#113 ; R0_w=scalar() fp-16=????mmmm fp-24=mmmmmmmm fp-32=mmmmmmmm fp-40=mmmmmmmm fp-48=mmmmmmmm
|
||||||
|
; bpf_perf_event_output(ctx, (void *)bpf_pseudo_fd(1, -2), CUR_CPU_IDENTIFIER, &data, sizeof(data));
|
||||||
|
77: (18) r2 = 0xffff9a0a42177200 ; R2_w=map_ptr(off=0,ks=4,vs=4,imm=0)
|
||||||
|
79: (bf) r4 = r10 ; R4_w=fp0 R10=fp0
|
||||||
|
; bpf_probe_read_kernel(&data.file, sizeof(data.file), (void *)qs.name);
|
||||||
|
80: (07) r4 += -104 ; R4_w=fp-104
|
||||||
|
; bpf_perf_event_output(ctx, (void *)bpf_pseudo_fd(1, -2), CUR_CPU_IDENTIFIER, &data, sizeof(data));
|
||||||
|
81: (bf) r1 = r6 ; R1_w=ctx(off=0,imm=0) R6=ctx(off=0,imm=0)
|
||||||
|
82: (18) r3 = 0xffffffff ; R3_w=4294967295
|
||||||
|
84: (b7) r5 = 96 ; R5_w=96
|
||||||
|
85: (85) call bpf_perf_event_output#25
|
||||||
|
invalid indirect read from stack R4 off -104+92 size 96
|
||||||
|
processed 82 insns (limit 1000000) max_states_per_insn 0 total_states 4 peak_states 4 mark_read 3
|
||||||
|
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "/usr/share/bcc/tools/nfsslower", line 283, in <module>
|
||||||
|
b.attach_kretprobe(event="nfs_file_read", fn_name="trace_read_return")
|
||||||
|
File "/usr/lib/python3.9/site-packages/bcc/__init__.py", line 872, in attach_kretprobe
|
||||||
|
fn = self.load_func(fn_name, BPF.KPROBE)
|
||||||
|
File "/usr/lib/python3.9/site-packages/bcc/__init__.py", line 523, in load_func
|
||||||
|
raise Exception("Failed to load BPF program %s: %s" %
|
||||||
|
Exception: Failed to load BPF program b'trace_read_return': Permission denied
|
||||||
|
---
|
||||||
|
tools/nfsslower.py | 8 ++++++--
|
||||||
|
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/tools/nfsslower.py b/tools/nfsslower.py
|
||||||
|
index b5df8f19..682a3fb7 100755
|
||||||
|
--- a/tools/nfsslower.py
|
||||||
|
+++ b/tools/nfsslower.py
|
||||||
|
@@ -179,8 +179,12 @@ static int trace_exit(struct pt_regs *ctx, int type)
|
||||||
|
|
||||||
|
// populate output struct
|
||||||
|
u32 size = PT_REGS_RC(ctx);
|
||||||
|
- struct data_t data = {.type = type, .size = size, .delta_us = delta_us,
|
||||||
|
- .pid = pid};
|
||||||
|
+ struct data_t data;
|
||||||
|
+ __builtin_memset(&data, 0, sizeof(data));
|
||||||
|
+ data.type = type;
|
||||||
|
+ data.size = size;
|
||||||
|
+ data.delta_us = delta_us;
|
||||||
|
+ data.pid = pid;
|
||||||
|
data.ts_us = ts / 1000;
|
||||||
|
data.offset = valp->offset;
|
||||||
|
bpf_get_current_comm(&data.task, sizeof(data.task));
|
||||||
|
--
|
||||||
|
2.38.1
|
||||||
|
|
@ -0,0 +1,501 @@
|
|||||||
|
# We don't want to bring luajit in RHEL
|
||||||
|
%if 0%{?rhel} > 0
|
||||||
|
%bcond_with lua
|
||||||
|
%else
|
||||||
|
# luajit is not available for some architectures
|
||||||
|
%ifarch ppc64 ppc64le s390x
|
||||||
|
%bcond_with lua
|
||||||
|
%else
|
||||||
|
%bcond_without lua
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%ifarch x86_64 ppc64 ppc64le aarch64
|
||||||
|
%bcond_without libbpf_tools
|
||||||
|
%else
|
||||||
|
%bcond_with libbpf_tools
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%bcond_with llvm_static
|
||||||
|
|
||||||
|
%if %{without llvm_static}
|
||||||
|
%global with_llvm_shared 1
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
Name: bcc
|
||||||
|
Version: 0.25.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}-bcc-support-building-with-external-libbpf-package-an.patch
|
||||||
|
Patch2: %%{name}-%%{version}-Fix-bpf_pseudo_fd-type-conversion-error.patch
|
||||||
|
Patch3: %%{name}-%%{version}-Fix-clang-15-int-to-pointer-conversion-errors.patch
|
||||||
|
Patch4: %%{name}-%%{version}-Fix-some-documentation-issues-4197.patch
|
||||||
|
Patch5: %%{name}-%%{version}-tools-nfsslower-fix-an-uninitialized-struct-error.patch
|
||||||
|
|
||||||
|
# Arches will be included as upstream support is added and dependencies are
|
||||||
|
# satisfied in the respective arches
|
||||||
|
ExclusiveArch: x86_64 %{power64} aarch64 s390x armv7hl
|
||||||
|
|
||||||
|
BuildRequires: bison
|
||||||
|
BuildRequires: cmake >= 2.8.7
|
||||||
|
BuildRequires: flex
|
||||||
|
BuildRequires: libxml2-devel
|
||||||
|
BuildRequires: python3-devel
|
||||||
|
BuildRequires: elfutils-libelf-devel
|
||||||
|
BuildRequires: elfutils-debuginfod-client-devel
|
||||||
|
BuildRequires: llvm-devel
|
||||||
|
BuildRequires: clang-devel
|
||||||
|
%if %{with llvm_static}
|
||||||
|
BuildRequires: llvm-static
|
||||||
|
%endif
|
||||||
|
BuildRequires: ncurses-devel
|
||||||
|
%if %{with lua}
|
||||||
|
BuildRequires: pkgconfig(luajit)
|
||||||
|
%endif
|
||||||
|
BuildRequires: libbpf-devel >= 2:0.8.0, libbpf-static >= 2:0.8.0
|
||||||
|
|
||||||
|
Requires: libbpf >= 2:0.8.0
|
||||||
|
Requires: tar
|
||||||
|
Recommends: kernel-devel
|
||||||
|
|
||||||
|
Recommends: %{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}
|
||||||
|
Suggests: elfutils-debuginfod-client
|
||||||
|
|
||||||
|
%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}
|
||||||
|
Recommends: %{name}-lua = %{version}-%{release}
|
||||||
|
BuildArch: noarch
|
||||||
|
|
||||||
|
%description doc
|
||||||
|
Examples for BPF Compiler Collection (BCC)
|
||||||
|
|
||||||
|
|
||||||
|
%package -n python3-%{name}
|
||||||
|
Summary: Python3 bindings for BPF Compiler Collection (BCC)
|
||||||
|
Requires: %{name} = %{version}-%{release}
|
||||||
|
BuildArch: noarch
|
||||||
|
|
||||||
|
%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: bcc = %{version}-%{release}
|
||||||
|
Requires: python3-%{name} = %{version}-%{release}
|
||||||
|
Requires: python3-netaddr
|
||||||
|
|
||||||
|
%description tools
|
||||||
|
Command line tools for BPF Compiler Collection (BCC)
|
||||||
|
|
||||||
|
%if %{with libbpf_tools}
|
||||||
|
%package -n libbpf-tools
|
||||||
|
Summary: Command line libbpf tools for BPF Compiler Collection (BCC)
|
||||||
|
BuildRequires: bpftool
|
||||||
|
|
||||||
|
%description -n libbpf-tools
|
||||||
|
Command line libbpf tools for BPF Compiler Collection (BCC)
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%autosetup -p1
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
%cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||||
|
-DREVISION_LAST=%{version} -DREVISION=%{version} -DPYTHON_CMD=python3 \
|
||||||
|
-DCMAKE_USE_LIBBPF_PACKAGE:BOOL=TRUE \
|
||||||
|
%{?with_llvm_shared:-DENABLE_LLVM_SHARED=1}
|
||||||
|
%cmake_build
|
||||||
|
|
||||||
|
# It was discussed and agreed to package libbpf-tools with
|
||||||
|
# 'bpf-' prefix (https://github.com/iovisor/bcc/pull/3263)
|
||||||
|
# Installing libbpf-tools binaries in temp directory and
|
||||||
|
# renaming them in there and the install code will just
|
||||||
|
# take them.
|
||||||
|
%if %{with libbpf_tools}
|
||||||
|
pushd libbpf-tools;
|
||||||
|
make BPFTOOL=bpftool LIBBPF_OBJ=%{_libdir}/libbpf.a CFLAGS="%{optflags}" LDFLAGS="%{build_ldflags}"
|
||||||
|
make DESTDIR=./tmp-install prefix= install
|
||||||
|
(
|
||||||
|
cd tmp-install/bin
|
||||||
|
for file in *; do
|
||||||
|
mv $file bpf-$file
|
||||||
|
done
|
||||||
|
# now fix the broken symlinks
|
||||||
|
for file in `find . -type l`; do
|
||||||
|
dest=$(readlink "$file")
|
||||||
|
ln -s -f bpf-$dest $file
|
||||||
|
done
|
||||||
|
)
|
||||||
|
popd
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%install
|
||||||
|
%cmake_install
|
||||||
|
|
||||||
|
# Fix python shebangs
|
||||||
|
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=' {} \;
|
||||||
|
|
||||||
|
# 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
|
||||||
|
mkdir -p %{buildroot}%{_docdir}/%{name}
|
||||||
|
mv %{buildroot}%{_datadir}/%{name}/examples %{buildroot}%{_docdir}/%{name}/
|
||||||
|
|
||||||
|
# Delete old tools we don't want to ship
|
||||||
|
rm -rf %{buildroot}%{_datadir}/%{name}/tools/old/
|
||||||
|
|
||||||
|
# We cannot run the test suit since it requires root and it makes changes to
|
||||||
|
# the machine (e.g, IP address)
|
||||||
|
#%check
|
||||||
|
|
||||||
|
%if %{with libbpf_tools}
|
||||||
|
mkdir -p %{buildroot}/%{_sbindir}
|
||||||
|
# We cannot use `install` because some of the tools are symlinks and `install`
|
||||||
|
# follows those. Since all the tools already have the correct permissions set,
|
||||||
|
# we just need to copy them to the right place while preserving those
|
||||||
|
cp -a libbpf-tools/tmp-install/bin/* %{buildroot}/%{_sbindir}/
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%ldconfig_scriptlets
|
||||||
|
|
||||||
|
%files
|
||||||
|
%doc README.md
|
||||||
|
%license LICENSE.txt
|
||||||
|
%{_libdir}/lib%{name}.so.*
|
||||||
|
%{_libdir}/libbcc_bpf.so.*
|
||||||
|
|
||||||
|
%files devel
|
||||||
|
%exclude %{_libdir}/lib%{name}*.a
|
||||||
|
%exclude %{_libdir}/lib%{name}*.la
|
||||||
|
%{_libdir}/lib%{name}.so
|
||||||
|
%{_libdir}/libbcc_bpf.so
|
||||||
|
%{_libdir}/pkgconfig/lib%{name}.pc
|
||||||
|
%{_includedir}/%{name}/
|
||||||
|
|
||||||
|
%files -n python3-%{name}
|
||||||
|
%{python3_sitelib}/%{name}*
|
||||||
|
|
||||||
|
%files doc
|
||||||
|
%dir %{_docdir}/%{name}
|
||||||
|
%doc %{_docdir}/%{name}/examples/
|
||||||
|
|
||||||
|
%files tools
|
||||||
|
%dir %{_datadir}/%{name}
|
||||||
|
%{_datadir}/%{name}/tools/
|
||||||
|
%{_datadir}/%{name}/introspection/
|
||||||
|
%if 0%{?rhel} > 0
|
||||||
|
# inject relies on BPF_KPROBE_OVERRIDE which is not set on RHEL
|
||||||
|
%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 RHEL
|
||||||
|
%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*
|
||||||
|
# criticalstat relies on CONFIG_PREEMPTIRQ_EVENTS which is disabled on RHEL
|
||||||
|
%exclude %{_datadir}/%{name}/tools/criticalstat
|
||||||
|
%exclude %{_datadir}/%{name}/tools/doc/criticalstat_example.txt
|
||||||
|
%exclude %{_mandir}/man8/bcc-criticalstat.8.gz
|
||||||
|
%endif
|
||||||
|
%{_mandir}/man8/*
|
||||||
|
|
||||||
|
%if %{with lua}
|
||||||
|
%files lua
|
||||||
|
%{_bindir}/bcc-lua
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if %{with libbpf_tools}
|
||||||
|
%files -n libbpf-tools
|
||||||
|
%{_sbindir}/bpf-*
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%changelog
|
||||||
|
* Thu Jan 05 2023 Jerome Marchand <jmarchan@redhat.com> - 0.25.0-2
|
||||||
|
- Rebuild for libbpf 1.0
|
||||||
|
|
||||||
|
* Tue Dec 20 2022 Jerome Marchand <jmarchan@redhat.com> - 0.25.0-1
|
||||||
|
- Rebase to v0.25.0
|
||||||
|
- Misc documentation and man pages fixes
|
||||||
|
|
||||||
|
* Tue Aug 23 2022 Jerome Marchand <jmarchan@redhat.com> - 0.24.1-4
|
||||||
|
- Fix mdflush tool (rhbz#2108001)
|
||||||
|
|
||||||
|
* Fri Jul 01 2022 Jerome Marchand <jmarchan@redhat.com> - 0.24.1-3
|
||||||
|
- Rebuild for libbpf 0.6.0
|
||||||
|
|
||||||
|
* Wed May 18 2022 Jerome Marchand <jmarchan@redhat.com> - 0.24.1-2
|
||||||
|
- Rebuild (previous build failed with UNKNOWN_KOJI_ERROR)
|
||||||
|
|
||||||
|
* Thu Mar 24 2022 Jerome Marchand <jmarchan@redhat.com> - 0.24.0-1
|
||||||
|
- Rebase to v0.24.0
|
||||||
|
- Fix cmake build
|
||||||
|
|
||||||
|
* Fri Feb 25 2022 Jerome Marchand <jmarchan@redhat.com> - 0.20.0-10
|
||||||
|
- Remove deprecated python_provides macro (needed for gating)
|
||||||
|
|
||||||
|
* Thu Feb 24 2022 Jerome Marchand <jmarchan@redhat.com> - 0.20.0-9
|
||||||
|
- Fix bio tools (rhbz#2039595)
|
||||||
|
|
||||||
|
* Mon Nov 22 2021 Jerome Marchand <jmarchan@redhat.com> - 0.20.0-8
|
||||||
|
- Rebuild for LLVM 13
|
||||||
|
|
||||||
|
* Thu Oct 14 2021 Jerome Marchand <jmarchan@redhat.com> - 0.20.0-7
|
||||||
|
- Sync with latest libbpf (fixes BPF_F_BROADCAST breakages of rhbz#1992430)
|
||||||
|
- Fix cpudist, mdflush, readahead and threadsnoop (rhbz#1992430)
|
||||||
|
- Handle the renaming of task_struct_>state field
|
||||||
|
- Drop tools that relies on features disabled on RHEL
|
||||||
|
|
||||||
|
* Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 0.20.0-6
|
||||||
|
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
|
||||||
|
Related: rhbz#1991688
|
||||||
|
|
||||||
|
* Tue Aug 03 2021 Jerome Marchand <jmarchan@redhat.com> - 0.20.0-5
|
||||||
|
- Add gating
|
||||||
|
|
||||||
|
* Mon Jul 26 2021 Jerome Marchand <jmarchan@redhat.com> - 0.20.0-4
|
||||||
|
- Don't require bcc-tools by default (#1967550)
|
||||||
|
- Add explicit bcc requirement to bcc-tools
|
||||||
|
- Build bcc from standard sources
|
||||||
|
|
||||||
|
* Wed Jun 02 2021 Jerome Marchand <jmarchan@redhat.com> - 0.20.0-3
|
||||||
|
- Don't ignore LDFLAGS for libbpf-tools
|
||||||
|
|
||||||
|
* Wed Jun 02 2021 Jerome Marchand <jmarchan@redhat.com> - 0.20.0-2
|
||||||
|
- Don't override cflags for libbpf-tools
|
||||||
|
|
||||||
|
* Thu May 27 2021 Jerome Marchand <jmarchan@redhat.com> - 0.20.0-1
|
||||||
|
- Rebase to bcc 0.20.0
|
||||||
|
|
||||||
|
* Thu May 13 2021 Tom Stellard <tstellar@redhat.com> - 0.18.0-6
|
||||||
|
- Rebuild for LLVM 12
|
||||||
|
|
||||||
|
* Thu Apr 15 2021 Mohan Boddu <mboddu@redhat.com> - 0.18.0-5
|
||||||
|
- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
|
||||||
|
|
||||||
|
* Thu Feb 18 2021 Jerome Marchand <jmarchan@redhat.com> - 0.18.0-4
|
||||||
|
- Disable lua for RHEL
|
||||||
|
|
||||||
|
* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 0.18.0-3
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
|
||||||
|
|
||||||
|
* Fri Jan 22 2021 Tom Stellard <tstellar@redhat.com> - 0.18.0-2
|
||||||
|
- Rebuild for clang-11.1.0
|
||||||
|
|
||||||
|
* Tue Jan 5 15:08:26 CET 2021 Rafael dos Santos <rdossant@redhat.com> - 0.18.0-1
|
||||||
|
- Rebase to latest upstream (#1912875)
|
||||||
|
|
||||||
|
* Fri Oct 30 11:25:46 CET 2020 Rafael dos Santos <rdossant@redhat.com> - 0.17.0-1
|
||||||
|
- Rebase to latest upstream (#1871417)
|
||||||
|
|
||||||
|
* Mon Oct 12 2020 Jerome Marchand <jmarchan@redhat.com> - 0.16.0.3
|
||||||
|
- Rebuild for LLVM 11.0.0-rc6
|
||||||
|
|
||||||
|
* Fri Aug 28 2020 Rafael dos Santos <rdossant@redhat.com> - 0.16.0-2
|
||||||
|
- Enable build for armv7hl
|
||||||
|
|
||||||
|
* Sun Aug 23 2020 Rafael dos Santos <rdossant@redhat.com> - 0.16.0-1
|
||||||
|
- Rebase to latest upstream (#1871417)
|
||||||
|
|
||||||
|
* Tue Aug 04 2020 Rafael dos Santos <rdossant@redhat.com> - 0.15.0-6
|
||||||
|
- Fix build with cmake (#1863243)
|
||||||
|
|
||||||
|
* Sat Aug 01 2020 Fedora Release Engineering <releng@fedoraproject.org> - 0.15.0-5
|
||||||
|
- Second attempt - Rebuilt for
|
||||||
|
https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
|
||||||
|
|
||||||
|
* Mon Jul 27 2020 Fedora Release Engineering <releng@fedoraproject.org> - 0.15.0-4
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu Jul 09 2020 Tom Stellard <tstellar@redhat.com> - 0.15.0-3
|
||||||
|
- Drop llvm-static dependency
|
||||||
|
- https://docs.fedoraproject.org/en-US/packaging-guidelines/#_statically_linking_executables
|
||||||
|
|
||||||
|
* Thu Jul 02 2020 Rafael dos Santos <rdossant@redhat.com> - 0.15.0-2
|
||||||
|
- Reinstate a function needed by bpftrace
|
||||||
|
|
||||||
|
* Tue Jun 23 2020 Rafael dos Santos <rdossant@redhat.com> - 0.15.0-1
|
||||||
|
- Rebase to latest upstream version (#1849239)
|
||||||
|
|
||||||
|
* Tue May 26 2020 Miro Hrončok <mhroncok@redhat.com> - 0.14.0-2
|
||||||
|
- Rebuilt for Python 3.9
|
||||||
|
|
||||||
|
* Tue Apr 21 2020 Rafael dos Santos <rdossant@redhat.com> - 0.14.0-1
|
||||||
|
- Rebase to latest upstream version (#1826281)
|
||||||
|
|
||||||
|
* Wed Feb 26 2020 Rafael dos Santos <rdossant@redhat.com> - 0.13.0-1
|
||||||
|
- Rebase to latest upstream version (#1805072)
|
||||||
|
|
||||||
|
* Tue Jan 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 0.12.0-3
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
|
||||||
|
|
||||||
|
* Mon Jan 06 2020 Tom Stellard <tstellar@redhat.com> - 0.12.0-2
|
||||||
|
- Link against libclang-cpp.so
|
||||||
|
- https://fedoraproject.org/wiki/Changes/Stop-Shipping-Individual-Component-Libraries-In-clang-lib-Package
|
||||||
|
|
||||||
|
* Tue Dec 17 2019 Rafael dos Santos <rdossant@redhat.com> - 0.12.0-1
|
||||||
|
- Rebase to latest upstream version (#1758417)
|
||||||
|
|
||||||
|
* Thu Dec 05 2019 Jiri Olsa <jolsa@redhat.com> - 0.11.0-2
|
||||||
|
- Add libbpf support
|
||||||
|
|
||||||
|
* Fri Oct 04 2019 Rafael dos Santos <rdossant@redhat.com> - 0.11.0-1
|
||||||
|
- Rebase to latest upstream version (#1758417)
|
||||||
|
|
||||||
|
* Thu Oct 03 2019 Miro Hrončok <mhroncok@redhat.com> - 0.10.0-4
|
||||||
|
- Rebuilt for Python 3.8.0rc1 (#1748018)
|
||||||
|
|
||||||
|
* Mon Aug 19 2019 Miro Hrončok <mhroncok@redhat.com> - 0.10.0-3
|
||||||
|
- Rebuilt for Python 3.8
|
||||||
|
|
||||||
|
* Wed Jul 24 2019 Fedora Release Engineering <releng@fedoraproject.org> - 0.10.0-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
|
||||||
|
|
||||||
|
* Wed May 29 2019 Rafael dos Santos <rdossant@redhat.com> - 0.10.0-1
|
||||||
|
- Rebase to latest upstream version (#1714902)
|
||||||
|
|
||||||
|
* Thu Apr 25 2019 Rafael dos Santos <rdossant@redhat.com> - 0.9.0-1
|
||||||
|
- Rebase to latest upstream version (#1686626)
|
||||||
|
- Rename libbpf header to libbcc_bpf
|
||||||
|
|
||||||
|
* Mon Apr 22 2019 Neal Gompa <ngompa@datto.com> - 0.8.0-5
|
||||||
|
- Make the Python 3 bindings package noarch
|
||||||
|
- Small cleanups to the spec
|
||||||
|
|
||||||
|
* Tue Mar 19 2019 Rafael dos Santos <rdossant@redhat.com> - 0.8.0-4
|
||||||
|
- Add s390x support (#1679310)
|
||||||
|
|
||||||
|
* Wed Feb 20 2019 Rafael dos Santos <rdossant@redhat.com> - 0.8.0-3
|
||||||
|
- Add aarch64 support (#1679310)
|
||||||
|
|
||||||
|
* Thu Jan 31 2019 Fedora Release Engineering <releng@fedoraproject.org> - 0.8.0-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu Jan 17 2019 Rafael dos Santos <rdossant@redhat.com> - 0.8.0-1
|
||||||
|
- Rebase to new released version
|
||||||
|
|
||||||
|
* Thu Nov 01 2018 Rafael dos Santos <rdossant@redhat.com> - 0.7.0-4
|
||||||
|
- Fix attaching to usdt probes (#1634684)
|
||||||
|
|
||||||
|
* Mon Oct 22 2018 Rafael dos Santos <rdossant@redhat.com> - 0.7.0-3
|
||||||
|
- Fix encoding of non-utf8 characters (#1516678)
|
||||||
|
- Fix str-bytes conversion in killsnoop (#1637515)
|
||||||
|
|
||||||
|
* Sat Oct 06 2018 Rafael dos Santos <rdossant@redhat.com> - 0.7.0-2
|
||||||
|
- Fix str/bytes conversion in uflow (#1636293)
|
||||||
|
|
||||||
|
* Tue Sep 25 2018 Rafael Fonseca <r4f4rfs@gmail.com> - 0.7.0-1
|
||||||
|
- Rebase to new released version
|
||||||
|
|
||||||
|
* Wed Aug 22 2018 Rafael Fonseca <r4f4rfs@gmail.com> - 0.6.1-2
|
||||||
|
- Fix typo when mangling shebangs.
|
||||||
|
|
||||||
|
* Thu Aug 16 2018 Rafael Fonseca <r4f4rfs@gmail.com> - 0.6.1-1
|
||||||
|
- Rebase to new released version (#1609485)
|
||||||
|
|
||||||
|
* Thu Jul 12 2018 Fedora Release Engineering <releng@fedoraproject.org> - 0.6.0-3
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
|
||||||
|
|
||||||
|
* Tue Jun 19 2018 Miro Hrončok <mhroncok@redhat.com> - 0.6.0-2
|
||||||
|
- Rebuilt for Python 3.7
|
||||||
|
|
||||||
|
* Mon Jun 18 2018 Rafael dos Santos <rdossant@redhat.com> - 0.6.0-1
|
||||||
|
- Rebase to new released version (#1591989)
|
||||||
|
|
||||||
|
* Thu Apr 05 2018 Rafael Santos <rdossant@redhat.com> - 0.5.0-4
|
||||||
|
- Resolves #1555627 - fix compilation error with latest llvm/clang
|
||||||
|
|
||||||
|
* Wed Feb 07 2018 Fedora Release Engineering <releng@fedoraproject.org> - 0.5.0-3
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
|
||||||
|
|
||||||
|
* Fri Feb 02 2018 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 0.5.0-2
|
||||||
|
- Switch to %%ldconfig_scriptlets
|
||||||
|
|
||||||
|
* Wed Jan 03 2018 Rafael Santos <rdossant@redhat.com> - 0.5.0-1
|
||||||
|
- Rebase to new released version
|
||||||
|
|
||||||
|
* Thu Nov 16 2017 Rafael Santos <rdossant@redhat.com> - 0.4.0-4
|
||||||
|
- Resolves #1517408 - avoid conflict with other manpages
|
||||||
|
|
||||||
|
* Thu Nov 02 2017 Rafael Santos <rdossant@redhat.com> - 0.4.0-3
|
||||||
|
- Use weak deps to not require lua subpkg on ppc64(le)
|
||||||
|
|
||||||
|
* Wed Nov 01 2017 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 0.4.0-2
|
||||||
|
- Rebuild for LLVM5
|
||||||
|
|
||||||
|
* Wed Nov 01 2017 Rafael Fonseca <rdossant@redhat.com> - 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 <releng@fedoraproject.org> - 0.3.0-4
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild
|
||||||
|
|
||||||
|
* Wed Jul 26 2017 Fedora Release Engineering <releng@fedoraproject.org> - 0.3.0-3
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu Mar 30 2017 Igor Gnatenko <ignatenko@redhat.com> - 0.3.0-2
|
||||||
|
- Rebuild for LLVM4
|
||||||
|
- Trivial fixes in spec
|
||||||
|
|
||||||
|
* Fri Mar 10 2017 Rafael Fonseca <rdossant@redhat.com> - 0.3.0-1
|
||||||
|
- Rebase to new release.
|
||||||
|
|
||||||
|
* Fri Feb 10 2017 Fedora Release Engineering <releng@fedoraproject.org> - 0.2.0-3
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
|
||||||
|
|
||||||
|
* Tue Jan 10 2017 Rafael Fonseca <rdossant@redhat.com> - 0.2.0-2
|
||||||
|
- Fix typo
|
||||||
|
|
||||||
|
* Tue Nov 29 2016 Rafael Fonseca <rdossant@redhat.com> - 0.2.0-1
|
||||||
|
- Initial import
|
Loading…
Reference in new issue