unofficial mirror of help-guix@gnu.org 
 help / color / mirror / Atom feed
From: John Soo <jsoo1@asu.edu>
To: Mathieu Othacehe <othacehe@gnu.org>
Cc: Help Guix <help-guix@gnu.org>
Subject: Re: BPF in linux-libre
Date: Sun, 05 Jul 2020 17:44:41 -0700	[thread overview]
Message-ID: <87zh8dlbeu.fsf@asu.edu> (raw)
In-Reply-To: <87h7umjruz.fsf@gnu.org> (Mathieu Othacehe's message of "Sun, 05 Jul 2020 10:20:04 +0200")

[-- Attachment #1: Type: text/plain, Size: 3736 bytes --]

Hi Mathieu,

I attached an updated series.

I think I fixed up the lint errors. Pardon me.

>> +(define-public libbpf
>> +  (let* ((commit "6a1615c263b679c17ecb292fa897f159e826dc10"))

> Why using a specific commit?

> The "0.0.9" is out there :)

I updated the packages where it was appropriate. bcc also had an
available update, oops.

>> +      (source
>> +       (origin
>> +         (method git-fetch)
>> +         (uri (git-reference
>> +               (url "https://github.com/libbpf/libbpf")
>> +               (commit commit)))
> 
> (commit (string-append "v" version)) should work fine.

> +         ("pkg-config" ,pkg-config)

> This should be a native-input, don't forget to run the linter :)

Done, also I made flex and bison native inputs where appropriate.

>> +          (string-append "PREFIX=''")
>> +          (string-append "DESTDIR=" (assoc-ref %outputs "out"))
>> +          (string-append
>> +           "CC=" (assoc-ref %build-inputs "gcc") "/bin/gcc"))
> 
> This will put libraries in "lib64" directory which is not desired. You
> can set LIBDIR to "/lib" to avoid that.

Done, thank you.

>> +               (chdir "src")
> 
> I'm not sure this is needed.

I tried without and it failed. I looked at the libbpf build guide and it
says to cd src.  I wish I could remove it, too.

>> +               #t)))))
>> +      (home-page "https://github.com/libbpf/libbpf")
>> +      (synopsis "BPF CO-RE (Compile Once – Run Everywhere)")
>> +      (description
>> +       "Libbpf supports building BPF CO-RE-enabled applications, which, in
>> +contrast to BCC, do not require Clang/LLVM runtime being deployed to target
>> +servers and does not rely on kernel-devel headers being available.")
> 
> "kernel-devel" is more Debian specific I think. I'm also not sure that
> the "Clang deploying" things applied well to Guix.

I think I tidied up the description to match the Guix situation. What do
you think now?

>> +(define-public linux-libre-with-bpf
>> +  (make-linux-libre* linux-libre-5.4-version
>> +                     linux-libre-5.4-source
>> + '("x86_64-linux" "i686-linux" "armhf-linux" "aarch64-linux"
>> "riscv64-linux")
>> +                     #:extra-version "bpf"
>> +                     #:configuration-file kernel-config
>> +                     #:extra-options
>> +                     (append %bpf-extra-linux-options
>> +                             %default-extra-linux-options)))
>> +
>
> What would be the drawbacks of enabling BPF in the default linux-libre
> kernel?

I could see it being a useful default.  BPF seems like a nice technology
but I am making these patches to experiment with it myself.  Because I
haven't used it much I can't really speak on the pros of making it
default.  Other than my gut feeling that seems like something that
should be opted into rather than opting out of I have no strong feelings
on including it by default.  The only other downside I see is that
putting in the default might make the linux definitions less composable.
The way it is now, one can assemble a (mostly) bpf-capable system from
the pieces in gnu/packages/linux.scm.

That said, I think there are a few more missing pieces to get full
functionality. Running the example bpftrace scripts gives errors like
this:

open(/sys/kernel/debug/tracing/uprobe_events): No such file or directory

I think that means the operating system definition might need to specify
more file systems but I can't seem to work out which ones are required
and where to specify them.  My first guess is that it would need to be
debugfs and mounted in initramfs?  I am not sure.

Thanks for your feedback!

- John


[-- Attachment #2: 0001-gnu-Add-libbpf.patch --]
[-- Type: text/x-patch, Size: 2854 bytes --]

From 7f077c98a2328c43a5041a9461a44299a6b1d9ec Mon Sep 17 00:00:00 2001
From: John Soo <jsoo1@asu.edu>
Date: Sat, 13 Jun 2020 14:53:50 -0700
Subject: [PATCH 1/5] gnu: Add libbpf.

* gnu/packages/linux.scm (libbpf): New variable.
---
 gnu/packages/linux.scm | 49 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index b508e1809c..9a7cf73c0d 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -45,6 +45,7 @@
 ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2020 Brice Waegeneire <brice@waegenei.re>
 ;;; Copyright © 2020 Morgan Smith <Morgan.J.Smith@outlook.com>
+;;; Copyright © 2020 John Soo <jsoo1@asu.edu>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -7139,3 +7140,51 @@ cache data store that is used by network file systems such as @code{AFS} and
 @code{NFS} to cache data locally on disk.  The content of the cache is
 persistent over reboots.")
     (license license:gpl2+)))
+
+(define-public libbpf
+  (let* ((revision "1"))
+    (package
+      (name "libbpf")
+      (version "0.0.9")
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/libbpf/libbpf")
+               (commit (string-append "v" version))))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "18l0gff7nm841mwhr7bc7x863xcyvwh58zl7mc0amnsjqlbrvqg7"))))
+      (build-system gnu-build-system)
+      (native-inputs
+       `(("pkg-config" ,pkg-config)))
+      (inputs
+       `(("libelf" ,libelf)
+         ("zlib" ,zlib)))
+      (arguments
+       `(#:tests? #f ; No tests
+         #:make-flags
+         (list
+          (string-append "PREFIX=''")
+          (string-append "DESTDIR=" (assoc-ref %outputs "out"))
+          (string-append "LIBDIR=/lib")
+          (string-append
+           "CC=" (assoc-ref %build-inputs "gcc") "/bin/gcc"))
+         #:phases
+         (modify-phases %standard-phases
+           (delete 'configure)
+           (add-before 'build 'pre-build
+             (lambda* (#:key inputs #:allow-other-keys)
+               (substitute* "scripts/check-reallocarray.sh"
+                 (("/bin/rm" rm)
+                  (string-append (assoc-ref inputs "coreutils") rm)))
+               (chdir "src")
+               #t)))))
+      (home-page "https://github.com/libbpf/libbpf")
+      (synopsis "BPF CO-RE (Compile Once – Run Everywhere)")
+      (description
+       "Libbpf supports building BPF CO-RE-enabled applications, which, in
+contrast to BCC, do not require the Clang/LLVM runtime or linux kernel
+headers.")
+      (license `(,license:lgpl2.1 ,license:bsd-2)))))
-- 
2.27.0


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-gnu-Add-bpf-extra-linux-options.patch --]
[-- Type: text/x-patch, Size: 1617 bytes --]

