sock: struct proto hash function may error
In order to support fast reuseport lookups in TCP, the hash function defined in struct proto must be capable of returning an error code. This patch changes the function signature of all related hash functions to return an integer and handles or propagates this return value at all call sites. Signed-off-by: Craig Gallek <kraig@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
30c1de08dd
commit
086c653f58
15 changed files with 53 additions and 25 deletions
|
@ -370,7 +370,11 @@ lookup_protocol:
|
|||
*/
|
||||
inet->inet_sport = htons(inet->inet_num);
|
||||
/* Add to protocol hash chains. */
|
||||
sk->sk_prot->hash(sk);
|
||||
err = sk->sk_prot->hash(sk);
|
||||
if (err) {
|
||||
sk_common_release(sk);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
if (sk->sk_prot->init) {
|
||||
|
@ -1142,8 +1146,7 @@ static int inet_sk_reselect_saddr(struct sock *sk)
|
|||
* Besides that, it does not check for connection
|
||||
* uniqueness. Wait for troubles.
|
||||
*/
|
||||
__sk_prot_rehash(sk);
|
||||
return 0;
|
||||
return __sk_prot_rehash(sk);
|
||||
}
|
||||
|
||||
int inet_sk_rebuild_header(struct sock *sk)
|
||||
|
|
|
@ -734,6 +734,7 @@ int inet_csk_listen_start(struct sock *sk, int backlog)
|
|||
{
|
||||
struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
struct inet_sock *inet = inet_sk(sk);
|
||||
int err = -EADDRINUSE;
|
||||
|
||||
reqsk_queue_alloc(&icsk->icsk_accept_queue);
|
||||
|
||||
|
@ -751,13 +752,14 @@ int inet_csk_listen_start(struct sock *sk, int backlog)
|
|||
inet->inet_sport = htons(inet->inet_num);
|
||||
|
||||
sk_dst_reset(sk);
|
||||
sk->sk_prot->hash(sk);
|
||||
err = sk->sk_prot->hash(sk);
|
||||
|
||||
return 0;
|
||||
if (likely(!err))
|
||||
return 0;
|
||||
}
|
||||
|
||||
sk->sk_state = TCP_CLOSE;
|
||||
return -EADDRINUSE;
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(inet_csk_listen_start);
|
||||
|
||||
|
|
|
@ -468,13 +468,15 @@ void __inet_hash(struct sock *sk, struct sock *osk)
|
|||
}
|
||||
EXPORT_SYMBOL(__inet_hash);
|
||||
|
||||
void inet_hash(struct sock *sk)
|
||||
int inet_hash(struct sock *sk)
|
||||
{
|
||||
if (sk->sk_state != TCP_CLOSE) {
|
||||
local_bh_disable();
|
||||
__inet_hash(sk, NULL);
|
||||
local_bh_enable();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(inet_hash);
|
||||
|
||||
|
|
|
@ -145,10 +145,12 @@ fail:
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(ping_get_port);
|
||||
|
||||
void ping_hash(struct sock *sk)
|
||||
int ping_hash(struct sock *sk)
|
||||
{
|
||||
pr_debug("ping_hash(sk->port=%u)\n", inet_sk(sk)->inet_num);
|
||||
BUG(); /* "Please do not press this button again." */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ping_unhash(struct sock *sk)
|
||||
|
|
|
@ -93,7 +93,7 @@ static struct raw_hashinfo raw_v4_hashinfo = {
|
|||
.lock = __RW_LOCK_UNLOCKED(raw_v4_hashinfo.lock),
|
||||
};
|
||||
|
||||
void raw_hash_sk(struct sock *sk)
|
||||
int raw_hash_sk(struct sock *sk)
|
||||
{
|
||||
struct raw_hashinfo *h = sk->sk_prot->h.raw_hash;
|
||||
struct hlist_head *head;
|
||||
|
@ -104,6 +104,8 @@ void raw_hash_sk(struct sock *sk)
|
|||
sk_add_node(sk, head);
|
||||
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
|
||||
write_unlock_bh(&h->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(raw_hash_sk);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue