diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-09 17:46:52 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-09 17:46:52 -0500 |
| commit | 38e5781bbf8e82c1635ea845e0d07b2228a5ac7a (patch) | |
| tree | 69ced9c509c864a67122c5e1337f14cd1d9e988d /mm | |
| parent | 979ecef5b89a8003902299566d9cdc08de34a3ee (diff) | |
| parent | a8c1f65c79cbbb2f7da782d4c9d15639a9b94b27 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net:
igmp: Avoid zero delay when receiving odd mixture of IGMP queries
netdev: make net_device_ops const
bcm63xx: make ethtool_ops const
usbnet: make ethtool_ops const
net: Fix build with INET disabled.
net: introduce netif_addr_lock_nested() and call if when appropriate
net: correct lock name in dev_[uc/mc]_sync documentations.
net: sk_update_clone is only used in net/core/sock.c
8139cp: fix missing napi_gro_flush.
pktgen: set correct max and min in pktgen_setup_inject()
smsc911x: Unconditionally include linux/smscphy.h in smsc911x.h
asix: fix infinite loop in rx_fixup()
net: Default UDP and UNIX diag to 'n'.
r6040: fix typo in use of MCR0 register bits
net: fix sock_clone reference mismatch with tcp memcontrol
Diffstat (limited to 'mm')
| -rw-r--r-- | mm/memcontrol.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 00d4fa27d3e6..d87aa3510c5e 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
| @@ -381,16 +381,25 @@ static void mem_cgroup_put(struct mem_cgroup *memcg); | |||
| 381 | static bool mem_cgroup_is_root(struct mem_cgroup *memcg); | 381 | static bool mem_cgroup_is_root(struct mem_cgroup *memcg); |
| 382 | void sock_update_memcg(struct sock *sk) | 382 | void sock_update_memcg(struct sock *sk) |
| 383 | { | 383 | { |
| 384 | /* A socket spends its whole life in the same cgroup */ | ||
| 385 | if (sk->sk_cgrp) { | ||
| 386 | WARN_ON(1); | ||
| 387 | return; | ||
| 388 | } | ||
| 389 | if (static_branch(&memcg_socket_limit_enabled)) { | 384 | if (static_branch(&memcg_socket_limit_enabled)) { |
| 390 | struct mem_cgroup *memcg; | 385 | struct mem_cgroup *memcg; |
| 391 | 386 | ||
| 392 | BUG_ON(!sk->sk_prot->proto_cgroup); | 387 | BUG_ON(!sk->sk_prot->proto_cgroup); |
| 393 | 388 | ||
| 389 | /* Socket cloning can throw us here with sk_cgrp already | ||
| 390 | * filled. It won't however, necessarily happen from | ||
| 391 | * process context. So the test for root memcg given | ||
| 392 | * the current task's memcg won't help us in this case. | ||
| 393 | * | ||
| 394 | * Respecting the original socket's memcg is a better | ||
| 395 | * decision in this case. | ||
| 396 | */ | ||
| 397 | if (sk->sk_cgrp) { | ||
| 398 | BUG_ON(mem_cgroup_is_root(sk->sk_cgrp->memcg)); | ||
| 399 | mem_cgroup_get(sk->sk_cgrp->memcg); | ||
| 400 | return; | ||
| 401 | } | ||
| 402 | |||
| 394 | rcu_read_lock(); | 403 | rcu_read_lock(); |
| 395 | memcg = mem_cgroup_from_task(current); | 404 | memcg = mem_cgroup_from_task(current); |
| 396 | if (!mem_cgroup_is_root(memcg)) { | 405 | if (!mem_cgroup_is_root(memcg)) { |
