sctp: drop the old assoc hashtable of sctp
authorXin Long <lucien.xin@gmail.com>
Wed, 30 Dec 2015 15:50:49 +0000 (23:50 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 5 Jan 2016 17:24:01 +0000 (12:24 -0500)
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>
include/net/sctp/sctp.h
include/net/sctp/structs.h
net/sctp/input.c
net/sctp/protocol.c
net/sctp/sm_sideeffect.c
net/sctp/socket.c

index 7bbdfbab2efa0ebb536acbfdf2692f2da8673b68..835aa2ed987092634a4242314e9eabb51d1e4e35 100644 (file)
@@ -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)
 
index 4ab87d08e766dfeac8272087e0b4ab38070d5513..20e72129be1ce0063eeafcbaadcee1f37e0c614c 100644 (file)
@@ -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)
index 6f075d83576416529da5d7788e55f457be11533e..d9a6e66c5c8a5fce0eef3295ad85c24e4cb7a34a 100644 (file)
@@ -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,
index 631cfb380535f398ba88cbe1b08cc53bfdd21cd6..ab0d538a74ed593571cfaef02cd1bb7ce872abe6 100644 (file)
@@ -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 @@ err_bhash_alloc:
 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);
index 05cd16400e0b8b2d474ed6af310053e297e474a8..4f170ad38ff4f7d345d8e3a3fee7d691df64d9cb 100644 (file)
@@ -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:
index b5f4811cea82fa8dc751cafede6e96da18df9a3c..9bb80ec4c08ff06f6e629078c5a926c3def3ce23 100644 (file)
@@ -1228,7 +1228,6 @@ out_free:
                 * 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);