* [PATCH] expectation use a slab instead of kmalloc
@ 2004-05-31 13:56 Pablo Neira
2004-06-01 23:05 ` Patrick McHardy
0 siblings, 1 reply; 4+ messages in thread
From: Pablo Neira @ 2004-05-31 13:56 UTC (permalink / raw)
To: Netfilter Development Mailinglist, Patrick McHardy
[-- Attachment #1: Type: text/plain, Size: 622 bytes --]
Hi,
Attached a patch to use a slab for expectations, I think that this could
increase a bit the performance in a system which has lots of expectations.
I also moved the increment of an expectation refcount to
ip_conntrack_expect_alloc because we could use ip_conntrack_expect_put
to release an expectation which we just allocated in a helper (well, in
current helpers I didn't find any case but there are weird protocols
outthere so I think that it's not a bad idea).
Patrick, if you consider that it's ok, would you be willing to add this
to pom-ng? If I'm missing something, please let me know.
regards,
Pablo
[-- Attachment #2: slab-expectation.patch --]
[-- Type: text/x-patch, Size: 3611 bytes --]
diff -u -r1.1.1.1 ip_conntrack_core.c
--- a/net/ipv4/netfilter/ip_conntrack_core.c 11 May 2004 13:07:08 -0000 1.1.1.1
+++ b/net/ipv4/netfilter/ip_conntrack_core.c 30 May 2004 13:08:00 -0000
@@ -67,6 +67,7 @@
static atomic_t ip_conntrack_count = ATOMIC_INIT(0);
struct list_head *ip_conntrack_hash;
static kmem_cache_t *ip_conntrack_cachep;
+static kmem_cache_t *ip_conntrack_expect_cachep;
struct ip_conntrack ip_conntrack_untracked;
extern struct ip_conntrack_protocol ip_conntrack_generic_protocol;
@@ -176,7 +177,7 @@
IP_NF_ASSERT(atomic_read(&exp->use));
IP_NF_ASSERT(!timer_pending(&exp->timeout));
- kfree(exp);
+ kmem_cache_free(ip_conntrack_expect_cachep, exp);
}
@@ -335,7 +336,7 @@
list_del(&ct->master->expected_list);
master = ct->master->expectant;
}
- kfree(ct->master);
+ kmem_cache_free(ip_conntrack_expect_cachep, ct->master);
}
WRITE_UNLOCK(&ip_conntrack_lock);
@@ -923,16 +924,17 @@
ip_conntrack_expect_alloc()
{
struct ip_conntrack_expect *new;
-
- new = (struct ip_conntrack_expect *)
- kmalloc(sizeof(struct ip_conntrack_expect), GFP_ATOMIC);
+
+ new = kmem_cache_alloc(ip_conntrack_expect_cachep, GFP_ATOMIC);
if (!new) {
DEBUGP("expect_related: OOM allocating expect\n");
return NULL;
}
+ DEBUGP("new expectation %p allocated\n", new);
/* tuple_cmp compares whole union, we have to initialized cleanly */
memset(new, 0, sizeof(struct ip_conntrack_expect));
+ atomic_set(&new->use, 1);
return new;
}
@@ -944,7 +946,6 @@
DEBUGP("new expectation %p of conntrack %p\n", new, related_to);
new->expectant = related_to;
new->sibling = NULL;
- atomic_set(&new->use, 1);
/* add to expected list for this connection */
list_add(&new->expected_list, &related_to->sibling_list);
@@ -998,7 +999,8 @@
}
WRITE_UNLOCK(&ip_conntrack_lock);
- kfree(expect);
+ /* This expectation is not inserted so no need to lock */
+ kmem_cache_free(ip_conntrack_expect_cachep, expect);
return -EEXIST;
} else if (related_to->helper->max_expected &&
@@ -1017,7 +1019,7 @@
related_to->helper->name,
NIPQUAD(related_to->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip),
NIPQUAD(related_to->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip));
- kfree(expect);
+ kmem_cache_free(ip_conntrack_expect_cachep, expect);
return -EPERM;
}
DEBUGP("ip_conntrack: max number of expected "
@@ -1058,7 +1060,7 @@
WRITE_UNLOCK(&ip_conntrack_lock);
DEBUGP("expect_related: busy!\n");
- kfree(expect);
+ kmem_cache_free(ip_conntrack_expect_cachep, expect);
return -EBUSY;
}
@@ -1379,6 +1381,7 @@
}
kmem_cache_destroy(ip_conntrack_cachep);
+ kmem_cache_destroy(ip_conntrack_expect_cachep);
vfree(ip_conntrack_hash);
nf_unregister_sockopt(&so_getorigdst);
}
@@ -1431,6 +1434,15 @@
printk(KERN_ERR "Unable to create ip_conntrack slab cache\n");
goto err_free_hash;
}
+
+ ip_conntrack_expect_cachep = kmem_cache_create("ip_conntrack_expect",
+ sizeof(struct ip_conntrack_expect),
+ 0, SLAB_HWCACHE_ALIGN, NULL, NULL);
+ if (!ip_conntrack_expect_cachep) {
+ printk(KERN_ERR "Unable to create ip_expect slab cache\n");
+ goto err_free_conntrack_slab;
+ }
+
/* Don't NEED lock here, but good form anyway. */
WRITE_LOCK(&ip_conntrack_lock);
/* Sew in builtin protocols. */
@@ -1458,6 +1470,8 @@
return ret;
+err_free_conntrack_slab:
+ kmem_cache_destroy(ip_conntrack_cachep);
err_free_hash:
vfree(ip_conntrack_hash);
err_unreg_sockopt:
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] expectation use a slab instead of kmalloc
2004-05-31 13:56 [PATCH] expectation use a slab instead of kmalloc Pablo Neira
@ 2004-06-01 23:05 ` Patrick McHardy
2004-06-02 11:10 ` Pablo Neira
0 siblings, 1 reply; 4+ messages in thread
From: Patrick McHardy @ 2004-06-01 23:05 UTC (permalink / raw)
To: Pablo Neira; +Cc: Netfilter Development Mailinglist
Hi Pablo,
Pablo Neira wrote:
> Hi,
>
> Attached a patch to use a slab for expectations, I think that this could
> increase a bit the performance in a system which has lots of expectations.
I like it, mainly because it gives usage statistics and leak-checks for
free.
>
> I also moved the increment of an expectation refcount to
> ip_conntrack_expect_alloc because we could use ip_conntrack_expect_put
> to release an expectation which we just allocated in a helper (well, in
> current helpers I didn't find any case but there are weird protocols
> outthere so I think that it's not a bad idea).
I also like this better.
>
> Patrick, if you consider that it's ok, would you be willing to add this
> to pom-ng? If I'm missing something, please let me know.
I'm going to add it, but please fix the two minor issues noted below
first.
>
> regards,
> Pablo
>
>
> ------------------------------------------------------------------------
>
> diff -u -r1.1.1.1 ip_conntrack_core.c
> --- a/net/ipv4/netfilter/ip_conntrack_core.c 11 May 2004 13:07:08 -0000 1.1.1.1
> +++ b/net/ipv4/netfilter/ip_conntrack_core.c 30 May 2004 13:08:00 -0000
> @@ -67,6 +67,7 @@
> static atomic_t ip_conntrack_count = ATOMIC_INIT(0);
> struct list_head *ip_conntrack_hash;
> static kmem_cache_t *ip_conntrack_cachep;
> +static kmem_cache_t *ip_conntrack_expect_cachep;
> struct ip_conntrack ip_conntrack_untracked;
>
> extern struct ip_conntrack_protocol ip_conntrack_generic_protocol;
> @@ -176,7 +177,7 @@
> IP_NF_ASSERT(atomic_read(&exp->use));
> IP_NF_ASSERT(!timer_pending(&exp->timeout));
>
> - kfree(exp);
> + kmem_cache_free(ip_conntrack_expect_cachep, exp);
> }
>
>
> @@ -335,7 +336,7 @@
> list_del(&ct->master->expected_list);
> master = ct->master->expectant;
> }
> - kfree(ct->master);
> + kmem_cache_free(ip_conntrack_expect_cachep, ct->master);
> }
> WRITE_UNLOCK(&ip_conntrack_lock);
>
> @@ -923,16 +924,17 @@
> ip_conntrack_expect_alloc()
> {
> struct ip_conntrack_expect *new;
> -
> - new = (struct ip_conntrack_expect *)
> - kmalloc(sizeof(struct ip_conntrack_expect), GFP_ATOMIC);
> +
> + new = kmem_cache_alloc(ip_conntrack_expect_cachep, GFP_ATOMIC);
> if (!new) {
> DEBUGP("expect_related: OOM allocating expect\n");
> return NULL;
> }
>
> + DEBUGP("new expectation %p allocated\n", new);
^^^ I don't think we need that
> /* tuple_cmp compares whole union, we have to initialized cleanly */
> memset(new, 0, sizeof(struct ip_conntrack_expect));
> + atomic_set(&new->use, 1);
>
> return new;
> }
> @@ -944,7 +946,6 @@
> DEBUGP("new expectation %p of conntrack %p\n", new, related_to);
> new->expectant = related_to;
> new->sibling = NULL;
> - atomic_set(&new->use, 1);
>
> /* add to expected list for this connection */
> list_add(&new->expected_list, &related_to->sibling_list);
> @@ -998,7 +999,8 @@
> }
>
> WRITE_UNLOCK(&ip_conntrack_lock);
> - kfree(expect);
> + /* This expectation is not inserted so no need to lock */
> + kmem_cache_free(ip_conntrack_expect_cachep, expect);
> return -EEXIST;
>
> } else if (related_to->helper->max_expected &&
> @@ -1017,7 +1019,7 @@
> related_to->helper->name,
> NIPQUAD(related_to->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip),
> NIPQUAD(related_to->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip));
> - kfree(expect);
> + kmem_cache_free(ip_conntrack_expect_cachep, expect);
> return -EPERM;
> }
> DEBUGP("ip_conntrack: max number of expected "
> @@ -1058,7 +1060,7 @@
> WRITE_UNLOCK(&ip_conntrack_lock);
> DEBUGP("expect_related: busy!\n");
>
> - kfree(expect);
> + kmem_cache_free(ip_conntrack_expect_cachep, expect);
> return -EBUSY;
> }
>
> @@ -1379,6 +1381,7 @@
> }
>
> kmem_cache_destroy(ip_conntrack_cachep);
> + kmem_cache_destroy(ip_conntrack_expect_cachep);
> vfree(ip_conntrack_hash);
> nf_unregister_sockopt(&so_getorigdst);
> }
> @@ -1431,6 +1434,15 @@
> printk(KERN_ERR "Unable to create ip_conntrack slab cache\n");
> goto err_free_hash;
> }
> +
> + ip_conntrack_expect_cachep = kmem_cache_create("ip_conntrack_expect",
> + sizeof(struct ip_conntrack_expect),
> + 0, SLAB_HWCACHE_ALIGN, NULL, NULL);
> + if (!ip_conntrack_expect_cachep) {
> + printk(KERN_ERR "Unable to create ip_expect slab cache\n");
> + goto err_free_conntrack_slab;
> + }
^^^ Indentation is broken (spaces instead of tabs)
> +
> /* Don't NEED lock here, but good form anyway. */
> WRITE_LOCK(&ip_conntrack_lock);
> /* Sew in builtin protocols. */
> @@ -1458,6 +1470,8 @@
>
> return ret;
>
> +err_free_conntrack_slab:
> + kmem_cache_destroy(ip_conntrack_cachep);
> err_free_hash:
> vfree(ip_conntrack_hash);
> err_unreg_sockopt:
Regards
Patrick
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] expectation use a slab instead of kmalloc
2004-06-01 23:05 ` Patrick McHardy
@ 2004-06-02 11:10 ` Pablo Neira
2004-06-02 16:12 ` Patrick McHardy
0 siblings, 1 reply; 4+ messages in thread
From: Pablo Neira @ 2004-06-02 11:10 UTC (permalink / raw)
To: Patrick McHardy, Netfilter Development Mailinglist
[-- Attachment #1: Type: text/plain, Size: 141 bytes --]
Hi Patrick,
Patrick McHardy wrote:
> please fix the two minor issues noted below first.
I fixed them, attached the patch.
thanks!
Pablo
[-- Attachment #2: slab-expectation2.patch --]
[-- Type: text/x-patch, Size: 3486 bytes --]
diff -u -r1.1.1.1 ip_conntrack_core.c
--- a/net/ipv4/netfilter/ip_conntrack_core.c 11 May 2004 13:07:08 -0000 1.1.1.1
+++ b/net/ipv4/netfilter/ip_conntrack_core.c 2 Jun 2004 11:06:44 -0000
@@ -67,6 +67,7 @@
static atomic_t ip_conntrack_count = ATOMIC_INIT(0);
struct list_head *ip_conntrack_hash;
static kmem_cache_t *ip_conntrack_cachep;
+static kmem_cache_t *ip_conntrack_expect_cachep;
struct ip_conntrack ip_conntrack_untracked;
extern struct ip_conntrack_protocol ip_conntrack_generic_protocol;
@@ -176,7 +177,7 @@
IP_NF_ASSERT(atomic_read(&exp->use));
IP_NF_ASSERT(!timer_pending(&exp->timeout));
- kfree(exp);
+ kmem_cache_free(ip_conntrack_expect_cachep, exp);
}
@@ -335,7 +336,7 @@
list_del(&ct->master->expected_list);
master = ct->master->expectant;
}
- kfree(ct->master);
+ kmem_cache_free(ip_conntrack_expect_cachep, ct->master);
}
WRITE_UNLOCK(&ip_conntrack_lock);
@@ -923,9 +924,8 @@
ip_conntrack_expect_alloc()
{
struct ip_conntrack_expect *new;
-
- new = (struct ip_conntrack_expect *)
- kmalloc(sizeof(struct ip_conntrack_expect), GFP_ATOMIC);
+
+ new = kmem_cache_alloc(ip_conntrack_expect_cachep, GFP_ATOMIC);
if (!new) {
DEBUGP("expect_related: OOM allocating expect\n");
return NULL;
@@ -933,6 +933,7 @@
/* tuple_cmp compares whole union, we have to initialized cleanly */
memset(new, 0, sizeof(struct ip_conntrack_expect));
+ atomic_set(&new->use, 1);
return new;
}
@@ -944,7 +945,6 @@
DEBUGP("new expectation %p of conntrack %p\n", new, related_to);
new->expectant = related_to;
new->sibling = NULL;
- atomic_set(&new->use, 1);
/* add to expected list for this connection */
list_add(&new->expected_list, &related_to->sibling_list);
@@ -998,7 +998,8 @@
}
WRITE_UNLOCK(&ip_conntrack_lock);
- kfree(expect);
+ /* This expectation is not inserted so no need to lock */
+ kmem_cache_free(ip_conntrack_expect_cachep, expect);
return -EEXIST;
} else if (related_to->helper->max_expected &&
@@ -1017,7 +1018,7 @@
related_to->helper->name,
NIPQUAD(related_to->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip),
NIPQUAD(related_to->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip));
- kfree(expect);
+ kmem_cache_free(ip_conntrack_expect_cachep, expect);
return -EPERM;
}
DEBUGP("ip_conntrack: max number of expected "
@@ -1058,7 +1059,7 @@
WRITE_UNLOCK(&ip_conntrack_lock);
DEBUGP("expect_related: busy!\n");
- kfree(expect);
+ kmem_cache_free(ip_conntrack_expect_cachep, expect);
return -EBUSY;
}
@@ -1379,6 +1380,7 @@
}
kmem_cache_destroy(ip_conntrack_cachep);
+ kmem_cache_destroy(ip_conntrack_expect_cachep);
vfree(ip_conntrack_hash);
nf_unregister_sockopt(&so_getorigdst);
}
@@ -1431,6 +1433,15 @@
printk(KERN_ERR "Unable to create ip_conntrack slab cache\n");
goto err_free_hash;
}
+
+ ip_conntrack_expect_cachep = kmem_cache_create("ip_conntrack_expect",
+ sizeof(struct ip_conntrack_expect),
+ 0, SLAB_HWCACHE_ALIGN, NULL, NULL);
+ if (!ip_conntrack_expect_cachep) {
+ printk(KERN_ERR "Unable to create ip_expect slab cache\n");
+ goto err_free_conntrack_slab;
+ }
+
/* Don't NEED lock here, but good form anyway. */
WRITE_LOCK(&ip_conntrack_lock);
/* Sew in builtin protocols. */
@@ -1458,6 +1469,8 @@
return ret;
+err_free_conntrack_slab:
+ kmem_cache_destroy(ip_conntrack_cachep);
err_free_hash:
vfree(ip_conntrack_hash);
err_unreg_sockopt:
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] expectation use a slab instead of kmalloc
2004-06-02 11:10 ` Pablo Neira
@ 2004-06-02 16:12 ` Patrick McHardy
0 siblings, 0 replies; 4+ messages in thread
From: Patrick McHardy @ 2004-06-02 16:12 UTC (permalink / raw)
To: Pablo Neira; +Cc: Netfilter Development Mailinglist
Pablo Neira wrote:
>
> I fixed them, attached the patch.
Thanks, applied.
Regards
Patrick
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2004-06-02 16:12 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-05-31 13:56 [PATCH] expectation use a slab instead of kmalloc Pablo Neira
2004-06-01 23:05 ` Patrick McHardy
2004-06-02 11:10 ` Pablo Neira
2004-06-02 16:12 ` Patrick McHardy
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.