26 Sep, 2020

1 commit

  • This patch changes the bpf_sk_storage_*() to take
    ARG_PTR_TO_BTF_ID_SOCK_COMMON such that they will work with the pointer
    returned by the bpf_skc_to_*() helpers also.

    A micro benchmark has been done on a "cgroup_skb/egress" bpf program
    which does a bpf_sk_storage_get(). It was driven by netperf doing
    a 4096 connected UDP_STREAM test with 64bytes packet.
    The stats from "kernel.bpf_stats_enabled" shows no meaningful difference.

    The sk_storage_get_btf_proto, sk_storage_delete_btf_proto,
    btf_sk_storage_get_proto, and btf_sk_storage_delete_proto are
    no longer needed, so they are removed.

    Signed-off-by: Martin KaFai Lau
    Signed-off-by: Alexei Starovoitov
    Acked-by: Lorenz Bauer
    Link: https://lore.kernel.org/bpf/20200925000402.3856307-1-kafai@fb.com

    Martin KaFai Lau
     

22 Sep, 2020

1 commit

  • Function prototypes using ARG_PTR_TO_BTF_ID currently use two ways to signal
    which BTF IDs are acceptable. First, bpf_func_proto.btf_id is an array of
    IDs, one for each argument. This array is only accessed up to the highest
    numbered argument that uses ARG_PTR_TO_BTF_ID and may therefore be less than
    five arguments long. It usually points at a BTF_ID_LIST. Second, check_btf_id
    is a function pointer that is called by the verifier if present. It gets the
    actual BTF ID of the register, and the argument number we're currently checking.
    It turns out that the only user check_arg_btf_id ignores the argument, and is
    simply used to check whether the BTF ID has a struct sock_common at it's start.

    Replace both of these mechanisms with an explicit BTF ID for each argument
    in a function proto. Thanks to btf_struct_ids_match this is very flexible:
    check_arg_btf_id can be replaced by requiring struct sock_common.

    Signed-off-by: Lorenz Bauer
    Signed-off-by: Alexei Starovoitov
    Acked-by: Martin KaFai Lau
    Link: https://lore.kernel.org/bpf/20200921121227.255763-5-lmb@cloudflare.com

    Lorenz Bauer
     

31 Mar, 2020

1 commit


24 Mar, 2020

1 commit

  • This patch adds bpf_sk_storage_get() and bpf_sk_storage_delete()
    helper to the bpf_tcp_ca's struct_ops. That would allow
    bpf-tcp-cc to:
    1) share sk private data with other bpf progs.
    2) use bpf_sk_storage as a private storage for a bpf-tcp-cc
    if the existing icsk_ca_priv is not big enough.

    Signed-off-by: Martin KaFai Lau
    Signed-off-by: Daniel Borkmann
    Acked-by: Yonghong Song
    Link: https://lore.kernel.org/bpf/20200320152101.2169498-1-kafai@fb.com

    Martin KaFai Lau
     

18 Mar, 2020

1 commit

  • The bpf_struct_ops tcp-cc name should be sanitized in order to
    avoid problematic chars (e.g. whitespaces).

    This patch reuses the bpf_obj_name_cpy() for accepting the same set
    of characters in order to keep a consistent bpf programming experience.
    A "size" param is added. Also, the strlen is returned on success so
    that the caller (like the bpf_tcp_ca here) can error out on empty name.
    The existing callers of the bpf_obj_name_cpy() only need to change the
    testing statement to "if (err < 0)". For all these existing callers,
    the err will be overwritten later, so no extra change is needed
    for the new strlen return value.

    v3:
    - reverse xmas tree style
    v2:
    - Save the orig_src to avoid "end - size" (Andrii)

    Fixes: 0baf26b0fcd7 ("bpf: tcp: Support tcp_congestion_ops in bpf")
    Signed-off-by: Martin KaFai Lau
    Signed-off-by: Daniel Borkmann
    Acked-by: Andrii Nakryiko
    Link: https://lore.kernel.org/bpf/20200314010209.1131542-1-kafai@fb.com

    Martin KaFai Lau
     

10 Jan, 2020

2 commits

  • Add a helper to send out a tcp-ack. It will be used in the later
    bpf_dctcp implementation that requires to send out an ack
    when the CE state changed.

    Signed-off-by: Martin KaFai Lau
    Signed-off-by: Alexei Starovoitov
    Acked-by: Yonghong Song
    Link: https://lore.kernel.org/bpf/20200109004551.3900448-1-kafai@fb.com

    Martin KaFai Lau
     
  • This patch makes "struct tcp_congestion_ops" to be the first user
    of BPF STRUCT_OPS. It allows implementing a tcp_congestion_ops
    in bpf.

    The BPF implemented tcp_congestion_ops can be used like
    regular kernel tcp-cc through sysctl and setsockopt. e.g.
    [root@arch-fb-vm1 bpf]# sysctl -a | egrep congestion
    net.ipv4.tcp_allowed_congestion_control = reno cubic bpf_cubic
    net.ipv4.tcp_available_congestion_control = reno bic cubic bpf_cubic
    net.ipv4.tcp_congestion_control = bpf_cubic

    There has been attempt to move the TCP CC to the user space
    (e.g. CCP in TCP). The common arguments are faster turn around,
    get away from long-tail kernel versions in production...etc,
    which are legit points.

    BPF has been the continuous effort to join both kernel and
    userspace upsides together (e.g. XDP to gain the performance
    advantage without bypassing the kernel). The recent BPF
    advancements (in particular BTF-aware verifier, BPF trampoline,
    BPF CO-RE...) made implementing kernel struct ops (e.g. tcp cc)
    possible in BPF. It allows a faster turnaround for testing algorithm
    in the production while leveraging the existing (and continue growing)
    BPF feature/framework instead of building one specifically for
    userspace TCP CC.

    This patch allows write access to a few fields in tcp-sock
    (in bpf_tcp_ca_btf_struct_access()).

    The optional "get_info" is unsupported now. It can be added
    later. One possible way is to output the info with a btf-id
    to describe the content.

    Signed-off-by: Martin KaFai Lau
    Signed-off-by: Alexei Starovoitov
    Acked-by: Andrii Nakryiko
    Acked-by: Yonghong Song
    Link: https://lore.kernel.org/bpf/20200109003508.3856115-1-kafai@fb.com

    Martin KaFai Lau