diff mbox series

[net-next,1/8] inet: preserve const qualifier in inet_sk()

Message ID 20230315154245.3405750-2-edumazet@google.com (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series inet: better const qualifier awareness | expand

Checks

Context Check Description
netdev/series_format success Posting correctly formatted
netdev/tree_selection success Clearly marked for net-next
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 2182 this patch: 2182
netdev/cc_maintainers warning 13 maintainers not CCed: jmorris@namei.org mhiramat@kernel.org willemdebruijn.kernel@gmail.com serge@hallyn.com linux-trace-kernel@vger.kernel.org mptcp@lists.linux.dev cuiyunhui@bytedance.com rostedt@goodmis.org duanxiongchun@bytedance.com matthieu.baerts@tessares.net linux-security-module@vger.kernel.org paul@paul-moore.com peilin.ye@bytedance.com
netdev/build_clang success Errors and warnings before: 525 this patch: 525
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 2318 this patch: 2318
netdev/checkpatch fail ERROR: code indent should use tabs where possible WARNING: please, no space before tabs WARNING: please, no spaces at the start of a line
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline warning Was 1 now: 1

Commit Message

Eric Dumazet March 15, 2023, 3:42 p.m. UTC
We can change inet_sk() to propagate const qualifier of its argument.

This should avoid some potential errors caused by accidental
(const -> not_const) promotion.

Signed-off-by: Eric Dumazet <edumazet@google.com>
---
 include/net/inet_sock.h     | 9 +++++----
 include/trace/events/sock.h | 4 ++--
 include/trace/events/tcp.h  | 2 +-
 net/ipv4/ip_output.c        | 5 +++--
 net/ipv6/ping.c             | 2 +-
 net/ipv6/udp.c              | 2 +-
 net/mptcp/sockopt.c         | 2 +-
 security/lsm_audit.c        | 4 ++--
 8 files changed, 16 insertions(+), 14 deletions(-)

Comments

Simon Horman March 15, 2023, 6:52 p.m. UTC | #1
On Wed, Mar 15, 2023 at 03:42:38PM +0000, Eric Dumazet wrote:
> We can change inet_sk() to propagate const qualifier of its argument.
> 
> This should avoid some potential errors caused by accidental
> (const -> not_const) promotion.
> 
> Signed-off-by: Eric Dumazet <edumazet@google.com>

Thanks Eric,

very nice to see this kind of change.

Reviewed-by: Simon Horman <simon.horman@corigine.com>

...

> diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h
> index 51857117ac0995cee20c1e62752c470d2a473fa8..6eb8235be67f8b8265cd86782aed2b489e8850ee 100644
> --- a/include/net/inet_sock.h
> +++ b/include/net/inet_sock.h
> @@ -305,10 +305,11 @@ static inline struct sock *skb_to_full_sk(const struct sk_buff *skb)
>  	return sk_to_full_sk(skb->sk);
>  }
>  
> -static inline struct inet_sock *inet_sk(const struct sock *sk)
> -{
> -	return (struct inet_sock *)sk;
> -}
> +#define inet_sk(sk) \
> +       _Generic(sk,                                          		\

nit: checkpatch tells me that
     There are spaces before tabs (before the '\') on the line above,
     and this macro uses spaces for indentation.

> +                const struct sock * : ((const struct inet_sock *)(sk)),	\
> +                struct sock * : ((struct inet_sock *)(sk))		\
> +       )
>  
>  static inline void __inet_sk_copy_descendant(struct sock *sk_to,
>  					     const struct sock *sk_from,

...
Jakub Kicinski March 15, 2023, 9:28 p.m. UTC | #2
On Wed, 15 Mar 2023 15:42:38 +0000 Eric Dumazet wrote:
> -static inline struct inet_sock *inet_sk(const struct sock *sk)
> -{
> -	return (struct inet_sock *)sk;
> -}
> +#define inet_sk(sk) \
> +       _Generic(sk,                                          		\
> +                const struct sock * : ((const struct inet_sock *)(sk)),	\
> +                struct sock * : ((struct inet_sock *)(sk))		\
> +       )

Could we possibly use container_of_const() or define a new common
macro for this downcast? I'm worried it will spread and it's a bit
verbose.

(I think Greg is constifying things too so let me add him and Linus.)
Eric Dumazet March 15, 2023, 10:37 p.m. UTC | #3
On Wed, Mar 15, 2023 at 2:28 PM Jakub Kicinski <kuba@kernel.org> wrote:
>
> On Wed, 15 Mar 2023 15:42:38 +0000 Eric Dumazet wrote:
> > -static inline struct inet_sock *inet_sk(const struct sock *sk)
> > -{
> > -     return (struct inet_sock *)sk;
> > -}
> > +#define inet_sk(sk) \
> > +       _Generic(sk,                                                          \
> > +                const struct sock * : ((const struct inet_sock *)(sk)),      \
> > +                struct sock * : ((struct inet_sock *)(sk))           \
> > +       )
>
> Could we possibly use container_of_const() or define a new common
> macro for this downcast? I'm worried it will spread and it's a bit
> verbose.

I did see container_of_const() but the default: case was not appealing to me.

Maybe something like this?

diff --git a/include/linux/container_of.h b/include/linux/container_of.h
index 713890c867bea78804defe1a015e3c362f40f85d..9a24d8db1f4c46166c07589bb084eda9b9ede8ba
100644
--- a/include/linux/container_of.h
+++ b/include/linux/container_of.h
@@ -35,4 +35,10 @@
                default: ((type *)container_of(ptr, type, member))      \
        )

+#define promote_to_type(ptr, oldtype, newtype)                 \
+       _Generic(ptr,                                           \
+                const oldtype *: ((const newtype *)(ptr)),     \
+                oldtype *: ((newtype *)(ptr))                  \
+       )
+
 #endif /* _LINUX_CONTAINER_OF_H */
diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h
index 6eb8235be67f8b8265cd86782aed2b489e8850ee..96f41b3c1a3e4b6ad1c6d2058ca46686be282c03
100644
--- a/include/net/inet_sock.h
+++ b/include/net/inet_sock.h
@@ -305,11 +305,7 @@ static inline struct sock *skb_to_full_sk(const
struct sk_buff *skb)
        return sk_to_full_sk(skb->sk);
 }

