Re: [PATCH net 1/2] Revert "net: defer call to cgroup_sk_alloc()"

2017-10-10 Thread David Miller
From: Eric Dumazet 
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 

Applied.


[PATCH net 1/2] Revert "net: defer call to cgroup_sk_alloc()"

2017-10-10 Thread Eric Dumazet
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 
Cc: Johannes Weiner 
Cc: Tejun Heo 
---
 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(>sk_cgrp_data, 0, sizeof(newsk->sk_cgrp_data));
 
atomic_set(>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(>sk_cookie, 0);
 
+   cgroup_sk_alloc(>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 
 #include 
 #include 
-#include 
-#include 
 
 #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(>fastopenq.lock);
}
mem_cgroup_sk_alloc(newsk);
-   cgroup_sk_alloc(>sk_cgrp_data);
-   sock_update_classid(>sk_cgrp_data);
-   sock_update_netprioidx(>sk_cgrp_data);
 out:
release_sock(sk);
if (req)
-- 
2.15.0.rc0.271.g36b669edcc-goog