forked from luck/tmp_suning_uos_patched
sctp: drop the old assoc hashtable of sctp
transport hashtable will replace the association hashtable, so association hashtable is not used in sctp any more, so drop the codes about that. Signed-off-by: Xin Long <lucien.xin@gmail.com> Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
39f66a7dce
commit
b5eff71283
|
@ -126,8 +126,6 @@ int sctp_primitive_ASCONF(struct net *, struct sctp_association *, void *arg);
|
|||
*/
|
||||
int sctp_rcv(struct sk_buff *skb);
|
||||
void sctp_v4_err(struct sk_buff *skb, u32 info);
|
||||
void sctp_hash_established(struct sctp_association *);
|
||||
void sctp_unhash_established(struct sctp_association *);
|
||||
void sctp_hash_endpoint(struct sctp_endpoint *);
|
||||
void sctp_unhash_endpoint(struct sctp_endpoint *);
|
||||
struct sock *sctp_err_lookup(struct net *net, int family, struct sk_buff *,
|
||||
|
@ -530,25 +528,6 @@ static inline int sctp_ep_hashfn(struct net *net, __u16 lport)
|
|||
return (net_hash_mix(net) + lport) & (sctp_ep_hashsize - 1);
|
||||
}
|
||||
|
||||
/* This is the hash function for the association hash table. */
|
||||
static inline int sctp_assoc_hashfn(struct net *net, __u16 lport, __u16 rport)
|
||||
{
|
||||
int h = (lport << 16) + rport + net_hash_mix(net);
|
||||
h ^= h>>8;
|
||||
return h & (sctp_assoc_hashsize - 1);
|
||||
}
|
||||
|
||||
/* This is the hash function for the association hash table. This is
|
||||
* not used yet, but could be used as a better hash function when
|
||||
* we have a vtag.
|
||||
*/
|
||||
static inline int sctp_vtag_hashfn(__u16 lport, __u16 rport, __u32 vtag)
|
||||
{
|
||||
int h = (lport << 16) + rport;
|
||||
h ^= vtag;
|
||||
return h & (sctp_assoc_hashsize - 1);
|
||||
}
|
||||
|
||||
#define sctp_for_each_hentry(epb, head) \
|
||||
hlist_for_each_entry(epb, head, node)
|
||||
|
||||
|
|
|
@ -120,8 +120,6 @@ extern struct sctp_globals {
|
|||
|
||||
/* This is the hash of all endpoints. */
|
||||
struct sctp_hashbucket *ep_hashtable;
|
||||
/* This is the hash of all associations. */
|
||||
struct sctp_hashbucket *assoc_hashtable;
|
||||
/* This is the sctp port control hash. */
|
||||
struct sctp_bind_hashbucket *port_hashtable;
|
||||
/* This is the hash of all transports. */
|
||||
|
@ -129,7 +127,6 @@ extern struct sctp_globals {
|
|||
|
||||
/* Sizes of above hashtables. */
|
||||
int ep_hashsize;
|
||||
int assoc_hashsize;
|
||||
int port_hashsize;
|
||||
|
||||
/* Default initialization values to be applied to new associations. */
|
||||
|
@ -146,8 +143,6 @@ extern struct sctp_globals {
|
|||
#define sctp_address_families (sctp_globals.address_families)
|
||||
#define sctp_ep_hashsize (sctp_globals.ep_hashsize)
|
||||
#define sctp_ep_hashtable (sctp_globals.ep_hashtable)
|
||||
#define sctp_assoc_hashsize (sctp_globals.assoc_hashsize)
|
||||
#define sctp_assoc_hashtable (sctp_globals.assoc_hashtable)
|
||||
#define sctp_port_hashsize (sctp_globals.port_hashsize)
|
||||
#define sctp_port_hashtable (sctp_globals.port_hashtable)
|
||||
#define sctp_transport_hashtable (sctp_globals.transport_hashtable)
|
||||
|
|
|
@ -913,67 +913,6 @@ struct sctp_transport *sctp_epaddr_lookup_transport(
|
|||
return sctp_addrs_lookup_transport(net, &addr->a, paddr);
|
||||
}
|
||||
|
||||
/* Insert association into the hash table. */
|
||||
static void __sctp_hash_established(struct sctp_association *asoc)
|
||||
{
|
||||
struct net *net = sock_net(asoc->base.sk);
|
||||
struct sctp_ep_common *epb;
|
||||
struct sctp_hashbucket *head;
|
||||
|
||||
epb = &asoc->base;
|
||||
|
||||
/* Calculate which chain this entry will belong to. */
|
||||
epb->hashent = sctp_assoc_hashfn(net, epb->bind_addr.port,
|
||||
asoc->peer.port);
|
||||
|
||||
head = &sctp_assoc_hashtable[epb->hashent];
|
||||
|
||||
write_lock(&head->lock);
|
||||
hlist_add_head(&epb->node, &head->chain);
|
||||
write_unlock(&head->lock);
|
||||
}
|
||||
|
||||
/* Add an association to the hash. Local BH-safe. */
|
||||
void sctp_hash_established(struct sctp_association *asoc)
|
||||
{
|
||||
if (asoc->temp)
|
||||
return;
|
||||
|
||||
local_bh_disable();
|
||||
__sctp_hash_established(asoc);
|
||||
local_bh_enable();
|
||||
}
|
||||
|
||||
/* Remove association from the hash table. */
|
||||
static void __sctp_unhash_established(struct sctp_association *asoc)
|
||||
{
|
||||
struct net *net = sock_net(asoc->base.sk);
|
||||
struct sctp_hashbucket *head;
|
||||
struct sctp_ep_common *epb;
|
||||
|
||||
epb = &asoc->base;
|
||||
|
||||
epb->hashent = sctp_assoc_hashfn(net, epb->bind_addr.port,
|
||||
asoc->peer.port);
|
||||
|
||||
head = &sctp_assoc_hashtable[epb->hashent];
|
||||
|
||||
write_lock(&head->lock);
|
||||
hlist_del_init(&epb->node);
|
||||
write_unlock(&head->lock);
|
||||
}
|
||||
|
||||
/* Remove association from the hash table. Local BH-safe. */
|
||||
void sctp_unhash_established(struct sctp_association *asoc)
|
||||
{
|
||||
if (asoc->temp)
|
||||
return;
|
||||
|
||||
local_bh_disable();
|
||||
__sctp_unhash_established(asoc);
|
||||
local_bh_enable();
|
||||
}
|
||||
|
||||
/* Look up an association. */
|
||||
static struct sctp_association *__sctp_lookup_association(
|
||||
struct net *net,
|
||||
|
|
|
@ -1416,24 +1416,6 @@ static __init int sctp_init(void)
|
|||
for (order = 0; (1UL << order) < goal; order++)
|
||||
;
|
||||
|
||||
do {
|
||||
sctp_assoc_hashsize = (1UL << order) * PAGE_SIZE /
|
||||
sizeof(struct sctp_hashbucket);
|
||||
if ((sctp_assoc_hashsize > (64 * 1024)) && order > 0)
|
||||
continue;
|
||||
sctp_assoc_hashtable = (struct sctp_hashbucket *)
|
||||
__get_free_pages(GFP_KERNEL | __GFP_NOWARN, order);
|
||||
} while (!sctp_assoc_hashtable && --order > 0);
|
||||
if (!sctp_assoc_hashtable) {
|
||||
pr_err("Failed association hash alloc\n");
|
||||
status = -ENOMEM;
|
||||
goto err_ahash_alloc;
|
||||
}
|
||||
for (i = 0; i < sctp_assoc_hashsize; i++) {
|
||||
rwlock_init(&sctp_assoc_hashtable[i].lock);
|
||||
INIT_HLIST_HEAD(&sctp_assoc_hashtable[i].chain);
|
||||
}
|
||||
|
||||
/* Allocate and initialize the endpoint hash table. */
|
||||
sctp_ep_hashsize = 64;
|
||||
sctp_ep_hashtable =
|
||||
|
@ -1470,8 +1452,7 @@ static __init int sctp_init(void)
|
|||
if (sctp_transport_hashtable_init())
|
||||
goto err_thash_alloc;
|
||||
|
||||
pr_info("Hash tables configured (established %d bind %d)\n",
|
||||
sctp_assoc_hashsize, sctp_port_hashsize);
|
||||
pr_info("Hash tables configured (bind %d)\n", sctp_port_hashsize);
|
||||
|
||||
sctp_sysctl_register();
|
||||
|
||||
|
@ -1528,10 +1509,6 @@ static __init int sctp_init(void)
|
|||
err_thash_alloc:
|
||||
kfree(sctp_ep_hashtable);
|
||||
err_ehash_alloc:
|
||||
free_pages((unsigned long)sctp_assoc_hashtable,
|
||||
get_order(sctp_assoc_hashsize *
|
||||
sizeof(struct sctp_hashbucket)));
|
||||
err_ahash_alloc:
|
||||
percpu_counter_destroy(&sctp_sockets_allocated);
|
||||
err_percpu_counter_init:
|
||||
kmem_cache_destroy(sctp_chunk_cachep);
|
||||
|
@ -1565,13 +1542,10 @@ static __exit void sctp_exit(void)
|
|||
|
||||
sctp_sysctl_unregister();
|
||||
|
||||
free_pages((unsigned long)sctp_assoc_hashtable,
|
||||
get_order(sctp_assoc_hashsize *
|
||||
sizeof(struct sctp_hashbucket)));
|
||||
kfree(sctp_ep_hashtable);
|
||||
free_pages((unsigned long)sctp_port_hashtable,
|
||||
get_order(sctp_port_hashsize *
|
||||
sizeof(struct sctp_bind_hashbucket)));
|
||||
kfree(sctp_ep_hashtable);
|
||||
sctp_transport_hashtable_destroy();
|
||||
|
||||
percpu_counter_destroy(&sctp_sockets_allocated);
|
||||
|
|
|
@ -866,7 +866,6 @@ static void sctp_cmd_delete_tcb(sctp_cmd_seq_t *cmds,
|
|||
(!asoc->temp) && (sk->sk_shutdown != SHUTDOWN_MASK))
|
||||
return;
|
||||
|
||||
sctp_unhash_established(asoc);
|
||||
sctp_association_free(asoc);
|
||||
}
|
||||
|
||||
|
@ -1269,7 +1268,6 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
|
|||
asoc = cmd->obj.asoc;
|
||||
BUG_ON(asoc->peer.primary_path == NULL);
|
||||
sctp_endpoint_add_asoc(ep, asoc);
|
||||
sctp_hash_established(asoc);
|
||||
break;
|
||||
|
||||
case SCTP_CMD_UPDATE_ASSOC:
|
||||
|
|
|
@ -1228,7 +1228,6 @@ static int __sctp_connect(struct sock *sk,
|
|||
* To the hash table, try to unhash it, just in case, its a noop
|
||||
* if it wasn't hashed so we're safe
|
||||
*/
|
||||
sctp_unhash_established(asoc);
|
||||
sctp_association_free(asoc);
|
||||
}
|
||||
return err;
|
||||
|
@ -1504,7 +1503,6 @@ static void sctp_close(struct sock *sk, long timeout)
|
|||
* ABORT or SHUTDOWN based on the linger options.
|
||||
*/
|
||||
if (sctp_state(asoc, CLOSED)) {
|
||||
sctp_unhash_established(asoc);
|
||||
sctp_association_free(asoc);
|
||||
continue;
|
||||
}
|
||||
|
@ -1986,10 +1984,8 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len)
|
|||
goto out_unlock;
|
||||
|
||||
out_free:
|
||||
if (new_asoc) {
|
||||
sctp_unhash_established(asoc);
|
||||
if (new_asoc)
|
||||
sctp_association_free(asoc);
|
||||
}
|
||||
out_unlock:
|
||||
release_sock(sk);
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user