Commit 080a270f authored by Hannes Frederic Sowa's avatar Hannes Frederic Sowa Committed by David S. Miller

sock: don't enable netstamp for af_unix sockets

netstamp_needed is toggled for all socket families if they request
timestamping. But some protocols don't need the lower-layer timestamping
code at all. This patch starts disabling it for af-unix.

E.g. systemd enables timestamping during boot-up on the journald af-unix
sockets, thus causing the system to globally enable timestamping in the
lower networking stack. Still, it is very probable that timestamping
gets activated, by e.g. dhclient or various NTP implementations.
Reported-by: default avatarJesper Dangaard Brouer <brouer@redhat.com>
Signed-off-by: default avatarHannes Frederic Sowa <hannes@stressinduktion.org>
Acked-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6092db1a
...@@ -422,13 +422,25 @@ static void sock_warn_obsolete_bsdism(const char *name) ...@@ -422,13 +422,25 @@ static void sock_warn_obsolete_bsdism(const char *name)
} }
} }
static bool sock_needs_netstamp(const struct sock *sk)
{
switch (sk->sk_family) {
case AF_UNSPEC:
case AF_UNIX:
return false;
default:
return true;
}
}
#define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE)) #define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE))
static void sock_disable_timestamp(struct sock *sk, unsigned long flags) static void sock_disable_timestamp(struct sock *sk, unsigned long flags)
{ {
if (sk->sk_flags & flags) { if (sk->sk_flags & flags) {
sk->sk_flags &= ~flags; sk->sk_flags &= ~flags;
if (!(sk->sk_flags & SK_FLAGS_TIMESTAMP)) if (sock_needs_netstamp(sk) &&
!(sk->sk_flags & SK_FLAGS_TIMESTAMP))
net_disable_timestamp(); net_disable_timestamp();
} }
} }
...@@ -1582,7 +1594,8 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority) ...@@ -1582,7 +1594,8 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
if (newsk->sk_prot->sockets_allocated) if (newsk->sk_prot->sockets_allocated)
sk_sockets_allocated_inc(newsk); sk_sockets_allocated_inc(newsk);
if (newsk->sk_flags & SK_FLAGS_TIMESTAMP) if (sock_needs_netstamp(sk) &&
newsk->sk_flags & SK_FLAGS_TIMESTAMP)
net_enable_timestamp(); net_enable_timestamp();
} }
out: out:
...@@ -2510,7 +2523,8 @@ void sock_enable_timestamp(struct sock *sk, int flag) ...@@ -2510,7 +2523,8 @@ void sock_enable_timestamp(struct sock *sk, int flag)
* time stamping, but time stamping might have been on * time stamping, but time stamping might have been on
* already because of the other one * already because of the other one
*/ */
if (!(previous_flags & SK_FLAGS_TIMESTAMP)) if (sock_needs_netstamp(sk) &&
!(previous_flags & SK_FLAGS_TIMESTAMP))
net_enable_timestamp(); net_enable_timestamp();
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment