netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] inet: fix fast path in __inet_hash_connect()
@ 2023-01-13 11:39 Pietro Borrello
  2023-01-13 12:16 ` Eric Dumazet
  0 siblings, 1 reply; 4+ messages in thread
From: Pietro Borrello @ 2023-01-13 11:39 UTC (permalink / raw)
  To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Hideaki YOSHIFUJI, David Ahern
  Cc: Cristiano Giuffrida, Bos, H.J.,
	Jakob Koschel, netdev, linux-kernel, Kuniyuki Iwashima,
	Pietro Borrello

__inet_hash_connect() has a fast path taken if sk_head(&tb->owners) is
equal to the sk parameter.
sk_head() returns the hlist_entry() with respect to the sk_node field.
However entries in the tb->owners list are inserted with respect to the
sk_bind_node field with sk_add_bind_node().
Thus the check would never pass and the fast path never execute.

Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Signed-off-by: Pietro Borrello <borrello@diag.uniroma1.it>
---
Changes in v2:
- nit: s/list_entry/hlist_entry/
- Link to v1: https://lore.kernel.org/r/20230112-inet_hash_connect_bind_head-v1-1-7e3c770157c8@diag.uniroma1.it
---
 include/net/sock.h         | 10 ++++++++++
 net/ipv4/inet_hashtables.c |  2 +-
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/include/net/sock.h b/include/net/sock.h
index dcd72e6285b2..23fc403284db 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -860,6 +860,16 @@ static inline void sk_nulls_add_node_rcu(struct sock *sk, struct hlist_nulls_hea
 	__sk_nulls_add_node_rcu(sk, list);
 }
 
+static inline struct sock *__sk_bind_head(const struct hlist_head *head)
+{
+	return hlist_entry(head->first, struct sock, sk_bind_node);
+}
+
+static inline struct sock *sk_bind_head(const struct hlist_head *head)
+{
+	return hlist_empty(head) ? NULL : __sk_bind_head(head);
+}
+
 static inline void __sk_del_bind_node(struct sock *sk)
 {
 	__hlist_del(&sk->sk_bind_node);
diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c
index d039b4e732a3..a805e086fb48 100644
--- a/net/ipv4/inet_hashtables.c
+++ b/net/ipv4/inet_hashtables.c
@@ -998,7 +998,7 @@ int __inet_hash_connect(struct inet_timewait_death_row *death_row,
 						  hinfo->bhash_size)];
 		tb = inet_csk(sk)->icsk_bind_hash;
 		spin_lock_bh(&head->lock);
-		if (sk_head(&tb->owners) == sk && !sk->sk_bind_node.next) {
+		if (sk_bind_head(&tb->owners) == sk && !sk->sk_bind_node.next) {
 			inet_ehash_nolisten(sk, NULL, NULL);
 			spin_unlock_bh(&head->lock);
 			return 0;

---
base-commit: 1b929c02afd37871d5afb9d498426f83432e71c2
change-id: 20230112-inet_hash_connect_bind_head-8f2dc98f08b1

Best regards,
-- 
Pietro Borrello <borrello@diag.uniroma1.it>

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] inet: fix fast path in __inet_hash_connect()
  2023-01-13 11:39 [PATCH v2] inet: fix fast path in __inet_hash_connect() Pietro Borrello
@ 2023-01-13 12:16 ` Eric Dumazet
  2023-01-14 12:17   ` Pietro Borrello
  0 siblings, 1 reply; 4+ messages in thread
From: Eric Dumazet @ 2023-01-13 12:16 UTC (permalink / raw)
  To: Pietro Borrello
  Cc: David S. Miller, Jakub Kicinski, Paolo Abeni, Hideaki YOSHIFUJI,
	David Ahern, Cristiano Giuffrida, Bos, H.J.,
	Jakob Koschel, netdev, linux-kernel, Kuniyuki Iwashima

On Fri, Jan 13, 2023 at 12:40 PM Pietro Borrello
<borrello@diag.uniroma1.it> wrote:
>
> __inet_hash_connect() has a fast path taken if sk_head(&tb->owners) is
> equal to the sk parameter.
> sk_head() returns the hlist_entry() with respect to the sk_node field.
> However entries in the tb->owners list are inserted with respect to the
> sk_bind_node field with sk_add_bind_node().
> Thus the check would never pass and the fast path never execute.
>
> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
> Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
> Signed-off-by: Pietro Borrello <borrello@diag.uniroma1.it>
> ---
> Changes in v2:
> - nit: s/list_entry/hlist_entry/
> - Link to v1: https://lore.kernel.org/r/20230112-inet_hash_connect_bind_head-v1-1-7e3c770157c8@diag.uniroma1.it
> ---
>  include/net/sock.h         | 10 ++++++++++
>  net/ipv4/inet_hashtables.c |  2 +-
>  2 files changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/include/net/sock.h b/include/net/sock.h
> index dcd72e6285b2..23fc403284db 100644
> --- a/include/net/sock.h
> +++ b/include/net/sock.h
> @@ -860,6 +860,16 @@ static inline void sk_nulls_add_node_rcu(struct sock *sk, struct hlist_nulls_hea
>         __sk_nulls_add_node_rcu(sk, list);
>  }
>
> +static inline struct sock *__sk_bind_head(const struct hlist_head *head)
> +{
> +       return hlist_entry(head->first, struct sock, sk_bind_node);
> +}
> +
> +static inline struct sock *sk_bind_head(const struct hlist_head *head)
> +{
> +       return hlist_empty(head) ? NULL : __sk_bind_head(head);
> +}
> +
>  static inline void __sk_del_bind_node(struct sock *sk)
>  {
>         __hlist_del(&sk->sk_bind_node);
> diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c
> index d039b4e732a3..a805e086fb48 100644
> --- a/net/ipv4/inet_hashtables.c
> +++ b/net/ipv4/inet_hashtables.c
> @@ -998,7 +998,7 @@ int __inet_hash_connect(struct inet_timewait_death_row *death_row,
>                                                   hinfo->bhash_size)];
>                 tb = inet_csk(sk)->icsk_bind_hash;
>                 spin_lock_bh(&head->lock);
> -               if (sk_head(&tb->owners) == sk && !sk->sk_bind_node.next) {
> +               if (sk_bind_head(&tb->owners) == sk && !sk->sk_bind_node.next) {
>                         inet_ehash_nolisten(sk, NULL, NULL);

1) Given this path was never really used, we have no coverage.

2) Given that we do not check inet_ehash_nolisten() return code here.

I would recommend _not_ adding the Fixes: tag, and target net-next tree

In fact, I would remove this dead code, and reduce complexity.

I doubt the difference is going to be noticed.
(We have to access the ehash bucket anyway)


>                         spin_unlock_bh(&head->lock);
>                         return 0;
>
> ---
> base-commit: 1b929c02afd37871d5afb9d498426f83432e71c2
> change-id: 20230112-inet_hash_connect_bind_head-8f2dc98f08b1
>
> Best regards,
> --
> Pietro Borrello <borrello@diag.uniroma1.it>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] inet: fix fast path in __inet_hash_connect()
  2023-01-13 12:16 ` Eric Dumazet