-#define inet_sk(sk) \
-       _Generic(sk,                                                    \
-                const struct sock * : ((const struct inet_sock
*)(sk)),        \
-                struct sock * : ((struct inet_sock *)(sk))             \
-       )
+#define inet_sk(sk) promote_to_type(sk, struct sock, struct inet_sock)

 static inline void __inet_sk_copy_descendant(struct sock *sk_to,
                                             const struct sock *sk_from,
Jakub Kicinski March 15, 2023, 11:08 p.m. UTC | #4
On Wed, 15 Mar 2023 15:37:50 -0700 Eric Dumazet wrote:
> I did see container_of_const() but the default: case was not appealing to me.
> 
> Maybe something like this?
> 
> diff --git a/include/linux/container_of.h b/include/linux/container_of.h
> index 713890c867bea78804defe1a015e3c362f40f85d..9a24d8db1f4c46166c07589bb084eda9b9ede8ba
> 100644
> --- a/include/linux/container_of.h
> +++ b/include/linux/container_of.h
> @@ -35,4 +35,10 @@
>                 default: ((type *)container_of(ptr, type, member))      \
>         )
> 
> +#define promote_to_type(ptr, oldtype, newtype)                 \
> +       _Generic(ptr,                                           \
> +                const oldtype *: ((const newtype *)(ptr)),     \
> +                oldtype *: ((newtype *)(ptr))                  \
> +       )

Perfect, I'll defer to you on whether you want to patch it on top 
or repost the series.
Eric Dumazet March 15, 2023, 11:16 p.m. UTC | #5
On Wed, Mar 15, 2023 at 4:08 PM Jakub Kicinski <kuba@kernel.org> wrote:
>
> On Wed, 15 Mar 2023 15:37:50 -0700 Eric Dumazet wrote:
> > I did see container_of_const() but the default: case was not appealing to me.
> >
> > Maybe something like this?
> >
> > diff --git a/include/linux/container_of.h b/include/linux/container_of.h
> > index 713890c867bea78804defe1a015e3c362f40f85d..9a24d8db1f4c46166c07589bb084eda9b9ede8ba
> > 100644
> > --- a/include/linux/container_of.h
> > +++ b/include/linux/container_of.h
> > @@ -35,4 +35,10 @@
> >                 default: ((type *)container_of(ptr, type, member))      \
> >         )
> >
> > +#define promote_to_type(ptr, oldtype, newtype)                 \
> > +       _Generic(ptr,                                           \
> > +                const oldtype *: ((const newtype *)(ptr)),     \
> > +                oldtype *: ((newtype *)(ptr))                  \
> > +       )
>
> Perfect, I'll defer to you on whether you want to patch it on top
> or repost the series.

I'll post a v2 tomorrow, thank you.
Linus Torvalds March 15, 2023, 11:21 p.m. UTC | #6
On Wed, Mar 15, 2023 at 3:38 PM Eric Dumazet <edumazet@google.com> wrote:
>
> Maybe something like this?

Please no.

> +#define promote_to_type(ptr, oldtype, newtype)                 \
> +       _Generic(ptr,                                           \
> +                const oldtype *: ((const newtype *)(ptr)),     \
> +                oldtype *: ((newtype *)(ptr))                  \
> +       )

That's just a very ugly way to just do a cast. It's wrong.

> +#define inet_sk(sk) promote_to_type(sk, struct sock, struct inet_sock)

This is horrid.

Why isn't this just doing

   #define inet_sk(ptr) container_of(ptr, struct inet_sock, sk)

which is different from a plain cast in that it actually checks that
"yes, struct inet_sock has a member called 'sk' that has the right
type, so now we can convert from that sk to the containing structure".

That's very different from just randomly casting a pointer to another
pointer, like the current inet_sk() does, and like that disgusting
promote_to_type() macro does.

We really strive for proper type safety in the kernel. And that very
much means *not* doing random casts.

At least that "inet_sk(sk)" version using generics didn't take random
pointer types. But I really don't see why you don't just use
"container_of()", which is actually type-safe, and would allow "struct
inet_sock" to contain the "struct sock" somewhere else than in the
first field.

Hmm? Am I missing something that is happening in linux-next?

                Linus
Eric Dumazet March 15, 2023, 11:37 p.m. UTC | #7
On Wed, Mar 15, 2023 at 4:21 PM Linus Torvalds
<torvalds@linux-foundation.org> wrote:
>
> On Wed, Mar 15, 2023 at 3:38 PM Eric Dumazet <edumazet@google.com> wrote:
> >
> > Maybe something like this?
>
> Please no.
>
> > +#define promote_to_type(ptr, oldtype, newtype)                 \
> > +       _Generic(ptr,                                           \
> > +                const oldtype *: ((const newtype *)(ptr)),     \
> > +                oldtype *: ((newtype *)(ptr))                  \
> > +       )
>
> That's just a very ugly way to just do a cast. It's wrong.
>
> > +#define inet_sk(sk) promote_to_type(sk, struct sock, struct inet_sock)
>
> This is horrid.
>
> Why isn't this just doing
>
>    #define inet_sk(ptr) container_of(ptr, struct inet_sock, sk)
>
> which is different from a plain cast in that it actually checks that
> "yes, struct inet_sock has a member called 'sk' that has the right
> type, so now we can convert from that sk to the containing structure".
>
> That's very different from just randomly casting a pointer to another
> pointer, like the current inet_sk() does, and like that disgusting
> promote_to_type() macro does.
>
> We really strive for proper type safety in the kernel. And that very
> much means *not* doing random casts.
>
> At least that "inet_sk(sk)" version using generics didn't take random
> pointer types. But I really don't see why you don't just use
> "container_of()", which is actually type-safe, and would allow "struct
> inet_sock" to contain the "struct sock" somewhere else than in the
> first field.
>
> Hmm? Am I missing something that is happening in linux-next?


Yep. my goal was to have const awareness.

https://patchwork.kernel.org/project/netdevbpf/patch/20230315154245.3405750-2-edumazet@google.com/

(and whole series in
https://patchwork.kernel.org/project/netdevbpf/list/?series=730398&state=*
)

This:

#define inet_sk(ptr) container_of(ptr, struct inet_sock, sk)

does not really cover what I wanted, does it ?

>
>                 Linus
Linus Torvalds March 15, 2023, 11:39 p.m. UTC | #8
On Wed, Mar 15, 2023 at 4:21 PM Linus Torvalds
<torvalds@linux-foundation.org> wrote:
>
> But I really don't see why you don't just use
> "container_of()", which is actually type-safe, and would allow "struct
> inet_sock" to contain the "struct sock" somewhere else than in the
> first field.

I guess that doesn't work, because of how sk_alloc() and friends are set up.

But I do think the networking code should strive to avoid those
"randomly cast one socket type to another".

For example, when you have a TCP socket, instead of casting from
"struct sock *" to "struct tcp_sock *" in tcp_sk(), and getting it all
wrong wrt const, I think you should do the same thing:

  #define tcp_sock(ptr) container_of(ptr, struct tcp_sock,
inet_conn.icsk_inet.sk)

to really *show* that you know that "yes, struct tcp_sock contains a
'sk' embedded three structures down!".

And no, I did not actually *test* that at all. But it should get
'const' right (because container_of() gets const right these days),
_and_ it actually verifies that the type you claim has another type
embedded in it actually does so.

                  Linus
Eric Dumazet March 15, 2023, 11:45 p.m. UTC | #9
On Wed, Mar 15, 2023 at 4:40 PM Linus Torvalds
<torvalds@linux-foundation.org> wrote:
>
> On Wed, Mar 15, 2023 at 4:21 PM Linus Torvalds
> <torvalds@linux-foundation.org> wrote:
> >
> > But I really don't see why you don't just use
> > "container_of()", which is actually type-safe, and would allow "struct
> > inet_sock" to contain the "struct sock" somewhere else than in the
> > first field.
>
> I guess that doesn't work, because of how sk_alloc() and friends are set up.
>
> But I do think the networking code should strive to avoid those
> "randomly cast one socket type to another".

Note that my v1 proposed this thing:

#define inet_sk(sk) \
+       _Generic(sk,                                           \
+                const struct sock * : ((const struct inet_sock *)(sk)), \
+                struct sock * : ((struct inet_sock *)(sk)) \
+       )


Jakub feedback was to instead use a common helper, and CCed you on the
discussion.
I do not see yet how to do this 'without cast'

Let me know if you are ok with the v1 approach.

>
> For example, when you have a TCP socket, instead of casting from
> "struct sock *" to "struct tcp_sock *" in tcp_sk(), and getting it all
> wrong wrt const, I think you should do the same thing:
>
>   #define tcp_sock(ptr) container_of(ptr, struct tcp_sock,
> inet_conn.icsk_inet.sk)
>
> to really *show* that you know that "yes, struct tcp_sock contains a
> 'sk' embedded three structures down!".
>
> And no, I did not actually *test* that at all. But it should get
> 'const' right (because container_of() gets const right these days),
> _and_ it actually verifies that the type you claim has another type
> embedded in it actually does so.
>
>                   Linus
Linus Torvalds March 15, 2023, 11:47 p.m. UTC | #10
On Wed, Mar 15, 2023 at 4:37 PM Eric Dumazet <edumazet@google.com> wrote:
>
> Yep. my goal was to have const awareness.
>
> This:
>
> #define inet_sk(ptr) container_of(ptr, struct inet_sock, sk)
>
> does not really cover what I wanted, does it ?

Ugh. You should use "container_of_const()" of course.

I *thought* we already fixed plain "container_of()" to do the right
thing,, and got rid of "container_of_const()", but that was obviously
in my dreams.

           Linus
Linus Torvalds March 15, 2023, 11:54 p.m. UTC | #11
On Wed, Mar 15, 2023 at 4:46 PM Eric Dumazet <edumazet@google.com> wrote:
>
> Note that my v1 proposed this thing:
>
> #define inet_sk(sk) \
> +       _Generic(sk,                                           \
> +                const struct sock * : ((const struct inet_sock *)(sk)), \
> +                struct sock * : ((struct inet_sock *)(sk)) \
> +       )

Right. That was better.

But:

> Jakub feedback was to instead use a common helper, and CCed you on the
> discussion.
> I do not see yet how to do this 'without cast'

That's _exactly_ what container_of_const() does.

I actually would want to make "container_of()" itself do that
correctly, but we clearly have too many broken cases as-is, so
'container_of_const' it is.

             Linus
