kernel/bpf/log.c
Source file repositories/reference/linux-study-clean/kernel/bpf/log.c
File Facts
- System
- Linux kernel
- Corpus path
kernel/bpf/log.c- Extension
.c- Size
- 25240 bytes
- Lines
- 904
- Domain
- Core OS
- Bucket
- Scheduler, Processes, Timers, Sync, And Syscalls
- Inferred role
- Core OS: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Touches user memory; correctness depends on fault-safe copying and privilege boundary handling.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
uapi/linux/btf.hlinux/kernel.hlinux/types.hlinux/bpf.hlinux/bpf_verifier.hlinux/math64.hlinux/string.h
Detected Declarations
function Copyrightfunction bpf_vlog_initfunction bpf_vlog_update_len_maxfunction bpf_verifier_vlogfunction bpf_vlog_resetfunction bpf_vlog_reverse_kbuffunction bpf_vlog_reverse_ubuffunction bpf_vlog_finalizefunction bpf_verifier_log_writefunction reg_type_strfunction is_unum_decimalfunction is_snum_decimalfunction verbose_unumfunction verbose_snumfunction tnum_strnfunction print_scalar_rangesfunction type_is_map_ptrfunction print_reg_statefunction print_verifier_statefunction bpf_vlog_alignmentfunction print_insn_statefunction bpf_log_attr_initfunction bpf_log_attr_finalizeexport bpf_verifier_log_writeexport bpf_logexport tnum_strn
Annotated Snippet
if (log->end_pos < log->len_total) {
new_n = min_t(u32, log->len_total - log->end_pos, n);
log->kbuf[new_n - 1] = '\0';
}
cur_pos = log->end_pos;
log->end_pos += n - 1; /* don't count terminating '\0' */
if (log->ubuf && new_n &&
copy_to_user(log->ubuf + cur_pos, log->kbuf, new_n))
goto fail;
} else {
u64 new_end, new_start;
u32 buf_start, buf_end;
new_end = log->end_pos + n;
if (new_end - log->start_pos >= log->len_total)
new_start = new_end - log->len_total;
else
new_start = log->start_pos;
log->start_pos = new_start;
log->end_pos = new_end - 1; /* don't count terminating '\0' */
if (!log->ubuf)
return;
new_n = min(n, log->len_total);
cur_pos = new_end - new_n;
div_u64_rem(cur_pos, log->len_total, &buf_start);
div_u64_rem(new_end, log->len_total, &buf_end);
/* new_end and buf_end are exclusive indices, so if buf_end is
* exactly zero, then it actually points right to the end of
* ubuf and there is no wrap around
*/
if (buf_end == 0)
buf_end = log->len_total;
/* if buf_start > buf_end, we wrapped around;
* if buf_start == buf_end, then we fill ubuf completely; we
* can't have buf_start == buf_end to mean that there is
* nothing to write, because we always write at least
* something, even if terminal '\0'
*/
if (buf_start < buf_end) {
/* message fits within contiguous chunk of ubuf */
if (copy_to_user(log->ubuf + buf_start,
log->kbuf + n - new_n,
buf_end - buf_start))
goto fail;
} else {
/* message wraps around the end of ubuf, copy in two chunks */
if (copy_to_user(log->ubuf + buf_start,
log->kbuf + n - new_n,
log->len_total - buf_start))
goto fail;
if (copy_to_user(log->ubuf,
log->kbuf + n - buf_end,
buf_end))
goto fail;
}
}
return;
fail:
log->ubuf = NULL;
}
void bpf_vlog_reset(struct bpf_verifier_log *log, u64 new_pos)
{
char zero = 0;
u32 pos;
if (WARN_ON_ONCE(new_pos > log->end_pos))
return;
if (!bpf_verifier_log_needed(log) || log->level == BPF_LOG_KERNEL)
return;
/* if position to which we reset is beyond current log window,
* then we didn't preserve any useful content and should adjust
* start_pos to end up with an empty log (start_pos == end_pos)
*/
log->end_pos = new_pos;
if (log->end_pos < log->start_pos)
log->start_pos = log->end_pos;
if (!log->ubuf)
return;
Annotation
- Immediate include surface: `uapi/linux/btf.h`, `linux/kernel.h`, `linux/types.h`, `linux/bpf.h`, `linux/bpf_verifier.h`, `linux/math64.h`, `linux/string.h`.
- Detected declarations: `function Copyright`, `function bpf_vlog_init`, `function bpf_vlog_update_len_max`, `function bpf_verifier_vlog`, `function bpf_vlog_reset`, `function bpf_vlog_reverse_kbuf`, `function bpf_vlog_reverse_ubuf`, `function bpf_vlog_finalize`, `function bpf_verifier_log_write`, `function reg_type_str`.
- Atlas domain: Core OS / Scheduler, Processes, Timers, Sync, And Syscalls.
- Implementation status: integration implementation candidate.
- This snippet crosses the user/kernel memory boundary; validate fault handling and access checks before translating the pattern.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.