@ 2023-01-14 12:17   ` Pietro Borrello
  2023-01-14 12:21     ` Eric Dumazet
  0 siblings, 1 reply; 4+ messages in thread
From: Pietro Borrello @ 2023-01-14 12:17 UTC (permalink / raw)
  To: Eric Dumazet, Kuniyuki Iwashima
  Cc: David S. Miller, Jakub Kicinski, Paolo Abeni, Hideaki YOSHIFUJI,
	David Ahern, Cristiano Giuffrida, Bos, H.J.,
	Jakob Koschel, netdev, linux-kernel

On Fri, 13 Jan 2023 at 13:16, Eric Dumazet <edumazet@google.com> wrote:
> 1) Given this path was never really used, we have no coverage.
>
> 2) Given that we do not check inet_ehash_nolisten() return code here.

It seems there are a bunch of call sites where inet_ehash_nolisten() return
code is not checked, thus I didn't think of it to be a problem.

>
> I would recommend _not_ adding the Fixes: tag, and target net-next tree
>
> In fact, I would remove this dead code, and reduce complexity.
>

This makes a lot of sense. I can post a v3 patch completely removing
the fast path.

However, this patch's v1 was already reviewed by
Kuniyuki Iwashima <kuniyu@amazon.com>, v2 is a nit, if posting a v3
I think I should remove the Reviewed-by: since it would completely
change the patch, but what is the preferred fix?

Best regards,
Pietro

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] inet: fix fast path in __inet_hash_connect()
  2023-01-14 12:17   ` Pietro Borrello
@ 2023-01-14 12:21     ` Eric Dumazet
  0 siblings, 0 replies; 4+ messages in thread
From: Eric Dumazet @ 2023-01-14 12:21 UTC (permalink / raw)
  To: Pietro Borrello
  Cc: Kuniyuki Iwashima, David S. Miller, Jakub Kicinski, Paolo Abeni,
	Hideaki YOSHIFUJI, David Ahern, Cristiano Giuffrida, Bos, H.J.,
	Jakob Koschel, netdev, linux-kernel

On Sat, Jan 14, 2023 at 1:18 PM Pietro Borrello
<borrello@diag.uniroma1.it> wrote:
>
> On Fri, 13 Jan 2023 at 13:16, Eric Dumazet <edumazet@google.com> wrote:
> > 1) Given this path was never really used, we have no coverage.
> >
> > 2) Given that we do not check inet_ehash_nolisten() return code here.
>
> It seems there are a bunch of call sites where inet_ehash_nolisten() return
> code is not checked, thus I didn't think of it to be a problem.
>
> >
> > I would recommend _not_ adding the Fixes: tag, and target net-next tree
> >
> > In fact, I would remove this dead code, and reduce complexity.
> >
>
> This makes a lot of sense. I can post a v3 patch completely removing
> the fast path.
>
> However, this patch's v1 was already reviewed by
> Kuniyuki Iwashima <kuniyu@amazon.com>, v2 is a nit, if posting a v3
> I think I should remove the Reviewed-by: since it would completely
> change the patch, but what is the preferred fix?
>

Yes, remove it, and Kuniyuki will review it again, thanks.

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-01-14 12:21 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-01-13 11:39 [PATCH v2] inet: fix fast path in __inet_hash_connect() Pietro Borrello
2023-01-13 12:16 ` Eric Dumazet
2023-01-14 12:17   ` Pietro Borrello
2023-01-14 12:21     ` Eric Dumazet

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).