opts.kernel_log_buf = obj_log_buf;
opts.kernel_log_size = log_buf_sz;
opts.kernel_log_level = 4; /* for BTF this will turn into 1 */
/* In the first round every prog has its own log_buf, so libbpf logs * don't have program failure logs
*/
skel = test_log_buf__open_opts(&opts); if (!ASSERT_OK_PTR(skel, "skel_open")) goto cleanup;
/* set very verbose level for good_prog so we always get detailed logs */
bpf_program__set_log_buf(skel->progs.good_prog, good_log_buf, log_buf_sz);
bpf_program__set_log_level(skel->progs.good_prog, 2);
bpf_program__set_log_buf(skel->progs.bad_prog, bad_log_buf, log_buf_sz); /* log_level 0 with custom log_buf means that verbose logs are not * requested if program load is successful, but libbpf should retry * with log_level 1 on error and put program's verbose load log into * custom log_buf
*/
bpf_program__set_log_level(skel->progs.bad_prog, 0);
err = test_log_buf__load(skel); if (!ASSERT_ERR(err, "unexpected_load_success")) goto cleanup;
/* In the second round we let bad_prog's failure be logged through print callback */
opts.kernel_log_buf = NULL; /* let everything through into print callback */
opts.kernel_log_size = 0;
opts.kernel_log_level = 1;
skel = test_log_buf__open_opts(&opts); if (!ASSERT_OK_PTR(skel, "skel_open")) goto cleanup;
/* set normal verbose level for good_prog to check log_level is taken into account */
bpf_program__set_log_buf(skel->progs.good_prog, good_log_buf, log_buf_sz);
bpf_program__set_log_level(skel->progs.good_prog, 1);
err = test_log_buf__load(skel); if (!ASSERT_ERR(err, "unexpected_load_success")) goto cleanup;
/* with log_level == 0 log_buf should stay empty for good BTF */
log_buf[0] = '\0';
opts.log_level = 0;
fd = bpf_btf_load(raw_btf_data, raw_btf_size, &opts);
ASSERT_STREQ(log_buf, "", "good_log_0");
ASSERT_GE(fd, 0, "good_fd1"); if (fd >= 0)
close(fd);
fd = -1;
/* log_level == 2 should always fill log_buf, even for good BTF */
log_buf[0] = '\0';
opts.log_level = 2;
fd = bpf_btf_load(raw_btf_data, raw_btf_size, &opts);
printf("LOG_BUF: %s\n", log_buf);
ASSERT_OK_PTR(strstr(log_buf, "magic: 0xeb9f"), "good_log_2");
ASSERT_GE(fd, 0, "good_fd2"); if (fd >= 0)
close(fd);
fd = -1;
/* make BTF bad, add pointer pointing to non-existing type */
ASSERT_GT(btf__add_ptr(btf, 100), 0, "bad_ptr_type");
raw_btf_data = btf__raw_data(btf, &raw_btf_size); if (!ASSERT_OK_PTR(raw_btf_data, "raw_btf_data_bad")) goto cleanup;
/* log_level == 0 should fill log_buf for bad BTF */
log_buf[0] = '\0';
opts.log_level = 0;
fd = bpf_btf_load(raw_btf_data, raw_btf_size, &opts);
printf("LOG_BUF: %s\n", log_buf);
ASSERT_OK_PTR(strstr(log_buf, "[2] PTR (anon) type_id=100 Invalid type_id"), "bad_log_0");
ASSERT_LT(fd, 0, "bad_fd"); if (fd >= 0)
close(fd);
fd = -1;
cleanup:
free(log_buf);
btf__free(btf);
}
void test_log_buf(void)
{ if (test__start_subtest("obj_load_log_buf"))
obj_load_log_buf(); if (test__start_subtest("bpf_prog_load_log_buf"))
bpf_prog_load_log_buf(); if (test__start_subtest("bpf_btf_load_log_buf"))
bpf_btf_load_log_buf();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.