From 4225b08298bf62d008e46b14d14ac5aee717ef27 Mon Sep 17 00:00:00 2001
From: John Soo <jsoo1@asu.edu>
Date: Sat, 13 Jun 2020 22:52:55 -0700
Subject: [PATCH 2/5] gnu: Add %bpf-extra-linux-options.

* gnu/packages/linux (%bpf-extra-linux-options): New variable.
---
 gnu/packages/linux.scm | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 9a7cf73c0d..126d969e65 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -619,6 +619,30 @@ for ARCH and optionally VARIANT, or #f if there is no such configuration."
     ("CONFIG_CIFS" . m)
     ("CONFIG_9P_FS" . m)))
 
+;; See https://github.com/iovisor/bcc/blob/master/INSTALL.md#kernel-configuration
+(define %bpf-extra-linux-options
+  `(;; Needed for probes
+    ("CONFIG_UPROBE_EVENTS" . #t)
+    ("CONFIG_KPROBE_EVENTS" . #t)
+    ;; kheaders module also helpful for tracing
+    ("CONFIG_IKHEADERS" . #t)
+    ("CONFIG_BPF" . #t)
+    ("CONFIG_BPF_SYSCALL" . #t)
+    ("CONFIG_BPF_JIT_ALWAYS_ON" . #t)
+    ;; optional, for tc filters
+    ("CONFIG_NET_CLS_BPF" . m)
+    ;; optional, for tc actions
+    ("CONFIG_NET_ACT_BPF" . m)
+    ("CONFIG_BPF_JIT" . #t)
+    ;; for Linux kernel versions 4.1 through 4.6
+    ;; ("CONFIG_HAVE_BPF_JIT" . y)
+    ;; for Linux kernel versions 4.7 and later
+    ("CONFIG_HAVE_EBPF_JIT" . #t)
+    ;; optional, for kprobes
+    ("CONFIG_BPF_EVENTS" . #t)
+    ;; kheaders module
+    ("CONFIG_IKHEADERS" . #t)))
+
 (define (config->string options)
   (string-join (map (match-lambda
                       ((option . 'm)
-- 
2.27.0


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #4: 0003-gnu-Add-linux-libre-with-bpf.patch --]
[-- Type: text/x-patch, Size: 1598 bytes --]

From 1c360ce60dba1d30b7c02e974e37cfe3cbb9c936 Mon Sep 17 00:00:00 2001
From: John Soo <jsoo1@asu.edu>
Date: Sat, 13 Jun 2020 22:54:24 -0700
Subject: [PATCH 3/5] gnu: Add linux-libre-with-bpf.

* gnu/packages/linux.scm (linux-libre-with-bpf): New variable.
---
 gnu/packages/linux.scm | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 126d969e65..8a70a78e64 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -75,6 +75,7 @@
   #:use-module (gnu packages bison)
   #:use-module (gnu packages calendar)
   #:use-module (gnu packages check)
+  #:use-module (gnu packages cpio)
   #:use-module (gnu packages crypto)
   #:use-module (gnu packages cryptsetup)
   #:use-module (gnu packages compression)
@@ -7165,6 +7166,21 @@ cache data store that is used by network file systems such as @code{AFS} and
 persistent over reboots.")
     (license license:gpl2+)))
 
+(define-public linux-libre-with-bpf
+  (let ((base-linux-libre
+         (make-linux-libre*
+          linux-libre-5.4-version
+          linux-libre-5.4-source
+          '("x86_64-linux" "i686-linux" "armhf-linux" "aarch64-linux" "riscv64-linux")
+          #:extra-version "bpf"
+          #:configuration-file kernel-config
+          #:extra-options
+          (append %bpf-extra-linux-options
+                  %default-extra-linux-options))))
+    (package
+      (inherit base-linux-libre)
+      (inputs `(("cpio" ,cpio) ,@(package-inputs base-linux-libre))))))
+
 (define-public libbpf
   (let* ((revision "1"))
     (package
-- 
2.27.0


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #5: 0004-gnu-Add-bcc.patch --]
[-- Type: text/x-patch, Size: 3841 bytes --]

From a15d37f1dc4a422daac986cce2dce9008ea66540 Mon Sep 17 00:00:00 2001
From: John Soo <jsoo1@asu.edu>
Date: Sat, 13 Jun 2020 23:16:11 -0700
Subject: [PATCH 4/5] gnu: Add bcc.

* gnu/packages/linux.scm (bcc): New variable.
---
 gnu/packages/linux.scm | 65 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 65 insertions(+)

diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 8a70a78e64..0c1cc77041 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -98,6 +98,8 @@
   #:use-module (gnu packages haskell-xyz)
   #:use-module (gnu packages libunwind)
   #:use-module (gnu packages libusb)
+  #:use-module (gnu packages llvm)
+  #:use-module (gnu packages lua)
   #:use-module (gnu packages man)
   #:use-module (gnu packages maths)
   #:use-module (gnu packages multiprecision)
@@ -132,6 +134,7 @@
   #:use-module (gnu packages rsync)
   #:use-module (gnu packages selinux)
   #:use-module (gnu packages swig)
+  #:use-module (gnu packages version-control)
   #:use-module (guix build-system cmake)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system go)
@@ -7228,3 +7231,65 @@ persistent over reboots.")
 contrast to BCC, do not require the Clang/LLVM runtime or linux kernel
 headers.")
       (license `(,license:lgpl2.1 ,license:bsd-2)))))
+
+(define-public bcc
+  (package
+    (name "bcc")
+    (version "0.15.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/iovisor/bcc")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "1d5j9zanffa1c7lpi5fcrdlx1n7hy86xl82fam2xqr0s41q4ipxw"))))
+    (build-system cmake-build-system)
+    (native-inputs
+     `(("bison" ,bison)
+       ("flex" ,flex)))
+    (inputs
+     `(;; TODO: package optional integrations
+       ;; ("arping" ,argping)
+       ;; ("netperf" ,netperf)
+       ;; ("iperf" ,iperf) or ("iperf3" ,iperf3)
+       ("clang-toolchain" ,clang-toolchain)
+       ;; FIXME: Timestamp some other way.
+       ("git" ,git)
+       ("libbpf" ,(package-source libbpf))
+       ;; LibElf required but libelf does not contain
+       ;; archives, only object files.
+       ;; https://github.com/iovisor/bcc/issues/504
+       ("elfutils" ,elfutils)
+       ("linux-libre-headers" ,linux-libre-headers)
+       ("luajit" ,luajit)
+       ("python-wrapper" ,python-wrapper)))
+    (arguments
+     `(;; Tests all require sudo and a "standard" file heirarchy
+       #:tests? #f
+                ;; LIBBPF_INCLUDE_DIR should work with the output of libbpf -
+                ;; i.e. ,libbpf instead of ,(package-source libbpf) in inputs
+                ;; but it seems there could be a bug
+                ;; #:configure-flags
+                ;; (list
+                ;;  (string-append
+                ;;   "-DLIBBPF_INCLUDE_DIR="
+                ;;   (assoc-ref %build-inputs "libbpf") "/include"))
+                #:phases
+                (modify-phases %standard-phases
+                  (add-after 'unpack 'copy-libbpf
+                    (lambda* (#:key inputs #:allow-other-keys)
+                      (delete-file-recursively "src/cc/libbpf")
+                      (copy-recursively
+                       (assoc-ref inputs "libbpf") "src/cc/libbpf"))))))
+    (home-page "https://github.com/iovisor/bcc")
+    (synopsis "Tools for BPF on Linux")
+    (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.  Much of what BCC uses requires
+Linux 4.1 and above.")
+    (license license:asl2.0)))
-- 
2.27.0


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #6: 0005-gnu-Add-bpftrace.patch --]
[-- Type: text/x-patch, Size: 4334 bytes --]

From c808920c5f8575079cf8d442cb84a1fb1905c13d Mon Sep 17 00:00:00 2001
From: John Soo <jsoo1@asu.edu>
Date: Sat, 13 Jun 2020 23:16:56 -0700
Subject: [PATCH 5/5] gnu: Add bpftrace.

* gnu/packages/linux.scm (bpftrace): New variable.
* gnu/packages/patches/bpftrace-disable-bfd-disasm.patch: Disable bfd
disassembly for bpftrace.
* gnu/local.mk (dist_patch_DATA): Add bpftrace-disable-bfd-disasm.patch.
---
 gnu/local.mk                                  |  1 +
 gnu/packages/linux.scm                        | 48 +++++++++++++++++++
 .../patches/bpftrace-disable-bfd-disasm.patch | 15 ++++++
 3 files changed, 64 insertions(+)
 create mode 100644 gnu/packages/patches/bpftrace-disable-bfd-disasm.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 9a691525a2..ad12fc5181 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -818,6 +818,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/bitcoin-core-python-compat.patch		\
   %D%/packages/patches/blender-2.79-newer-ffmpeg.patch		\
   %D%/packages/patches/blender-2.79-python-3.7-fix.patch	\
+  %D%/packages/patches/bpftrace-disable-bfd-disasm.patch	\
   %D%/packages/patches/busybox-1.31.1-fix-build-with-glibc-2.31.patch \
   %D%/packages/patches/byobu-writable-status.patch		\
   %D%/packages/patches/calibre-no-updates-dialog.patch		\
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 0c1cc77041..b6d69badfe 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -7293,3 +7293,51 @@ makes use of extended BPF (Berkeley Packet Filters), formally known as eBPF, a
 new feature that was first added to Linux 3.15.  Much of what BCC uses requires
 Linux 4.1 and above.")
     (license license:asl2.0)))
+
+(define-public bpftrace
+  (package
+    (name "bpftrace")
+    (version "0.10.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/iovisor/bpftrace")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "023ardywbw5w8815j2ny9rrp2xlpxndqaa7v2njjm8109p7ilsdn"))
+       (patches (search-patches "bpftrace-disable-bfd-disasm.patch"))))
+    (build-system cmake-build-system)
+    (native-inputs
+     `(("bison" ,bison)
+       ("flex" ,flex)))
+    (inputs
+     `(("bcc" ,bcc)
+       ("clang-toolchain" ,clang-toolchain)
+       ("elfutils" ,elfutils)
+       ;; FIXME: Tests require googletest but clone repository
+       ;; ("googletest" ,googletest)
+       ("libbpf" ,libbpf)
+       ("linux-libre-headers" ,linux-libre-headers)))
+    (arguments
+     `(#:tests? #f ; FIXME: Enable when googletest from guix is used
+       #:configure-flags
+       '(;; FIXME: Make tests not clone the googletest repository
+         "-DBUILD_TESTING=OFF"
+         ;; FIXME: libbfd misses some link dependencies
+         ;; When fixed, remove patch
+         "-DHAVE_BFD_DISASM=OFF")))
+    (home-page "https://github.com/iovisor/bpftrace")
+    (synopsis "High-level tracing language for Linux eBPF")
+    (description
+     "bpftrace is a high-level tracing language for Linux enhanced Berkeley
+Packet Filter (eBPF) available in recent Linux kernels (4.x).  bpftrace uses
+LLVM as a backend to compile scripts to BPF-bytecode and makes use of BCC for
+interacting with the Linux BPF system, as well as existing Linux tracing
+capabilities: kernel dynamic tracing (kprobes), user-level dynamic
+tracing (uprobes), and tracepoints.  The bpftrace language is inspired by awk
+and C, and predecessor tracers such as DTrace and SystemTap.  bpftrace was
+created by Alastair Robertson.")
+    (license license:asl2.0)))
diff --git a/gnu/packages/patches/bpftrace-disable-bfd-disasm.patch b/gnu/packages/patches/bpftrace-disable-bfd-disasm.patch
new file mode 100644
index 0000000000..8565d8d851
--- /dev/null
+++ b/gnu/packages/patches/bpftrace-disable-bfd-disasm.patch
@@ -0,0 +1,15 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index e89a6a9..a594786 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -126,10 +126,6 @@ find_package(LibBpf)
+ find_package(LibBfd)
+ find_package(LibOpcodes)
+ 
+-if(${LIBBFD_FOUND} AND ${LIBOPCODES_FOUND})
+-  set(HAVE_BFD_DISASM TRUE)
+-endif()
+-
+ include(CheckIncludeFile)
+ check_include_file("sys/sdt.h" HAVE_SYSTEMTAP_SYS_SDT_H)
+ 
-- 
2.27.0


      reply	other threads:[~2020-07-06  0:45 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-14  3:21 BPF in linux-libre John Soo
2020-06-14  9:23 ` Mathieu Othacehe
2020-06-14 15:11   ` John Soo
2020-06-17 10:16     ` Mathieu Othacehe
2020-06-17 13:42       ` John Soo
2020-06-21 15:32       ` John Soo
2020-06-26 10:50         ` Mathieu Othacehe
2020-06-28 20:24           ` John Soo
2020-07-01  5:40           ` John Soo
2020-07-03 16:01           ` John Soo
2020-07-05  8:18             ` Mathieu Othacehe
2020-07-05  8:20             ` Mathieu Othacehe
2020-07-06  0:44               ` John Soo [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87zh8dlbeu.fsf@asu.edu \
    --to=jsoo1@asu.edu \
    --cc=help-guix@gnu.org \
    --cc=othacehe@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).