netdev
[Top] [All Lists]

[PATCH 6/9] irda: use sock slab cache

To: "David S. Miller" <davem@xxxxxxxxxxxxx>, Jean Tourrilhes <jt@xxxxxxxxxx>
Subject: [PATCH 6/9] irda: use sock slab cache
From: Arnaldo Carvalho de Melo <acme@xxxxxxxxxxxxxxxx>
Date: Thu, 20 Jan 2005 00:04:31 -0200
Cc: irda-users@xxxxxxxxxxxxxxxxxxxxx, Networking Team <netdev@xxxxxxxxxxx>
Organization: Conectiva S.A.
Sender: netdev-bounce@xxxxxxxxxxx
User-agent: Mozilla Thunderbird 1.0 (X11/20041220)
Hi David, Jean,

        Please read the log in the patch.

Regards,

- Arnaldo

===================================================================


ChangeSet@xxxxxx, 2005-01-19 23:04:52-02:00, acme@xxxxxxxxxxxxxxxxxxxxxx
  [IRDA] use a private slab cache for socks
  
  Required to get rid of sk_protinfo and to introduce struct connection_sock,
  also for consistency with other protocol families implementations.
  
  Signed-off-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxxxxxxxx>
  Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>


 include/net/irda/af_irda.h |    9 ++++++-
 net/irda/af_irda.c         |   52 +++++++++++++++++++++++----------------------
 2 files changed, 34 insertions(+), 27 deletions(-)


diff -Nru a/include/net/irda/af_irda.h b/include/net/irda/af_irda.h
--- a/include/net/irda/af_irda.h        2005-01-19 23:43:00 -02:00
+++ b/include/net/irda/af_irda.h        2005-01-19 23:43:00 -02:00
@@ -33,9 +33,12 @@
 #include <net/irda/irlmp.h>            /* struct lsap_cb */
 #include <net/irda/irttp.h>            /* struct tsap_cb */
 #include <net/irda/discovery.h>                /* struct discovery_t */
+#include <net/sock.h>
 
 /* IrDA Socket */
 struct irda_sock {
+       /* struct sock has to be the first member of irda_sock */
+       struct sock sk;
        __u32 saddr;          /* my local address */
        __u32 daddr;          /* peer address */
 
@@ -69,7 +72,6 @@
 
        int errno;            /* status of the IAS query */
 
-       struct sock *sk;
        wait_queue_head_t query_wait;   /* Wait for the answer to a query */
        struct timer_list watchdog;     /* Timeout for discovery */
 
@@ -77,6 +79,9 @@
        LOCAL_FLOW rx_flow;
 };
 
-#define irda_sk(__sk) ((struct irda_sock *)(__sk)->sk_protinfo)
+static inline struct irda_sock *irda_sk(struct sock *sk)
+{
+       return (struct irda_sock *)sk;
+}
 
 #endif /* AF_IRDA_H */
diff -Nru a/net/irda/af_irda.c b/net/irda/af_irda.c
--- a/net/irda/af_irda.c        2005-01-19 23:43:00 -02:00
+++ b/net/irda/af_irda.c        2005-01-19 23:43:00 -02:00
@@ -60,6 +60,8 @@
 
 #include <net/irda/af_irda.h>
 
+static kmem_cache_t *irda_sk_slab;
+
 static int irda_create(struct socket *sock, int protocol);
 
 static struct proto_ops irda_stream_ops;
@@ -87,10 +89,10 @@
 
        IRDA_DEBUG(3, "%s()\n", __FUNCTION__);
 
-       self = (struct irda_sock *) instance;
+       self = instance;
        ASSERT(self != NULL, return -1;);
 
-       sk = self->sk;
+       sk = instance;
        ASSERT(sk != NULL, return -1;);
 
        err = sock_queue_rcv_skb(sk, skb);
@@ -117,7 +119,7 @@
        struct irda_sock *self;
        struct sock *sk;
 