Eric Dumazet March 15, 2023, 11:56 p.m. UTC | #12
On Wed, Mar 15, 2023 at 4:54 PM Linus Torvalds
<torvalds@linux-foundation.org> wrote:
>
> On Wed, Mar 15, 2023 at 4:46 PM Eric Dumazet <edumazet@google.com> wrote:
> >
> > Note that my v1 proposed this thing:
> >
> > #define inet_sk(sk) \
> > +       _Generic(sk,                                           \
> > +                const struct sock * : ((const struct inet_sock *)(sk)), \
> > +                struct sock * : ((struct inet_sock *)(sk)) \
> > +       )
>
> Right. That was better.
>
> But:
>
> > Jakub feedback was to instead use a common helper, and CCed you on the
> > discussion.
> > I do not see yet how to do this 'without cast'
>
> That's _exactly_ what container_of_const() does.
>
> I actually would want to make "container_of()" itself do that
> correctly, but we clearly have too many broken cases as-is, so
> 'container_of_const' it is.

container_of_const() does not detect this bug at compile time, does it ?

struct sk_buff *skb = ...;

struct inet_sk *inet = inet_sk(skb);
Linus Torvalds March 16, 2023, 12:02 a.m. UTC | #13
On Wed, Mar 15, 2023 at 4:56 PM Eric Dumazet <edumazet@google.com> wrote:
>
> container_of_const() does not detect this bug at compile time, does it ?
>
> struct sk_buff *skb = ...;
>
> struct inet_sk *inet = inet_sk(skb);

You didn't actually test it, did you?

I get about 40 lines of error messages about how broken that is, starting with

   ./include/linux/build_bug.h:78:41: error: static assertion failed:
"pointer type mismatch in container_of()"

exactly because yes, 'container_of()' is very pissy indeed about bogus
conversions.

You can only convert a named member into a containing structure, and
'inet_sk' does not contain a member named 'sk' that is of type 'struct
skb_buff'.

            Linus
Eric Dumazet March 16, 2023, 12:11 a.m. UTC | #14
On Wed, Mar 15, 2023 at 5:02 PM Linus Torvalds
<torvalds@linux-foundation.org> wrote:
>
> On Wed, Mar 15, 2023 at 4:56 PM Eric Dumazet <edumazet@google.com> wrote:
> >
> > container_of_const() does not detect this bug at compile time, does it ?
> >
> > struct sk_buff *skb = ...;
> >
> > struct inet_sk *inet = inet_sk(skb);
>
> You didn't actually test it, did you?

I thought I did, sorry. I will spend more time on it.

>
> I get about 40 lines of error messages about how broken that is, starting with
>
>    ./include/linux/build_bug.h:78:41: error: static assertion failed:
> "pointer type mismatch in container_of()"
>
> exactly because yes, 'container_of()' is very pissy indeed about bogus
> conversions.
>
> You can only convert a named member into a containing structure, and
> 'inet_sk' does not contain a member named 'sk' that is of type 'struct
> skb_buff'.
>
>             Linus
Eric Dumazet March 16, 2023, 12:23 a.m. UTC | #15
On Wed, Mar 15, 2023 at 5:11 PM Eric Dumazet <edumazet@google.com> wrote:
>
> On Wed, Mar 15, 2023 at 5:02 PM Linus Torvalds
> <torvalds@linux-foundation.org> wrote:
> >
> > On Wed, Mar 15, 2023 at 4:56 PM Eric Dumazet <edumazet@google.com> wrote:
> > >
> > > container_of_const() does not detect this bug at compile time, does it ?
> > >
> > > struct sk_buff *skb = ...;
> > >
> > > struct inet_sk *inet = inet_sk(skb);
> >
> > You didn't actually test it, did you?
>
> I thought I did, sorry. I will spend more time on it.

Oh I might have been fooled, because of course we can not use sk for
the macro parameter name.

-ENOTENOUGHSLEEP

Basically something like this should work just fine

diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h
index 6eb8235be67f8b8265cd86782aed2b489e8850ee..caa20a9055310f5ef108f9b1bb43214a3d598b9e
100644
--- a/include/net/inet_sock.h
+++ b/include/net/inet_sock.h
@@ -305,11 +305,7 @@ static inline struct sock *skb_to_full_sk(const
struct sk_buff *skb)
        return sk_to_full_sk(skb->sk);
 }

