Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d4ad4d22 authored by Nikolay Aleksandrov's avatar Nikolay Aleksandrov Committed by David S. Miller
Browse files

inet: frags: use kmem_cache for inet_frag_queue



Use kmem_cache to allocate/free inet_frag_queue objects since they're
all the same size per inet_frags user and are alloced/freed in high volumes
thus making it a perfect case for kmem_cache.

Signed-off-by: default avatarNikolay Aleksandrov <nikolay@redhat.com>
Acked-by: default avatarFlorian Westphal <fw@strlen.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2e404f63
Loading
Loading
Loading
Loading
+3 −1
Original line number Original line Diff line number Diff line
@@ -101,9 +101,11 @@ struct inet_frags {
	void			(*destructor)(struct inet_frag_queue *);
	void			(*destructor)(struct inet_frag_queue *);
	void			(*skb_free)(struct sk_buff *);
	void			(*skb_free)(struct sk_buff *);
	void			(*frag_expire)(unsigned long data);
	void			(*frag_expire)(unsigned long data);
	struct kmem_cache	*frags_cachep;
	const char		*frags_cache_name;
};
};


void inet_frags_init(struct inet_frags *);
int inet_frags_init(struct inet_frags *);
void inet_frags_fini(struct inet_frags *);
void inet_frags_fini(struct inet_frags *);


void inet_frags_init_net(struct netns_frags *nf);
void inet_frags_init_net(struct netns_frags *nf);
+6 −1
Original line number Original line Diff line number Diff line
@@ -30,6 +30,8 @@


#include "reassembly.h"
#include "reassembly.h"


static const char lowpan_frags_cache_name[] = "lowpan-frags";

struct lowpan_frag_info {
struct lowpan_frag_info {
	__be16 d_tag;
	__be16 d_tag;
	u16 d_size;
	u16 d_size;
@@ -571,7 +573,10 @@ int __init lowpan_net_frag_init(void)
	lowpan_frags.qsize = sizeof(struct frag_queue);
	lowpan_frags.qsize = sizeof(struct frag_queue);
	lowpan_frags.match = lowpan_frag_match;
	lowpan_frags.match = lowpan_frag_match;
	lowpan_frags.frag_expire = lowpan_frag_expire;
	lowpan_frags.frag_expire = lowpan_frag_expire;
	inet_frags_init(&lowpan_frags);
	lowpan_frags.frags_cache_name = lowpan_frags_cache_name;
	ret = inet_frags_init(&lowpan_frags);
	if (ret)
		goto err_pernet;


	return ret;
	return ret;
err_pernet:
err_pernet:
+10 −3
Original line number Original line Diff line number Diff line
@@ -198,7 +198,7 @@ static void inet_frag_schedule_worker(struct inet_frags *f)
		schedule_work(&f->frags_work);
		schedule_work(&f->frags_work);
}
}


void inet_frags_init(struct inet_frags *f)
int inet_frags_init(struct inet_frags *f)
{
{
	int i;
	int i;


@@ -213,6 +213,12 @@ void inet_frags_init(struct inet_frags *f)


	seqlock_init(&f->rnd_seqlock);
	seqlock_init(&f->rnd_seqlock);
	f->last_rebuild_jiffies = 0;
	f->last_rebuild_jiffies = 0;
	f->frags_cachep = kmem_cache_create(f->frags_cache_name, f->qsize, 0, 0,
					    NULL);
	if (!f->frags_cachep)
		return -ENOMEM;

	return 0;
}
}
EXPORT_SYMBOL(inet_frags_init);
EXPORT_SYMBOL(inet_frags_init);


@@ -225,6 +231,7 @@ EXPORT_SYMBOL(inet_frags_init_net);
void inet_frags_fini(struct inet_frags *f)
void inet_frags_fini(struct inet_frags *f)
{
{
	cancel_work_sync(&f->frags_work);
	cancel_work_sync(&f->frags_work);
	kmem_cache_destroy(f->frags_cachep);
}
}
EXPORT_SYMBOL(inet_frags_fini);
EXPORT_SYMBOL(inet_frags_fini);


@@ -327,7 +334,7 @@ void inet_frag_destroy(struct inet_frag_queue *q, struct inet_frags *f)


	if (f->destructor)
	if (f->destructor)
		f->destructor(q);
		f->destructor(q);
	kfree(q);
	kmem_cache_free(f->frags_cachep, q);
}
}
EXPORT_SYMBOL(inet_frag_destroy);
EXPORT_SYMBOL(inet_frag_destroy);


@@ -377,7 +384,7 @@ static struct inet_frag_queue *inet_frag_alloc(struct netns_frags *nf,
		return NULL;
		return NULL;
	}
	}


	q = kzalloc(f->qsize, GFP_ATOMIC);
	q = kmem_cache_zalloc(f->frags_cachep, GFP_ATOMIC);
	if (q == NULL)
	if (q == NULL)
		return NULL;
		return NULL;


+4 −1
Original line number Original line Diff line number Diff line
@@ -55,6 +55,7 @@
 */
 */


static int sysctl_ipfrag_max_dist __read_mostly = 64;
static int sysctl_ipfrag_max_dist __read_mostly = 64;
static const char ip_frag_cache_name[] = "ip4-frags";


struct ipfrag_skb_cb
struct ipfrag_skb_cb
{
{
@@ -860,5 +861,7 @@ void __init ipfrag_init(void)
	ip4_frags.qsize = sizeof(struct ipq);
	ip4_frags.qsize = sizeof(struct ipq);
	ip4_frags.match = ip4_frag_match;
	ip4_frags.match = ip4_frag_match;
	ip4_frags.frag_expire = ip_expire;
	ip4_frags.frag_expire = ip_expire;
	inet_frags_init(&ip4_frags);
	ip4_frags.frags_cache_name = ip_frag_cache_name;
	if (inet_frags_init(&ip4_frags))
		panic("IP: failed to allocate ip4_frags cache\n");
}
}
+6 −2
Original line number Original line Diff line number Diff line
@@ -50,6 +50,7 @@
#include <linux/module.h>
#include <linux/module.h>
#include <net/netfilter/ipv6/nf_defrag_ipv6.h>
#include <net/netfilter/ipv6/nf_defrag_ipv6.h>


static const char nf_frags_cache_name[] = "nf-frags";


struct nf_ct_frag6_skb_cb
struct nf_ct_frag6_skb_cb
{
{
@@ -677,12 +678,15 @@ int nf_ct_frag6_init(void)
	nf_frags.qsize = sizeof(struct frag_queue);
	nf_frags.qsize = sizeof(struct frag_queue);
	nf_frags.match = ip6_frag_match;
	nf_frags.match = ip6_frag_match;
	nf_frags.frag_expire = nf_ct_frag6_expire;
	nf_frags.frag_expire = nf_ct_frag6_expire;
	inet_frags_init(&nf_frags);
	nf_frags.frags_cache_name = nf_frags_cache_name;

	ret = inet_frags_init(&nf_frags);
	if (ret)
		goto out;
	ret = register_pernet_subsys(&nf_ct_net_ops);
	ret = register_pernet_subsys(&nf_ct_net_ops);
	if (ret)
	if (ret)
		inet_frags_fini(&nf_frags);
		inet_frags_fini(&nf_frags);


out:
	return ret;
	return ret;
}
}


Loading