netclassid_cgroup.c revision 073219e995b4a3f8cf1ce8228b7ef440b6994ac0
1fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann/* 2fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann * net/core/netclassid_cgroup.c Classid Cgroupfs Handling 3fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann * 4fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann * This program is free software; you can redistribute it and/or 5fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann * modify it under the terms of the GNU General Public License 6fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann * as published by the Free Software Foundation; either version 7fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann * 2 of the License, or (at your option) any later version. 8fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann * 9fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann * Authors: Thomas Graf <tgraf@suug.ch> 10fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann */ 11fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 12fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann#include <linux/module.h> 13fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann#include <linux/slab.h> 14fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann#include <linux/cgroup.h> 15fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann#include <linux/fdtable.h> 16fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann#include <net/cls_cgroup.h> 17fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann#include <net/sock.h> 18fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 19fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmannstatic inline struct cgroup_cls_state *css_cls_state(struct cgroup_subsys_state *css) 20fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann{ 21fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann return css ? container_of(css, struct cgroup_cls_state, css) : NULL; 22fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann} 23fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 24fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmannstruct cgroup_cls_state *task_cls_state(struct task_struct *p) 25fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann{ 26073219e995b4a3f8cf1ce8228b7ef440b6994ac0Tejun Heo return css_cls_state(task_css(p, net_cls_cgrp_id)); 27fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann} 28fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel BorkmannEXPORT_SYMBOL_GPL(task_cls_state); 29fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 30fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmannstatic struct cgroup_subsys_state * 31fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmanncgrp_css_alloc(struct cgroup_subsys_state *parent_css) 32fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann{ 33fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann struct cgroup_cls_state *cs; 34fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 35fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann cs = kzalloc(sizeof(*cs), GFP_KERNEL); 36fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann if (!cs) 37fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann return ERR_PTR(-ENOMEM); 38fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 39fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann return &cs->css; 40fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann} 41fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 42fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmannstatic int cgrp_css_online(struct cgroup_subsys_state *css) 43fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann{ 44fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann struct cgroup_cls_state *cs = css_cls_state(css); 45fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann struct cgroup_cls_state *parent = css_cls_state(css_parent(css)); 46fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 47fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann if (parent) 48fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann cs->classid = parent->classid; 49fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 50fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann return 0; 51fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann} 52fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 53fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmannstatic void cgrp_css_free(struct cgroup_subsys_state *css) 54fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann{ 55fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann kfree(css_cls_state(css)); 56fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann} 57fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 58fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmannstatic int update_classid(const void *v, struct file *file, unsigned n) 59fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann{ 60fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann int err; 61fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann struct socket *sock = sock_from_file(file, &err); 62fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 63fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann if (sock) 64fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann sock->sk->sk_classid = (u32)(unsigned long)v; 65fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 66fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann return 0; 67fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann} 68fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 69fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmannstatic void cgrp_attach(struct cgroup_subsys_state *css, 70fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann struct cgroup_taskset *tset) 71fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann{ 72fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann struct cgroup_cls_state *cs = css_cls_state(css); 73fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann void *v = (void *)(unsigned long)cs->classid; 74fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann struct task_struct *p; 75fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 76fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann cgroup_taskset_for_each(p, css, tset) { 77fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann task_lock(p); 78fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann iterate_fd(p->files, 0, update_classid, v); 79fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann task_unlock(p); 80fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann } 81fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann} 82fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 83fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmannstatic u64 read_classid(struct cgroup_subsys_state *css, struct cftype *cft) 84fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann{ 85fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann return css_cls_state(css)->classid; 86fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann} 87fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 88fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmannstatic int write_classid(struct cgroup_subsys_state *css, struct cftype *cft, 89fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann u64 value) 90fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann{ 91fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann css_cls_state(css)->classid = (u32) value; 92fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 93fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann return 0; 94fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann} 95fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 96fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmannstatic struct cftype ss_files[] = { 97fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann { 98fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann .name = "classid", 99fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann .read_u64 = read_classid, 100fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann .write_u64 = write_classid, 101fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann }, 102fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann { } /* terminate */ 103fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann}; 104fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann 105073219e995b4a3f8cf1ce8228b7ef440b6994ac0Tejun Heostruct cgroup_subsys net_cls_cgrp_subsys = { 106fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann .css_alloc = cgrp_css_alloc, 107fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann .css_online = cgrp_css_online, 108fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann .css_free = cgrp_css_free, 109fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann .attach = cgrp_attach, 110fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann .base_cftypes = ss_files, 111fe1217c4f3f7d7cbf8efdd8dd5fdc7204a1d65a8Daniel Borkmann}; 112