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 208fb974c9SDaniel Wagner #if IS_ENABLED(CONFIG_NET_CLS_CGROUP) 21f8451725SHerbert Xu struct cgroup_cls_state 22f8451725SHerbert Xu { 23f8451725SHerbert Xu struct cgroup_subsys_state css; 24f8451725SHerbert Xu u32 classid; 25f8451725SHerbert Xu }; 26f8451725SHerbert Xu 27*211d2f97SZefan Li extern void sock_update_classid(struct sock *sk); 28f3419807SDaniel Wagner 298fb974c9SDaniel Wagner #if IS_BUILTIN(CONFIG_NET_CLS_CGROUP) 30f8451725SHerbert Xu static inline u32 task_cls_classid(struct task_struct *p) 31f8451725SHerbert Xu { 32920750ceSDaniel Wagner u32 classid; 333fb5a991SLi Zefan 34f8451725SHerbert Xu if (in_interrupt()) 35f8451725SHerbert Xu return 0; 36f8451725SHerbert Xu 373fb5a991SLi Zefan rcu_read_lock(); 383fb5a991SLi Zefan classid = container_of(task_subsys_state(p, net_cls_subsys_id), 39937eada4SHerbert Xu struct cgroup_cls_state, css)->classid; 403fb5a991SLi Zefan rcu_read_unlock(); 413fb5a991SLi Zefan 423fb5a991SLi Zefan return classid; 43f8451725SHerbert Xu } 448fb974c9SDaniel Wagner #elif IS_MODULE(CONFIG_NET_CLS_CGROUP) 45f8451725SHerbert Xu static inline u32 task_cls_classid(struct task_struct *p) 46f8451725SHerbert Xu { 478a8e04dfSDaniel Wagner struct cgroup_subsys_state *css; 48ea16f912SHerbert Xu u32 classid = 0; 49f8451725SHerbert Xu 50f8451725SHerbert Xu if (in_interrupt()) 51f8451725SHerbert Xu return 0; 52f8451725SHerbert Xu 53f8451725SHerbert Xu rcu_read_lock(); 548a8e04dfSDaniel Wagner css = task_subsys_state(p, net_cls_subsys_id); 558a8e04dfSDaniel Wagner if (css) 568a8e04dfSDaniel Wagner classid = container_of(css, 57f8451725SHerbert Xu struct cgroup_cls_state, css)->classid; 58f8451725SHerbert Xu rcu_read_unlock(); 59f8451725SHerbert Xu 60f8451725SHerbert Xu return classid; 61f8451725SHerbert Xu } 62f8451725SHerbert Xu #endif 638fb974c9SDaniel Wagner #else /* !CGROUP_NET_CLS_CGROUP */ 64*211d2f97SZefan Li static inline void sock_update_classid(struct sock *sk) 65f3419807SDaniel Wagner { 66f3419807SDaniel Wagner } 67f3419807SDaniel Wagner 68f8451725SHerbert Xu static inline u32 task_cls_classid(struct task_struct *p) 69f8451725SHerbert Xu { 70f8451725SHerbert Xu return 0; 71f8451725SHerbert Xu } 728fb974c9SDaniel Wagner #endif /* CGROUP_NET_CLS_CGROUP */ 73f8451725SHerbert Xu #endif /* _NET_CLS_CGROUP_H */ 74