[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAL+tcoBCFjbX3BvYqYDtH_339HjfgPLe3cUku=s2MNQCY_sk9w@mail.gmail.com>
Date: Wed, 9 Oct 2024 19:15:03 +0800
From: Jason Xing <kerneljasonxing@...il.com>
To: Vadim Fedorenko <vadim.fedorenko@...ux.dev>
Cc: davem@...emloft.net, edumazet@...gle.com, kuba@...nel.org,
pabeni@...hat.com, dsahern@...nel.org, willemdebruijn.kernel@...il.com,
willemb@...gle.com, ast@...nel.org, daniel@...earbox.net, andrii@...nel.org,
martin.lau@...ux.dev, eddyz87@...il.com, song@...nel.org,
yonghong.song@...ux.dev, john.fastabend@...il.com, kpsingh@...nel.org,
sdf@...ichev.me, haoluo@...gle.com, jolsa@...nel.org, bpf@...r.kernel.org,
netdev@...r.kernel.org, Jason Xing <kernelxing@...cent.com>
Subject: Re: [PATCH net-next 5/9] net-timestamp: ready to turn on the button
to generate tx timestamps
On Wed, Oct 9, 2024 at 5:17 PM Vadim Fedorenko
<vadim.fedorenko@...ux.dev> wrote:
>
> On 09/10/2024 00:48, Jason Xing wrote:
> > On Wed, Oct 9, 2024 at 3:18 AM Vadim Fedorenko
> > <vadim.fedorenko@...ux.dev> wrote:
> >>
> >> On 08/10/2024 10:51, Jason Xing wrote:
> >>> From: Jason Xing <kernelxing@...cent.com>
> >>>
> >>> Once we set BPF_SOCK_OPS_TX_TIMESTAMP_OPT_CB_FLAG flag here, there
> >>> are three points in the previous patches where generating timestamps
> >>> works. Let us make the basic bpf mechanism for timestamping feature
> >>> work finally.
> >>>
> >>> We can use like this as a simple example in bpf program:
> >>> __section("sockops")
> >>>
> >>> case BPF_SOCK_OPS_TX_TIMESTAMP_OPT_CB:
> >>> dport = bpf_ntohl(skops->remote_port);
> >>> sport = skops->local_port;
> >>> skops->reply = SOF_TIMESTAMPING_TX_SCHED;
> >>> bpf_sock_ops_cb_flags_set(skops, BPF_SOCK_OPS_TX_TIMESTAMP_OPT_CB_FLAG);
> >>> case BPF_SOCK_OPS_TS_SCHED_OPT_CB:
> >>> bpf_printk(...);
> >>>
> >>> Signed-off-by: Jason Xing <kernelxing@...cent.com>
> >>> ---
> >>> include/uapi/linux/bpf.h | 8 ++++++++
> >>> net/ipv4/tcp.c | 27 ++++++++++++++++++++++++++-
> >>> tools/include/uapi/linux/bpf.h | 8 ++++++++
> >>> 3 files changed, 42 insertions(+), 1 deletion(-)
> >>>
> >>> diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
> >>> index 1b478ec18ac2..6bf3f2892776 100644
> >>> --- a/include/uapi/linux/bpf.h
> >>> +++ b/include/uapi/linux/bpf.h
> >>> @@ -7034,6 +7034,14 @@ enum {
> >>> * feature is on. It indicates the
> >>> * recorded timestamp.
> >>> */
> >>> + BPF_SOCK_OPS_TX_TS_OPT_CB, /* Called when the last skb from
> >>> + * sendmsg is going to push when
> >>> + * SO_TIMESTAMPING feature is on.
> >>> + * Let user have a chance to switch
> >>> + * on BPF_SOCK_OPS_TX_TIMESTAMPING_OPT_CB_FLAG
> >>> + * flag for other three tx timestamp
> >>> + * use.
> >>> + */
> >>> };
> >>>
> >>> /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect
> >>> diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
> >>> index 82cc4a5633ce..ddf4089779b5 100644
> >>> --- a/net/ipv4/tcp.c
> >>> +++ b/net/ipv4/tcp.c
> >>> @@ -477,12 +477,37 @@ void tcp_init_sock(struct sock *sk)
> >>> }
> >>> EXPORT_SYMBOL(tcp_init_sock);
> >>>
> >>> +static u32 bpf_tcp_tx_timestamp(struct sock *sk)
> >>> +{
> >>> + u32 flags;
> >>> +
> >>> + flags = tcp_call_bpf(sk, BPF_SOCK_OPS_TX_TS_OPT_CB, 0, NULL);
> >>> + if (flags <= 0)
> >>> + return 0;
> >>> +
> >>> + if (flags & ~SOF_TIMESTAMPING_MASK)
> >>> + return 0;
> >>> +
> >>> + if (!(flags & SOF_TIMESTAMPING_TX_RECORD_MASK))
> >>> + return 0;
> >>> +
> >>> + return flags;
> >>> +}
> >>> +
> >>> static void tcp_tx_timestamp(struct sock *sk, struct sockcm_cookie *sockc)
> >>> {
> >>> struct sk_buff *skb = tcp_write_queue_tail(sk);
> >>> u32 tsflags = sockc->tsflags;
> >>> + u32 flags;
> >>> +
> >>> + if (!skb)
> >>> + return;
> >>> +
> >>> + flags = bpf_tcp_tx_timestamp(sk);
> >>> + if (flags)
> >>> + tsflags = flags;
> >>
> >> In this case it's impossible to clear timestamping flags from bpf
> >
> > It cannot be cleared only from the last skb until the next round of
> > recvmsg. Since the last skb is generated and bpf program is attached,
> > I would like to know why we need to clear the related fields in the
> > skb? Please note that I didn't hack the sk_tstflags in struct sock :)
>
> >> program, but it may be very useful. Consider providing flags from
> >> socket cookie to the program or maybe add an option to combine them?
> >
> > Thanks for this idea. May I ask what the benefits are through adding
> > an option because the bpf test statement (BPF_SOCK_OPS_TEST_FLAG) is a
> > good option to take a whole control? Or could you provide more details
> > about how you expect to do so?
>
> Well, as Willem mentioned, you are overriding flags completely. But what
> if an application is waiting for some type of timestamp to arrive, but
> bpf program rewrites flags and disables this type of timestamp? It will
> confuse application.
Indeed, this series doesn't handle the conflict very well. Initially,
I tried so hard to avoid implementing the feature again. But now, it
seems inevitable. Let me dig into it more.
>
> Thinking twice, clearing flags might not be useful because of the very
> same issue though.
Yes.
Thanks,
Jason
Powered by blists - more mailing lists