~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/core/netclassid_cgroup.c

Version: ~ [ linux-6.4-rc3 ] ~ [ linux-6.3.4 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.30 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.113 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.180 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.243 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.283 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.315 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0-or-later
  2 /*
  3  * net/core/netclassid_cgroup.c Classid Cgroupfs Handling
  4  *
  5  * Authors:     Thomas Graf <tgraf@suug.ch>
  6  */
  7 
  8 #include <linux/slab.h>
  9 #include <linux/cgroup.h>
 10 #include <linux/fdtable.h>
 11 #include <linux/sched/task.h>
 12 
 13 #include <net/cls_cgroup.h>
 14 #include <net/sock.h>
 15 
 16 static inline struct cgroup_cls_state *css_cls_state(struct cgroup_subsys_state *css)
 17 {
 18         return css ? container_of(css, struct cgroup_cls_state, css) : NULL;
 19 }
 20 
 21 struct cgroup_cls_state *task_cls_state(struct task_struct *p)
 22 {
 23         return css_cls_state(task_css_check(p, net_cls_cgrp_id,
 24                                             rcu_read_lock_bh_held()));
 25 }
 26 EXPORT_SYMBOL_GPL(task_cls_state);
 27 
 28 static struct cgroup_subsys_state *
 29 cgrp_css_alloc(struct cgroup_subsys_state *parent_css)
 30 {
 31         struct cgroup_cls_state *cs;
 32 
 33         cs = kzalloc(sizeof(*cs), GFP_KERNEL);
 34         if (!cs)
 35                 return ERR_PTR(-ENOMEM);
 36 
 37         return &cs->css;
 38 }
 39 
 40 static int cgrp_css_online(struct cgroup_subsys_state *css)
 41 {
 42         struct cgroup_cls_state *cs = css_cls_state(css);
 43         struct cgroup_cls_state *parent = css_cls_state(css->parent);
 44 
 45         if (parent)
 46                 cs->classid = parent->classid;
 47 
 48         return 0;
 49 }
 50 
 51 static void cgrp_css_free(struct cgroup_subsys_state *css)
 52 {
 53         kfree(css_cls_state(css));
 54 }
 55 
 56 /*
 57  * To avoid freezing of sockets creation for tasks with big number of threads
 58  * and opened sockets lets release file_lock every 1000 iterated descriptors.
 59  * New sockets will already have been created with new classid.
 60  */
 61 
 62 struct update_classid_context {
 63         u32 classid;
 64         unsigned int batch;
 65 };
 66 
 67 #define UPDATE_CLASSID_BATCH 1000
 68 
 69 static int update_classid_sock(const void *v, struct file *file, unsigned n)
 70 {
 71         struct update_classid_context *ctx = (void *)v;
 72         struct socket *sock = sock_from_file(file);
 73 
 74         if (sock) {
 75                 spin_lock(&cgroup_sk_update_lock);
 76                 sock_cgroup_set_classid(&sock->sk->sk_cgrp_data, ctx->classid);
 77                 spin_unlock(&cgroup_sk_update_lock);
 78         }
 79         if (--ctx->batch == 0) {
 80                 ctx->batch = UPDATE_CLASSID_BATCH;
 81                 return n + 1;
 82         }
 83         return 0;
 84 }
 85 
 86 static void update_classid_task(struct task_struct *p, u32 classid)
 87 {
 88         struct update_classid_context ctx = {
 89                 .classid = classid,
 90                 .batch = UPDATE_CLASSID_BATCH
 91         };
 92         unsigned int fd = 0;
 93 
 94         do {
 95                 task_lock(p);
 96                 fd = iterate_fd(p->files, fd, update_classid_sock, &ctx);
 97                 task_unlock(p);
 98                 cond_resched();
 99         } while (fd);
100 }
101 
102 static void cgrp_attach(struct cgroup_taskset *tset)
103 {
104         struct cgroup_subsys_state *css;
105         struct task_struct *p;
106 
107         cgroup_taskset_for_each(p, css, tset) {
108                 update_classid_task(p, css_cls_state(css)->classid);
109         }
110 }
111 
112 static u64 read_classid(struct cgroup_subsys_state *css, struct cftype *cft)
113 {
114         return css_cls_state(css)->classid;
115 }
116 
117 static int write_classid(struct cgroup_subsys_state *css, struct cftype *cft,
118                          u64 value)
119 {
120         struct cgroup_cls_state *cs = css_cls_state(css);
121         struct css_task_iter it;
122         struct task_struct *p;
123 
124         cgroup_sk_alloc_disable();
125 
126         cs->classid = (u32)value;
127 
128         css_task_iter_start(css, 0, &it);
129         while ((p = css_task_iter_next(&it)))
130                 update_classid_task(p, cs->classid);
131         css_task_iter_end(&it);
132 
133         return 0;
134 }
135 
136 static struct cftype ss_files[] = {
137         {
138                 .name           = "classid",
139                 .read_u64       = read_classid,
140                 .write_u64      = write_classid,
141         },
142         { }     /* terminate */
143 };
144 
145 struct cgroup_subsys net_cls_cgrp_subsys = {
146         .css_alloc              = cgrp_css_alloc,
147         .css_online             = cgrp_css_online,
148         .css_free               = cgrp_css_free,
149         .attach                 = cgrp_attach,
150         .legacy_cftypes         = ss_files,
151 };
152 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp