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 { 30f8451725SHerbert Xu if (in_interrupt()) 31f8451725SHerbert Xu return 0; 32f8451725SHerbert Xu 33f8451725SHerbert Xu return container_of(task_subsys_state(p, net_cls_subsys_id), 34*937eada4SHerbert Xu struct cgroup_cls_state, css)->classid; 35f8451725SHerbert Xu } 36f8451725SHerbert Xu #else 37f8451725SHerbert Xu extern int net_cls_subsys_id; 38f8451725SHerbert Xu 39f8451725SHerbert Xu static inline u32 task_cls_classid(struct task_struct *p) 40f8451725SHerbert Xu { 41f8451725SHerbert Xu int id; 42f8451725SHerbert Xu u32 classid; 43f8451725SHerbert Xu 44f8451725SHerbert Xu if (in_interrupt()) 45f8451725SHerbert Xu return 0; 46f8451725SHerbert Xu 47f8451725SHerbert Xu rcu_read_lock(); 48f8451725SHerbert Xu id = rcu_dereference(net_cls_subsys_id); 49f8451725SHerbert Xu if (id >= 0) 50f8451725SHerbert Xu classid = container_of(task_subsys_state(p, id), 51f8451725SHerbert Xu struct cgroup_cls_state, css)->classid; 52f8451725SHerbert Xu rcu_read_unlock(); 53f8451725SHerbert Xu 54f8451725SHerbert Xu return classid; 55f8451725SHerbert Xu } 56f8451725SHerbert Xu #endif 57f8451725SHerbert Xu #else 58f8451725SHerbert Xu static inline u32 task_cls_classid(struct task_struct *p) 59f8451725SHerbert Xu { 60f8451725SHerbert Xu return 0; 61f8451725SHerbert Xu } 62f8451725SHerbert Xu #endif 63f8451725SHerbert Xu #endif /* _NET_CLS_CGROUP_H */ 64