Re: [PATCH v2 6/8] socket: Add SO_TIMESTAMP[NS]_NEW
From: Deepa Dinamani <hidden>
Date: 2018-12-15 20:56:24
Also in:
linux-alpha, linux-rdma, lkml, sparclinux
quoted
Also for the other comment. The reason the conditionals were not consistent is because they were not consistent to begin with.The only difference I see is an inversion of the test. Nesting order is the same: int need_software_tstamp = sock_flag(sk, SOCK_RCVTSTAMP); ... if (need_software_tstamp) { if (!sock_flag(sk, SOCK_RCVTSTAMPNS)) { } else { } } vs if (sock_flag(sk, SOCK_RCVTSTAMP)) { if (sock_flag(sk, SOCK_RCVTSTAMPNS)) { } else { } } I suggest just adding something like if (need_software_tstamp) { + if (sock_uses_new_tstamp(sk) { + __sock_recv_timestamp_new(msg, sk, ktime_to_timespec64(skb->tstamp)); + } else if (!sock_flag(sk, SOCK_RCVTSTAMPNS)) { - if (!sock_flag(sk, SOCK_RCVTSTAMPNS)) { } else { } and if (sock_flag(sk, SOCK_RCVTSTAMP)) { + if (sock_uses_new_tstamp(sk) { + __sock_recv_timestamp_new(msg, sk, ts); + else if (sock_flag(sk, SOCK_RCVTSTAMPNS)) { - if (sock_flag(sk, SOCK_RCVTSTAMPNS)) { } else { } I think we can use the same helper for both the sock and tcp variant. The only intended difference between the two functions, as described in the tcp_recv_timestamp function comment, is the absence of an skb in the tcp case. That is immaterial at this level.
I will just not refactor things into a function: __sock_rescv_timestamp_new(). I will just add new conditionals for the new timestamps. When you guys refactor the other timestamp stuff like you mentioned below maybe you can move the new timestamps to a new funtcion as you see fit. The helper functions in skbuff.h might first need to be refactored first. But I again leave this to you guys.
Note also (2) tentative helper function sock_uses_new_tstamp(const
struct sock *sk) instead of testing sock_flag(sk, SOCK_TSTAMP_NEW)
directly. Since the .._NEW variants are equivalent to .._OLD on 64-bit,
I wonder if we can just compile out the branch. Something like
static inline bool sock_uses_new_tstamp(const struct sock *sk) {
return (sizeof(time_t) != sizeof(__kernel_long_t)) &&
sock_flag(sk, SOCK_TSTAMP_NEW);
}You could just ifdef CONFIG_64BIT if you are worried about branching. Note that SO_TIMESTAMP is by default SO_TIMESTAMP_OLD on 64 bit machines. But, I will again leave the optimization to you. I will implement in a straight forward way and you guys can deicde how you want to optimize the fast path or what should it even be. -Deepa