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

Commit c308c1b2 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by David S. Miller
Browse files

[NET]: Cleanup the allocation/freeing of the sock object



The sock object is allocated either from the generic cache with
the kmalloc, or from the proc->slab cache.

Move this logic into an isolated set of helpers and make the
sk_alloc/sk_free look a bit nicer.

Signed-off-by: default avatarPavel Emelyanov <xemul@openvz.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1e2e6b89
Loading
Loading
Loading
Loading
+29 −15
Original line number Diff line number Diff line
@@ -870,6 +870,31 @@ static void sock_copy(struct sock *nsk, const struct sock *osk)
#endif
}

static struct sock *sk_prot_alloc(struct proto *prot, gfp_t priority)
{
	struct sock *sk;
	struct kmem_cache *slab;

	slab = prot->slab;
	if (slab != NULL)
		sk = kmem_cache_alloc(slab, priority);
	else
		sk = kmalloc(prot->obj_size, priority);

	return sk;
}

static void sk_prot_free(struct proto *prot, struct sock *sk)
{
	struct kmem_cache *slab;

	slab = prot->slab;
	if (slab != NULL)
		kmem_cache_free(slab, sk);
	else
		kfree(sk);
}

/**
 *	sk_alloc - All socket objects are allocated here
 *	@net: the applicable net namespace
@@ -881,14 +906,9 @@ static void sock_copy(struct sock *nsk, const struct sock *osk)
struct sock *sk_alloc(struct net *net, int family, gfp_t priority,
		      struct proto *prot, int zero_it)
{
	struct sock *sk = NULL;
	struct kmem_cache *slab = prot->slab;

	if (slab != NULL)
		sk = kmem_cache_alloc(slab, priority);
	else
		sk = kmalloc(prot->obj_size, priority);
	struct sock *sk;

	sk = sk_prot_alloc(prot, priority);
	if (sk) {
		if (zero_it) {
			memset(sk, 0, prot->obj_size);
@@ -911,10 +931,7 @@ struct sock *sk_alloc(struct net *net, int family, gfp_t priority,
	return sk;

out_free:
	if (slab != NULL)
		kmem_cache_free(slab, sk);
	else
		kfree(sk);
	sk_prot_free(prot, sk);
	return NULL;
}

@@ -940,10 +957,7 @@ void sk_free(struct sock *sk)

	security_sk_free(sk);
	put_net(sk->sk_net);
	if (sk->sk_prot_creator->slab != NULL)
		kmem_cache_free(sk->sk_prot_creator->slab, sk);
	else
		kfree(sk);
	sk_prot_free(sk->sk_prot_creator, sk);
	module_put(owner);
}