Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / net / sched / cls_cgroup.c
index 31f06b633574e8e85acfd288d9d5c574b8941275..6db7855b9029ee26dcd97d73c43862a93c35b6c4 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/skbuff.h>
 #include <linux/cgroup.h>
 #include <linux/rcupdate.h>
+#include <linux/fdtable.h>
 #include <net/rtnetlink.h>
 #include <net/pkt_cls.h>
 #include <net/sock.h>
@@ -57,6 +58,28 @@ static void cgrp_css_free(struct cgroup *cgrp)
        kfree(cgrp_cls_state(cgrp));
 }
 
+static int update_classid(const void *v, struct file *file, unsigned n)
+{
+       int err;
+       struct socket *sock = sock_from_file(file, &err);
+       if (sock)
+               sock->sk->sk_classid = (u32)(unsigned long)v;
+       return 0;
+}
+
+static void cgrp_attach(struct cgroup *cgrp, struct cgroup_taskset *tset)
+{
+       struct task_struct *p;
+       void *v;
+
+       cgroup_taskset_for_each(p, cgrp, tset) {
+               task_lock(p);
+               v = (void *)(unsigned long)task_cls_classid(p);
+               iterate_fd(p->files, 0, update_classid, v);
+               task_unlock(p);
+       }
+}
+
 static u64 read_classid(struct cgroup *cgrp, struct cftype *cft)
 {
        return cgrp_cls_state(cgrp)->classid;
@@ -82,6 +105,7 @@ struct cgroup_subsys net_cls_subsys = {
        .css_alloc      = cgrp_css_alloc,
        .css_online     = cgrp_css_online,
        .css_free       = cgrp_css_free,
+       .attach         = cgrp_attach,
        .subsys_id      = net_cls_subsys_id,
        .base_cftypes   = ss_files,
        .module         = THIS_MODULE,