return err;
 }
 
+static void mptcp_attach_cgroup(struct sock *parent, struct sock *child)
+{
+#ifdef CONFIG_SOCK_CGROUP_DATA
+       struct sock_cgroup_data *parent_skcd = &parent->sk_cgrp_data,
+                               *child_skcd = &child->sk_cgrp_data;
+
+       /* only the additional subflows created by kworkers have to be modified */
+       if (cgroup_id(sock_cgroup_ptr(parent_skcd)) !=
+           cgroup_id(sock_cgroup_ptr(child_skcd))) {
+#ifdef CONFIG_MEMCG
+               struct mem_cgroup *memcg = parent->sk_memcg;
+
+               mem_cgroup_sk_free(child);
+               if (memcg && css_tryget(&memcg->css))
+                       child->sk_memcg = memcg;
+#endif /* CONFIG_MEMCG */
+
+               cgroup_sk_free(child_skcd);
+               *child_skcd = *parent_skcd;
+               cgroup_sk_clone(child_skcd);
+       }
+#endif /* CONFIG_SOCK_CGROUP_DATA */
+}
+
 int mptcp_subflow_create_socket(struct sock *sk, struct socket **new_sock)
 {
        struct mptcp_subflow_context *subflow;
 
        lock_sock(sf->sk);
 
+       /* the newly created socket has to be in the same cgroup as its parent */
+       mptcp_attach_cgroup(sk, sf->sk);
+
        /* kernel sockets do not by default acquire net ref, but TCP timer
         * needs it.
         */