-#define inet_sk(sk) \
-       _Generic(sk,                                                    \
-                const struct sock * : ((const struct inet_sock
*)(sk)),        \
-                struct sock * : ((struct inet_sock *)(sk))             \
-       )
+#define inet_sk(ptr) container_of_const(ptr, struct inet_sock, sk)

 static inline void __inet_sk_copy_descendant(struct sock *sk_to,
                                             const struct sock *sk_from,
Linus Torvalds March 16, 2023, 12:34 a.m. UTC | #16
On Wed, Mar 15, 2023 at 5:23 PM Eric Dumazet <edumazet@google.com> wrote:
>
> Oh I might have been fooled, because of course we can not use sk for
> the macro parameter name.

Heh. Yeah, that will rename the 'sk' member name too, and cause some
*very* strange errors.

> Basically something like this should work just fine

Yup.

I'm testing it on the current git tree, and I'm finding a number of
random issues, but it looks manageable. Attached is what I ended up
with.

You have presumably already fixed these issues in your tree.

Btw, it's very much things like 'tcp_sk()' too, and doing that with

   #define tcp_sk(ptr) container_of_const(ptr, struct tcp_sock,
inet_conn.icsk_inet.sk)

actually shows some fundamental problems. For example, we have
tcp_synq_overflow() that takes a const sk pointer, but then it does

        WRITE_ONCE(tcp_sk(sk)->rx_opt.ts_recent_stamp, now);

which is a big no-no and writes to that sock thing.

I didn't even try any of the other 'xyzzy_sk()' conversions.

                   Linus
diff mbox series

Patch

diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h
index 51857117ac0995cee20c1e62752c470d2a473fa8..6eb8235be67f8b8265cd86782aed2b489e8850ee 100644
--- a/include/net/inet_sock.h
+++ b/include/net/inet_sock.h
@@ -305,10 +305,11 @@  static inline struct sock *skb_to_full_sk(const struct sk_buff *skb)
 	return sk_to_full_sk(skb->sk);
 }
 