-       self = (struct irda_sock *) instance;
+       self = instance;
 
        IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self);
 
@@ -125,7 +127,7 @@
        if(skb)
                dev_kfree_skb(skb);
 
-       sk = self->sk;
+       sk = instance;
        if (sk == NULL) {
                IRDA_DEBUG(0, "%s(%p) : BUG : sk is NULL\n",
                           __FUNCTION__, self);
@@ -183,11 +185,11 @@
        struct irda_sock *self;
        struct sock *sk;
 
-       self = (struct irda_sock *) instance;
+       self = instance;
 
        IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self);
 
-       sk = self->sk;
+       sk = instance;
        if (sk == NULL) {
                dev_kfree_skb(skb);
                return;
@@ -245,11 +247,11 @@
        struct irda_sock *self;
        struct sock *sk;
 
-       self = (struct irda_sock *) instance;
+       self = instance;
 
        IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self);
 
-       sk = self->sk;
+       sk = instance;
        if (sk == NULL) {
                dev_kfree_skb(skb);
                return;
@@ -332,10 +334,10 @@
 
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__);
 
-       self = (struct irda_sock *) instance;
+       self = instance;
        ASSERT(self != NULL, return;);
 
-       sk = self->sk;
+       sk = instance;
        ASSERT(sk != NULL, return;);
 
        switch (flow) {
@@ -1082,17 +1084,12 @@
        }
 
        /* Allocate networking socket */
-       if ((sk = sk_alloc(PF_IRDA, GFP_ATOMIC, 1, NULL)) == NULL)
+       sk = sk_alloc(PF_IRDA, GFP_ATOMIC,
+                     sizeof(struct irda_sock), irda_sk_slab);
+       if (sk == NULL)
                return -ENOMEM;
 
-       /* Allocate IrDA socket */
-       self = sk->sk_protinfo = kmalloc(sizeof(struct irda_sock), GFP_ATOMIC);
-       if (self == NULL) {
-               sk_free(sk);
-               return -ENOMEM;
-       }
-       memset(self, 0, sizeof(struct irda_sock));
-
+       self = irda_sk(sk);
        IRDA_DEBUG(2, "%s() : self is %p\n", __FUNCTION__, self);
 
        init_waitqueue_head(&self->query_wait);
@@ -1102,8 +1099,6 @@
        sk_set_owner(sk, THIS_MODULE);
        sk->sk_family = PF_IRDA;
        sk->sk_protocol = protocol;
-       /* Link networking socket and IrDA socket structs together */
-       self->sk = sk;
 
        switch (sock->type) {
        case SOCK_STREAM:
@@ -1187,7 +1182,6 @@
                self->lsap = NULL;
        }
 #endif /* CONFIG_IRDA_ULTRA */
-       kfree(self);
 }
 
 /*
@@ -1208,8 +1202,6 @@
 
        /* Destroy IrDA socket */
        irda_destroy_socket(irda_sk(sk));
-       /* Prevent sock_def_destruct() to create havoc */
-       sk->sk_protinfo = NULL;
 
        sock_orphan(sk);
        sock->sk   = NULL;
@@ -2557,6 +2549,13 @@
  */
 int __init irsock_init(void)
 {
+       irda_sk_slab = kmem_cache_create("irda_sock",
+                                        sizeof(struct irda_sock), 0,
+                                        SLAB_HWCACHE_ALIGN, NULL, NULL);
+
+       if (irda_sk_slab == NULL)
+               return -ENOMEM;
+
        sock_register(&irda_family_ops);
 
        return 0;
@@ -2572,5 +2571,8 @@
 {
        sock_unregister(PF_IRDA);
 
-        return;
+       if (irda_sk_slab != NULL) {
+               kmem_cache_destroy(irda_sk_slab);
+               irda_sk_slab = NULL;
+       }
 }


<Prev in Thread] Current Thread [Next in Thread>