mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 15:27:29 +00:00
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts: drivers/net/bnx2x/bnx2x.h drivers/net/wireless/iwlwifi/iwl-1000.c drivers/net/wireless/iwlwifi/iwl-6000.c drivers/net/wireless/iwlwifi/iwl-core.h drivers/vhost/vhost.c
This commit is contained in:
commit
b4aa9e05a6
70 changed files with 458 additions and 202 deletions
|
@ -1010,6 +1010,36 @@ static void sock_copy(struct sock *nsk, const struct sock *osk)
|
|||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* caches using SLAB_DESTROY_BY_RCU should let .next pointer from nulls nodes
|
||||
* un-modified. Special care is taken when initializing object to zero.
|
||||
*/
|
||||
static inline void sk_prot_clear_nulls(struct sock *sk, int size)
|
||||
{
|
||||
if (offsetof(struct sock, sk_node.next) != 0)
|
||||
memset(sk, 0, offsetof(struct sock, sk_node.next));
|
||||
memset(&sk->sk_node.pprev, 0,
|
||||
size - offsetof(struct sock, sk_node.pprev));
|
||||
}
|
||||
|
||||
void sk_prot_clear_portaddr_nulls(struct sock *sk, int size)
|
||||
{
|
||||
unsigned long nulls1, nulls2;
|
||||
|
||||
nulls1 = offsetof(struct sock, __sk_common.skc_node.next);
|
||||
nulls2 = offsetof(struct sock, __sk_common.skc_portaddr_node.next);
|
||||
if (nulls1 > nulls2)
|
||||
swap(nulls1, nulls2);
|
||||
|
||||
if (nulls1 != 0)
|
||||
memset((char *)sk, 0, nulls1);
|
||||
memset((char *)sk + nulls1 + sizeof(void *), 0,
|
||||
nulls2 - nulls1 - sizeof(void *));
|
||||
memset((char *)sk + nulls2 + sizeof(void *), 0,
|
||||
size - nulls2 - sizeof(void *));
|
||||
}
|
||||
EXPORT_SYMBOL(sk_prot_clear_portaddr_nulls);
|
||||
|
||||
static struct sock *sk_prot_alloc(struct proto *prot, gfp_t priority,
|
||||
int family)
|
||||
{
|
||||
|
@ -1022,19 +1052,12 @@ static struct sock *sk_prot_alloc(struct proto *prot, gfp_t priority,
|
|||
if (!sk)
|
||||
return sk;
|
||||
if (priority & __GFP_ZERO) {
|
||||
/*
|
||||
* caches using SLAB_DESTROY_BY_RCU should let
|
||||
* sk_node.next un-modified. Special care is taken
|
||||
* when initializing object to zero.
|
||||
*/
|
||||
if (offsetof(struct sock, sk_node.next) != 0)
|
||||
memset(sk, 0, offsetof(struct sock, sk_node.next));
|
||||
memset(&sk->sk_node.pprev, 0,
|
||||
prot->obj_size - offsetof(struct sock,
|
||||
sk_node.pprev));
|
||||
if (prot->clear_sk)
|
||||
prot->clear_sk(sk, prot->obj_size);
|
||||
else
|
||||
sk_prot_clear_nulls(sk, prot->obj_size);
|
||||
}
|
||||
}
|
||||
else
|
||||
} else
|
||||
sk = kmalloc(prot->obj_size, priority);
|
||||
|
||||
if (sk != NULL) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue