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