* [PATCH net 1/2] Revert "net: defer call to cgroup_sk_alloc()"
@ 2017-10-11 2:12 Eric Dumazet
2017-10-11 2:12 ` [PATCH net 2/2] net: call cgroup_sk_alloc() earlier in sk_clone_lock() Eric Dumazet
2017-10-11 3:24 ` [PATCH net 1/2] Revert "net: defer call to cgroup_sk_alloc()" David Miller
0 siblings, 2 replies; 4+ messages in thread
From: Eric Dumazet @ 2017-10-11 2:12 UTC (permalink / raw)
To: David S . Miller
Cc: netdev, Eric Dumazet, Eric Dumazet, Johannes Weiner, Craig Gallek,
Tejun Heo
This reverts commit fbb1fb4ad415cb31ce944f65a5ca700aaf73a227.
This was not the proper fix, lets cleanly revert it, so that
following patch can be carried to stable versions.
sock_cgroup_ptr() callers do not expect a NULL return value.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Tejun Heo <tj@kernel.org>
---
kernel/cgroup/cgroup.c | 11 +++++++++++
net/core/sock.c | 3 ++-
net/ipv4/inet_connection_sock.c | 5 -----
3 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index 3380a3e49af501e457991b2823020494cf32af80..44857278eb8aa6a2bbf27b7eb12137ef42628170 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -5709,6 +5709,17 @@ void cgroup_sk_alloc(struct sock_cgroup_data *skcd)
if (cgroup_sk_alloc_disabled)
return;
+ /* Socket clone path */
+ if (skcd->val) {
+ /*
+ * We might be cloning a socket which is left in an empty
+ * cgroup and the cgroup might have already been rmdir'd.
+ * Don't use cgroup_get_live().
+ */
+ cgroup_get(sock_cgroup_ptr(skcd));
+ return;
+ }
+
rcu_read_lock();
while (true) {
diff --git a/net/core/sock.c b/net/core/sock.c
index 4499e31538132ed59a16d92e6f6b923e776df84e..70c6ccbdf49f2f8a5a0f7c41c7849ea01459be50 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1680,7 +1680,6 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
/* sk->sk_memcg will be populated at accept() time */
newsk->sk_memcg = NULL;
- memset(&newsk->sk_cgrp_data, 0, sizeof(newsk->sk_cgrp_data));
atomic_set(&newsk->sk_drops, 0);
newsk->sk_send_head = NULL;
@@ -1719,6 +1718,8 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
newsk->sk_incoming_cpu = raw_smp_processor_id();
atomic64_set(&newsk->sk_cookie, 0);
+ cgroup_sk_alloc(&newsk->sk_cgrp_data);
+
/*
* Before updating sk_refcnt, we must commit prior changes to memory
* (Documentation/RCU/rculist_nulls.txt for details)
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
index d32c74507314cc4b91d040de8e877e4bd8204106..67aec7a106860b26c929fea1624d652c87972f04 100644
--- a/net/ipv4/inet_connection_sock.c
+++ b/net/ipv4/inet_connection_sock.c
@@ -26,8 +26,6 @@
#include <net/tcp.h>
#include <net/sock_reuseport.h>
#include <net/addrconf.h>
-#include <net/cls_cgroup.h>
-#include <net/netprio_cgroup.h>
#ifdef INET_CSK_DEBUG
const char inet_csk_timer_bug_msg[] = "inet_csk BUG: unknown timer value\n";
@@ -478,9 +476,6 @@ struct sock *inet_csk_accept(struct sock *sk, int flags, int *err, bool kern)
spin_unlock_bh(&queue->fastopenq.lock);
}
mem_cgroup_sk_alloc(newsk);
- cgroup_sk_alloc(&newsk->sk_cgrp_data);
- sock_update_classid(&newsk->sk_cgrp_data);
- sock_update_netprioidx(&newsk->sk_cgrp_data);
out:
release_sock(sk);
if (req)
--
2.15.0.rc0.271.g36b669edcc-goog
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH net 2/2] net: call cgroup_sk_alloc() earlier in sk_clone_lock()
2017-10-11 2:12 [PATCH net 1/2] Revert "net: defer call to cgroup_sk_alloc()" Eric Dumazet
@ 2017-10-11 2:12 ` Eric Dumazet
2017-10-11 3:24 ` David Miller
2017-10-11 3:24 ` [PATCH net 1/2] Revert "net: defer call to cgroup_sk_alloc()" David Miller
1 sibling, 1 reply; 4+ messages in thread
From: Eric Dumazet @ 2017-10-11 2:12 UTC (permalink / raw)
To: David S . Miller
Cc: netdev, Eric Dumazet, Eric Dumazet, Johannes Weiner, Craig Gallek,
Tejun Heo
If for some reason, the newly allocated child need to be freed,
we will call cgroup_put() (via sk_free_unlock_clone()) while the
corresponding cgroup_get() was not yet done, and we will free memory
too soon.
Fixes: d979a39d7242 ("cgroup: duplicate cgroup reference when cloning sockets")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Tejun Heo <tj@kernel.org>
---
net/core/sock.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/net/core/sock.c b/net/core/sock.c
index 70c6ccbdf49f2f8a5a0f7c41c7849ea01459be50..415f441c63b9e2ff8feb010f44ca27303c72aaa1 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1687,6 +1687,7 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
atomic_set(&newsk->sk_zckey, 0);
sock_reset_flag(newsk, SOCK_DONE);
+ cgroup_sk_alloc(&newsk->sk_cgrp_data);
rcu_read_lock();
filter = rcu_dereference(sk->sk_filter);
@@ -1718,8 +1719,6 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
newsk->sk_incoming_cpu = raw_smp_processor_id();
atomic64_set(&newsk->sk_cookie, 0);
- cgroup_sk_alloc(&newsk->sk_cgrp_data);
-
/*
* Before updating sk_refcnt, we must commit prior changes to memory
* (Documentation/RCU/rculist_nulls.txt for details)
--
2.15.0.rc0.271.g36b669edcc-goog
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH net 1/2] Revert "net: defer call to cgroup_sk_alloc()"
2017-10-11 2:12 [PATCH net 1/2] Revert "net: defer call to cgroup_sk_alloc()" Eric Dumazet
2017-10-11 2:12 ` [PATCH net 2/2] net: call cgroup_sk_alloc() earlier in sk_clone_lock() Eric Dumazet
@ 2017-10-11 3:24 ` David Miller
1 sibling, 0 replies; 4+ messages in thread
From: David Miller @ 2017-10-11 3:24 UTC (permalink / raw)
To: edumazet; +Cc: netdev, eric.dumazet, hannes, cgallek, tj
From: Eric Dumazet <edumazet@google.com>
Date: Tue, 10 Oct 2017 19:12:32 -0700
> This reverts commit fbb1fb4ad415cb31ce944f65a5ca700aaf73a227.
>
> This was not the proper fix, lets cleanly revert it, so that
> following patch can be carried to stable versions.
>
> sock_cgroup_ptr() callers do not expect a NULL return value.
>
> Signed-off-by: Eric Dumazet <edumazet@google.com>
Applied.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH net 2/2] net: call cgroup_sk_alloc() earlier in sk_clone_lock()
2017-10-11 2:12 ` [PATCH net 2/2] net: call cgroup_sk_alloc() earlier in sk_clone_lock() Eric Dumazet
@ 2017-10-11 3:24 ` David Miller
0 siblings, 0 replies; 4+ messages in thread
From: David Miller @ 2017-10-11 3:24 UTC (permalink / raw)
To: edumazet; +Cc: netdev, eric.dumazet, hannes, cgallek, tj
From: Eric Dumazet <edumazet@google.com>
Date: Tue, 10 Oct 2017 19:12:33 -0700
> If for some reason, the newly allocated child need to be freed,
> we will call cgroup_put() (via sk_free_unlock_clone()) while the
> corresponding cgroup_get() was not yet done, and we will free memory
> too soon.
>
> Fixes: d979a39d7242 ("cgroup: duplicate cgroup reference when cloning sockets")
> Signed-off-by: Eric Dumazet <edumazet@google.com>
Applied and queued up for -stable.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2017-10-11 3:24 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-10-11 2:12 [PATCH net 1/2] Revert "net: defer call to cgroup_sk_alloc()" Eric Dumazet
2017-10-11 2:12 ` [PATCH net 2/2] net: call cgroup_sk_alloc() earlier in sk_clone_lock() Eric Dumazet
2017-10-11 3:24 ` David Miller
2017-10-11 3:24 ` [PATCH net 1/2] Revert "net: defer call to cgroup_sk_alloc()" David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).