• Yonghong Song's avatar
    bpf: Add bpf_seq_printf and bpf_seq_write helpers · 492e639f
    Yonghong Song authored
    Two helpers bpf_seq_printf and bpf_seq_write, are added for
    writing data to the seq_file buffer.
    
    bpf_seq_printf supports common format string flag/width/type
    fields so at least I can get identical results for
    netlink and ipv6_route targets.
    
    For bpf_seq_printf and bpf_seq_write, return value -EOVERFLOW
    specifically indicates a write failure due to overflow, which
    means the object will be repeated in the next bpf invocation
    if object collection stays the same. Note that if the object
    collection is changed, depending how collection traversal is
    done, even if the object still in the collection, it may not
    be visited.
    
    For bpf_seq_printf, format %s, %p{i,I}{4,6} needs to
    read kernel memory. Reading kernel memory may fail in
    the following two cases:
      - invalid kernel address, or
      - valid kernel address but requiring a major fault
    If reading kernel memory failed, the %s string will be
    an empty string and %p{i,I}{4,6} will be all 0.
    Not returning error to bpf program is consistent with
    what bpf_trace_printk() does for now.
    
    bpf_seq_printf may return -EBUSY meaning that internal percpu
    buffer for memory copy of strings or other pointees is
    not available. Bpf program can return 1 to indicate it
    wants the same object to be repeated. Right now, this should not
    happen on no-RT kernels since migrate_disable(), which guards
    bpf prog call, calls preempt_disable().
    Signed-off-by: default avatarYonghong Song <yhs@fb.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Acked-by: default avatarAndrii Nakryiko <andriin@fb.com>
    Link: https://lore.kernel.org/bpf/20200509175914.2476661-1-yhs@fb.com
    492e639f
bpf_trace.c 50.3 KB