From: Stanislav Fomichev <sdf@google.com>
To: netdev@vger.kernel.org, bpf@vger.kernel.org
Cc: davem@davemloft.net, ast@kernel.org, daniel@iogearbox.net,
Stanislav Fomichev <sdf@google.com>
Subject: [PATCH bpf-next] libbpf: don't allocate 16M for log buffer by default
Date: Tue, 24 Mar 2020 16:31:20 -0700 [thread overview]
Message-ID: <20200324233120.66314-1-sdf@google.com> (raw)
For each prog/btf load we allocate and free 16 megs of verifier buffer.
On production systems it doesn't really make sense because the
programs/btf have gone through extensive testing and (mostly) guaranteed
to successfully load.
Let's switch to a much smaller buffer by default (128 bytes, sys_bpf
doesn't accept smaller log buffer) and resize it if the kernel returns
ENOSPC. On the first ENOSPC error we resize the buffer to BPF_LOG_BUF_SIZE
and then, on each subsequent ENOSPC, we keep doubling the buffer.
Signed-off-by: Stanislav Fomichev <sdf@google.com>
---
tools/lib/bpf/btf.c | 10 +++++++++-
tools/lib/bpf/libbpf.c | 10 ++++++++--
tools/lib/bpf/libbpf_internal.h | 2 ++
3 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c
index 3d1c25fc97ae..53c7efc3b347 100644
--- a/tools/lib/bpf/btf.c
+++ b/tools/lib/bpf/btf.c
@@ -657,13 +657,14 @@ int btf__finalize_data(struct bpf_object *obj, struct btf *btf)
int btf__load(struct btf *btf)
{
- __u32 log_buf_size = BPF_LOG_BUF_SIZE;
+ __u32 log_buf_size = BPF_MIN_LOG_BUF_SIZE;
char *log_buf = NULL;
int err = 0;
if (btf->fd >= 0)
return -EEXIST;
+retry_load:
log_buf = malloc(log_buf_size);
if (!log_buf)
return -ENOMEM;
@@ -673,6 +674,13 @@ int btf__load(struct btf *btf)
btf->fd = bpf_load_btf(btf->data, btf->data_size,
log_buf, log_buf_size, false);
if (btf->fd < 0) {
+ if (errno == ENOSPC) {
+ log_buf_size = max((__u32)BPF_LOG_BUF_SIZE,
+ log_buf_size << 1);
+ free(log_buf);
+ goto retry_load;
+ }
+
err = -errno;
pr_warn("Error loading BTF: %s(%d)\n", strerror(errno), errno);
if (*log_buf)
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 085e41f9b68e..793c81b35ccc 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -4855,7 +4855,7 @@ load_program(struct bpf_program *prog, struct bpf_insn *insns, int insns_cnt,
{
struct bpf_load_program_attr load_attr;
char *cp, errmsg[STRERR_BUFSIZE];
- int log_buf_size = BPF_LOG_BUF_SIZE;
+ size_t log_buf_size = BPF_MIN_LOG_BUF_SIZE;
char *log_buf;
int btf_fd, ret;
@@ -4911,7 +4911,13 @@ load_program(struct bpf_program *prog, struct bpf_insn *insns, int insns_cnt,
}
if (errno == ENOSPC) {
- log_buf_size <<= 1;
+ if (errno == ENOSPC) {
+ log_buf_size = max((size_t)BPF_LOG_BUF_SIZE,
+ log_buf_size << 1);
+ free(log_buf);
+ goto retry_load;
+ }
+
free(log_buf);
goto retry_load;
}
diff --git a/tools/lib/bpf/libbpf_internal.h b/tools/lib/bpf/libbpf_internal.h
index 8c3afbd97747..2720f3366798 100644
--- a/tools/lib/bpf/libbpf_internal.h
+++ b/tools/lib/bpf/libbpf_internal.h
@@ -23,6 +23,8 @@
#define BTF_PARAM_ENC(name, type) (name), (type)
#define BTF_VAR_SECINFO_ENC(type, offset, size) (type), (offset), (size)
+#define BPF_MIN_LOG_BUF_SIZE 128
+
#ifndef min
# define min(x, y) ((x) < (y) ? (x) : (y))
#endif
--
2.25.1.696.g5e7596f4ac-goog
next reply other threads:[~2020-03-24 23:31 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-24 23:31 Stanislav Fomichev [this message]
2020-03-24 23:45 ` [PATCH bpf-next] libbpf: don't allocate 16M for log buffer by default Andrii Nakryiko
2020-03-24 23:59 ` Stanislav Fomichev
2020-03-25 0:08 ` Andrii Nakryiko
2020-03-25 9:54 ` Daniel Borkmann
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200324233120.66314-1-sdf@google.com \
--to=sdf@google.com \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=netdev@vger.kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.