1 /* 2 * cls_cgroup.h Control Group Classifier 3 * 4 * Authors: Thomas Graf <tgraf@suug.ch> 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License as published by the Free 8 * Software Foundation; either version 2 of the License, or (at your option) 9 * any later version. 10 * 11 */ 12 13 #ifndef _NET_CLS_CGROUP_H 14 #define _NET_CLS_CGROUP_H 15 16 #include <linux/cgroup.h> 17 #include <linux/hardirq.h> 18 #include <linux/rcupdate.h> 19 20 #ifdef CONFIG_CGROUPS 21 struct cgroup_cls_state 22 { 23 struct cgroup_subsys_state css; 24 u32 classid; 25 }; 26 27 #ifdef CONFIG_NET_CLS_CGROUP 28 static inline u32 task_cls_classid(struct task_struct *p) 29 { 30 if (in_interrupt()) 31 return 0; 32 33 return container_of(task_subsys_state(p, net_cls_subsys_id), 34 struct cgroup_cls_state, css)->classid; 35 } 36 #else 37 extern int net_cls_subsys_id; 38 39 static inline u32 task_cls_classid(struct task_struct *p) 40 { 41 int id; 42 u32 classid = 0; 43 44 if (in_interrupt()) 45 return 0; 46 47 rcu_read_lock(); 48 id = rcu_dereference(net_cls_subsys_id); 49 if (id >= 0) 50 classid = container_of(task_subsys_state(p, id), 51 struct cgroup_cls_state, css)->classid; 52 rcu_read_unlock(); 53 54 return classid; 55 } 56 #endif 57 #else 58 static inline u32 task_cls_classid(struct task_struct *p) 59 { 60 return 0; 61 } 62 #endif 63 #endif /* _NET_CLS_CGROUP_H */ 64