-static inline struct inet_sock *inet_sk(const struct sock *sk)
-{
-	return (struct inet_sock *)sk;
-}
+#define inet_sk(sk) \
+       _Generic(sk,                                          		\
+                const struct sock * : ((const struct inet_sock *)(sk)),	\
+                struct sock * : ((struct inet_sock *)(sk))		\
+       )
 
 static inline void __inet_sk_copy_descendant(struct sock *sk_to,
 					     const struct sock *sk_from,
diff --git a/include/trace/events/sock.h b/include/trace/events/sock.h
index 03d19fc562f872d68cfb2349797f0924cfba718b..fd206a6ab5b85a8eb50fc9303abc28d74c50ea07 100644
--- a/include/trace/events/sock.h
+++ b/include/trace/events/sock.h
@@ -158,7 +158,7 @@  TRACE_EVENT(inet_sock_set_state,
 	),
 
 	TP_fast_assign(
-		struct inet_sock *inet = inet_sk(sk);
+		const struct inet_sock *inet = inet_sk(sk);
 		struct in6_addr *pin6;
 		__be32 *p32;
 
@@ -222,7 +222,7 @@  TRACE_EVENT(inet_sk_error_report,
 	),
 
 	TP_fast_assign(
-		struct inet_sock *inet = inet_sk(sk);
+		const struct inet_sock *inet = inet_sk(sk);
 		struct in6_addr *pin6;
 		__be32 *p32;
 
diff --git a/include/trace/events/tcp.h b/include/trace/events/tcp.h
index 901b440238d5fc203b78cff1081b4b7e1e2eb4bd..bf06db8d2046c4a7f59070b724ce6fc7762f9d4b 100644
--- a/include/trace/events/tcp.h
+++ b/include/trace/events/tcp.h
@@ -67,7 +67,7 @@  DECLARE_EVENT_CLASS(tcp_event_sk_skb,
 	),
 
 	TP_fast_assign(
-		struct inet_sock *inet = inet_sk(sk);
+		const struct inet_sock *inet = inet_sk(sk);
 		__be32 *p32;
 
 		__entry->skbaddr = skb;
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index e7bef36ce26f5b5e5503eaf14319b2465b779598..cb04dbad9ea474fcaa4b5ba31c4a37299c4e1a8d 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -129,7 +129,8 @@  int ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb)
 }
 EXPORT_SYMBOL_GPL(ip_local_out);
 
-static inline int ip_select_ttl(struct inet_sock *inet, struct dst_entry *dst)
+static inline int ip_select_ttl(const struct inet_sock *inet,
+				const struct dst_entry *dst)
 {
 	int ttl = inet->uc_ttl;
 
@@ -146,7 +147,7 @@  int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk,
 			  __be32 saddr, __be32 daddr, struct ip_options_rcu *opt,
 			  u8 tos)
 {
-	struct inet_sock *inet = inet_sk(sk);
+	const struct inet_sock *inet = inet_sk(sk);
 	struct rtable *rt = skb_rtable(skb);
 	struct net *net = sock_net(sk);
 	struct iphdr *iph;
diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c
index 808983bc2ec9f92be7d13237fb7d52b6423ccf23..c4835dbdfcff7912465713cdac9914b0f5585972 100644
--- a/net/ipv6/ping.c
+++ b/net/ipv6/ping.c
@@ -237,7 +237,7 @@  static int ping_v6_seq_show(struct seq_file *seq, void *v)
 		seq_puts(seq, IPV6_SEQ_DGRAM_HEADER);
 	} else {
 		int bucket = ((struct ping_iter_state *) seq->private)->bucket;
-		struct inet_sock *inet = inet_sk(v);
+		struct inet_sock *inet = inet_sk((struct sock *)v);
 		__u16 srcp = ntohs(inet->inet_sport);
 		__u16 destp = ntohs(inet->inet_dport);
 		ip6_dgram_sock_seq_show(seq, v, srcp, destp, bucket);
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 9fb2f33ee3a76a09bbe15a9aaf1371a804f91ee2..ab4ae886235ac9557219c901c5041adfa8b026ef 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -1708,7 +1708,7 @@  int udp6_seq_show(struct seq_file *seq, void *v)
 		seq_puts(seq, IPV6_SEQ_DGRAM_HEADER);
 	} else {
 		int bucket = ((struct udp_iter_state *)seq->private)->bucket;
-		struct inet_sock *inet = inet_sk(v);
+		const struct inet_sock *inet = inet_sk((const struct sock *)v);
 		__u16 srcp = ntohs(inet->inet_sport);
 		__u16 destp = ntohs(inet->inet_dport);
 		__ip6_dgram_sock_seq_show(seq, v, srcp, destp,
diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c
index 8a9656248b0f09e78ebf3d6d787449f33505b81f..5cef4d3d21ac824ab6d3a5ee8be3bd00cce63925 100644
--- a/net/mptcp/sockopt.c
+++ b/net/mptcp/sockopt.c
@@ -1046,7 +1046,7 @@  static int mptcp_getsockopt_tcpinfo(struct mptcp_sock *msk, char __user *optval,
 
 static void mptcp_get_sub_addrs(const struct sock *sk, struct mptcp_subflow_addrs *a)
 {
-	struct inet_sock *inet = inet_sk(sk);
+	const struct inet_sock *inet = inet_sk(sk);
 
 	memset(a, 0, sizeof(*a));
 
diff --git a/security/lsm_audit.c b/security/lsm_audit.c
index a7355b4b9bb86d173f94e43109148bc0ea27d1b3..00d3bdd386e294ecd562bfa8ce502bf179ad32d9 100644
--- a/security/lsm_audit.c
+++ b/security/lsm_audit.c
@@ -317,7 +317,7 @@  static void dump_common_audit_data(struct audit_buffer *ab,
 
 			switch (sk->sk_family) {
 			case AF_INET: {
-				struct inet_sock *inet = inet_sk(sk);
+				const struct inet_sock *inet = inet_sk(sk);
 
 				print_ipv4_addr(ab, inet->inet_rcv_saddr,
 						inet->inet_sport,
@@ -329,7 +329,7 @@  static void dump_common_audit_data(struct audit_buffer *ab,
 			}
 #if IS_ENABLED(CONFIG_IPV6)
 			case AF_INET6: {
-				struct inet_sock *inet = inet_sk(sk);
+				const struct inet_sock *inet = inet_sk(sk);
 
 				print_ipv6_addr(ab, &sk->sk_v6_rcv_saddr,
 						inet->inet_sport,