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