sctp: move hlist_node and hashent out of sctp_ep_common
Struct sctp_ep_common is included in both asoc and ep, but hlist_node
and hashent are only needed by ep after asoc_hashtable was dropped by
Commit b5eff71283 ("sctp: drop the old assoc hashtable of sctp").
So it is better to move hlist_node and hashent from sctp_ep_common to
sctp_endpoint, and it saves some space for each asoc.
Signed-off-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
e087cba116
commit
3d3b2f57d4
@@ -746,23 +746,21 @@ static int __sctp_hash_endpoint(struct sctp_endpoint *ep)
|
||||
struct sock *sk = ep->base.sk;
|
||||
struct net *net = sock_net(sk);
|
||||
struct sctp_hashbucket *head;
|
||||
struct sctp_ep_common *epb;
|
||||
|
||||
epb = &ep->base;
|
||||
epb->hashent = sctp_ep_hashfn(net, epb->bind_addr.port);
|
||||
head = &sctp_ep_hashtable[epb->hashent];
|
||||
ep->hashent = sctp_ep_hashfn(net, ep->base.bind_addr.port);
|
||||
head = &sctp_ep_hashtable[ep->hashent];
|
||||
|
||||
if (sk->sk_reuseport) {
|
||||
bool any = sctp_is_ep_boundall(sk);
|
||||
struct sctp_ep_common *epb2;
|
||||
struct sctp_endpoint *ep2;
|
||||
struct list_head *list;
|
||||
int cnt = 0, err = 1;
|
||||
|
||||
list_for_each(list, &ep->base.bind_addr.address_list)
|
||||
cnt++;
|
||||
|
||||
sctp_for_each_hentry(epb2, &head->chain) {
|
||||
struct sock *sk2 = epb2->sk;
|
||||
sctp_for_each_hentry(ep2, &head->chain) {
|
||||
struct sock *sk2 = ep2->base.sk;
|
||||
|
||||
if (!net_eq(sock_net(sk2), net) || sk2 == sk ||
|
||||
!uid_eq(sock_i_uid(sk2), sock_i_uid(sk)) ||
|
||||
@@ -789,7 +787,7 @@ static int __sctp_hash_endpoint(struct sctp_endpoint *ep)
|
||||
}
|
||||
|
||||
write_lock(&head->lock);
|
||||
hlist_add_head(&epb->node, &head->chain);
|
||||
hlist_add_head(&ep->node, &head->chain);
|
||||
write_unlock(&head->lock);
|
||||
return 0;
|
||||
}
|
||||
@@ -811,19 +809,16 @@ static void __sctp_unhash_endpoint(struct sctp_endpoint *ep)
|
||||
{
|
||||
struct sock *sk = ep->base.sk;
|
||||
struct sctp_hashbucket *head;
|
||||
struct sctp_ep_common *epb;
|
||||
|
||||
epb = &ep->base;
|
||||
ep->hashent = sctp_ep_hashfn(sock_net(sk), ep->base.bind_addr.port);
|
||||
|
||||
epb->hashent = sctp_ep_hashfn(sock_net(sk), epb->bind_addr.port);
|
||||
|
||||
head = &sctp_ep_hashtable[epb->hashent];
|
||||
head = &sctp_ep_hashtable[ep->hashent];
|
||||
|
||||
if (rcu_access_pointer(sk->sk_reuseport_cb))
|
||||
reuseport_detach_sock(sk);
|
||||
|
||||
write_lock(&head->lock);
|
||||
hlist_del_init(&epb->node);
|
||||
hlist_del_init(&ep->node);
|
||||
write_unlock(&head->lock);
|
||||
}
|
||||
|
||||
@@ -856,7 +851,6 @@ static struct sctp_endpoint *__sctp_rcv_lookup_endpoint(
|
||||
const union sctp_addr *paddr)
|
||||
{
|
||||
struct sctp_hashbucket *head;
|
||||
struct sctp_ep_common *epb;
|
||||
struct sctp_endpoint *ep;
|
||||
struct sock *sk;
|
||||
__be16 lport;
|
||||
@@ -866,8 +860,7 @@ static struct sctp_endpoint *__sctp_rcv_lookup_endpoint(
|
||||
hash = sctp_ep_hashfn(net, ntohs(lport));
|
||||
head = &sctp_ep_hashtable[hash];
|
||||
read_lock(&head->lock);
|
||||
sctp_for_each_hentry(epb, &head->chain) {
|
||||
ep = sctp_ep(epb);
|
||||
sctp_for_each_hentry(ep, &head->chain) {
|
||||
if (sctp_endpoint_is_match(ep, net, laddr))
|
||||
goto hit;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user