Merge branch 'for-3.5' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
Pull cgroup updates from Tejun Heo: "cgroup file type addition / removal is updated so that file types are added and removed instead of individual files so that dynamic file type addition / removal can be implemented by cgroup and used by controllers. blkio controller changes which will come through block tree are dependent on this. Other changes include res_counter cleanup and disallowing kthread / PF_THREAD_BOUND threads to be attached to non-root cgroups. There's a reported bug with the file type addition / removal handling which can lead to oops on cgroup umount. The issue is being looked into. It shouldn't cause problems for most setups and isn't a security concern." Fix up trivial conflict in Documentation/feature-removal-schedule.txt * 'for-3.5' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup: (21 commits) res_counter: Account max_usage when calling res_counter_charge_nofail() res_counter: Merge res_counter_charge and res_counter_charge_nofail cgroups: disallow attaching kthreadd or PF_THREAD_BOUND threads cgroup: remove cgroup_subsys->populate() cgroup: get rid of populate for memcg cgroup: pass struct mem_cgroup instead of struct cgroup to socket memcg cgroup: make css->refcnt clearing on cgroup removal optional cgroup: use negative bias on css->refcnt to block css_tryget() cgroup: implement cgroup_rm_cftypes() cgroup: introduce struct cfent cgroup: relocate __d_cgrp() and __d_cft() cgroup: remove cgroup_add_file[s]() cgroup: convert memcg controller to the new cftype interface memcg: always create memsw files if CONFIG_CGROUP_MEM_RES_CTLR_SWAP cgroup: convert all non-memcg controllers to the new cftype interface cgroup: relocate cftype and cgroup_subsys definitions in controllers cgroup: merge cft_release_agent cftype array into the base files array cgroup: implement cgroup_add_cftypes() and friends cgroup: build list of all cgroups under a given cgroupfs_root cgroup: move cgroup_clear_directory() call out of cgroup_populate_dir() ...
This commit is contained in:
@@ -25,21 +25,6 @@
|
||||
#include <net/sock.h>
|
||||
#include <net/netprio_cgroup.h>
|
||||
|
||||
static struct cgroup_subsys_state *cgrp_create(struct cgroup *cgrp);
|
||||
static void cgrp_destroy(struct cgroup *cgrp);
|
||||
static int cgrp_populate(struct cgroup_subsys *ss, struct cgroup *cgrp);
|
||||
|
||||
struct cgroup_subsys net_prio_subsys = {
|
||||
.name = "net_prio",
|
||||
.create = cgrp_create,
|
||||
.destroy = cgrp_destroy,
|
||||
.populate = cgrp_populate,
|
||||
#ifdef CONFIG_NETPRIO_CGROUP
|
||||
.subsys_id = net_prio_subsys_id,
|
||||
#endif
|
||||
.module = THIS_MODULE
|
||||
};
|
||||
|
||||
#define PRIOIDX_SZ 128
|
||||
|
||||
static unsigned long prioidx_map[PRIOIDX_SZ];
|
||||
@@ -259,12 +244,19 @@ static struct cftype ss_files[] = {
|
||||
.read_map = read_priomap,
|
||||
.write_string = write_priomap,
|
||||
},
|
||||
{ } /* terminate */
|
||||
};
|
||||
|
||||
static int cgrp_populate(struct cgroup_subsys *ss, struct cgroup *cgrp)
|
||||
{
|
||||
return cgroup_add_files(cgrp, ss, ss_files, ARRAY_SIZE(ss_files));
|
||||
}
|
||||
struct cgroup_subsys net_prio_subsys = {
|
||||
.name = "net_prio",
|
||||
.create = cgrp_create,
|
||||
.destroy = cgrp_destroy,
|
||||
#ifdef CONFIG_NETPRIO_CGROUP
|
||||
.subsys_id = net_prio_subsys_id,
|
||||
#endif
|
||||
.base_cftypes = ss_files,
|
||||
.module = THIS_MODULE
|
||||
};
|
||||
|
||||
static int netprio_device_event(struct notifier_block *unused,
|
||||
unsigned long event, void *ptr)
|
||||
|
@@ -143,7 +143,7 @@ static DEFINE_MUTEX(proto_list_mutex);
|
||||
static LIST_HEAD(proto_list);
|
||||
|
||||
#ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM
|
||||
int mem_cgroup_sockets_init(struct cgroup *cgrp, struct cgroup_subsys *ss)
|
||||
int mem_cgroup_sockets_init(struct mem_cgroup *memcg, struct cgroup_subsys *ss)
|
||||
{
|
||||
struct proto *proto;
|
||||
int ret = 0;
|
||||
@@ -151,7 +151,7 @@ int mem_cgroup_sockets_init(struct cgroup *cgrp, struct cgroup_subsys *ss)
|
||||
mutex_lock(&proto_list_mutex);
|
||||
list_for_each_entry(proto, &proto_list, node) {
|
||||
if (proto->init_cgroup) {
|
||||
ret = proto->init_cgroup(cgrp, ss);
|
||||
ret = proto->init_cgroup(memcg, ss);
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
@@ -162,19 +162,19 @@ int mem_cgroup_sockets_init(struct cgroup *cgrp, struct cgroup_subsys *ss)
|
||||
out:
|
||||
list_for_each_entry_continue_reverse(proto, &proto_list, node)
|
||||
if (proto->destroy_cgroup)
|
||||
proto->destroy_cgroup(cgrp);
|
||||
proto->destroy_cgroup(memcg);
|
||||
mutex_unlock(&proto_list_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void mem_cgroup_sockets_destroy(struct cgroup *cgrp)
|
||||
void mem_cgroup_sockets_destroy(struct mem_cgroup *memcg)
|
||||
{
|
||||
struct proto *proto;
|
||||
|
||||
mutex_lock(&proto_list_mutex);
|
||||
list_for_each_entry_reverse(proto, &proto_list, node)
|
||||
if (proto->destroy_cgroup)
|
||||
proto->destroy_cgroup(cgrp);
|
||||
proto->destroy_cgroup(memcg);
|
||||
mutex_unlock(&proto_list_mutex);
|
||||
}
|
||||
#endif
|
||||
|
@@ -6,37 +6,6 @@
|
||||
#include <linux/memcontrol.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
static u64 tcp_cgroup_read(struct cgroup *cont, struct cftype *cft);
|
||||
static int tcp_cgroup_write(struct cgroup *cont, struct cftype *cft,
|
||||
const char *buffer);
|
||||
static int tcp_cgroup_reset(struct cgroup *cont, unsigned int event);
|
||||
|
||||
static struct cftype tcp_files[] = {
|
||||
{
|
||||
.name = "kmem.tcp.limit_in_bytes",
|
||||
.write_string = tcp_cgroup_write,
|
||||
.read_u64 = tcp_cgroup_read,
|
||||
.private = RES_LIMIT,
|
||||
},
|
||||
{
|
||||
.name = "kmem.tcp.usage_in_bytes",
|
||||
.read_u64 = tcp_cgroup_read,
|
||||
.private = RES_USAGE,
|
||||
},
|
||||
{
|
||||
.name = "kmem.tcp.failcnt",
|
||||
.private = RES_FAILCNT,
|
||||
.trigger = tcp_cgroup_reset,
|
||||
.read_u64 = tcp_cgroup_read,
|
||||
},
|
||||
{
|
||||
.name = "kmem.tcp.max_usage_in_bytes",
|
||||
.private = RES_MAX_USAGE,
|
||||
.trigger = tcp_cgroup_reset,
|
||||
.read_u64 = tcp_cgroup_read,
|
||||
},
|
||||
};
|
||||
|
||||
static inline struct tcp_memcontrol *tcp_from_cgproto(struct cg_proto *cg_proto)
|
||||
{
|
||||
return container_of(cg_proto, struct tcp_memcontrol, cg_proto);
|
||||
@@ -49,7 +18,7 @@ static void memcg_tcp_enter_memory_pressure(struct sock *sk)
|
||||
}
|
||||
EXPORT_SYMBOL(memcg_tcp_enter_memory_pressure);
|
||||
|
||||
int tcp_init_cgroup(struct cgroup *cgrp, struct cgroup_subsys *ss)
|
||||
int tcp_init_cgroup(struct mem_cgroup *memcg, struct cgroup_subsys *ss)
|
||||
{
|
||||
/*
|
||||
* The root cgroup does not use res_counters, but rather,
|
||||
@@ -59,13 +28,12 @@ int tcp_init_cgroup(struct cgroup *cgrp, struct cgroup_subsys *ss)
|
||||
struct res_counter *res_parent = NULL;
|
||||
struct cg_proto *cg_proto, *parent_cg;
|
||||
struct tcp_memcontrol *tcp;
|
||||
struct mem_cgroup *memcg = mem_cgroup_from_cont(cgrp);
|
||||
struct mem_cgroup *parent = parent_mem_cgroup(memcg);
|
||||
struct net *net = current->nsproxy->net_ns;
|
||||
|
||||
cg_proto = tcp_prot.proto_cgroup(memcg);
|
||||
if (!cg_proto)
|
||||
goto create_files;
|
||||
return 0;
|
||||
|
||||
tcp = tcp_from_cgproto(cg_proto);
|
||||
|
||||
@@ -88,15 +56,12 @@ int tcp_init_cgroup(struct cgroup *cgrp, struct cgroup_subsys *ss)
|
||||
cg_proto->sockets_allocated = &tcp->tcp_sockets_allocated;
|
||||
cg_proto->memcg = memcg;
|
||||
|
||||
create_files:
|
||||
return cgroup_add_files(cgrp, ss, tcp_files,
|
||||
ARRAY_SIZE(tcp_files));
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(tcp_init_cgroup);
|
||||
|
||||
void tcp_destroy_cgroup(struct cgroup *cgrp)
|
||||
void tcp_destroy_cgroup(struct mem_cgroup *memcg)
|
||||
{
|
||||
struct mem_cgroup *memcg = mem_cgroup_from_cont(cgrp);
|
||||
struct cg_proto *cg_proto;
|
||||
struct tcp_memcontrol *tcp;
|
||||
u64 val;
|
||||
@@ -270,3 +235,37 @@ void tcp_prot_mem(struct mem_cgroup *memcg, long val, int idx)
|
||||
|
||||
tcp->tcp_prot_mem[idx] = val;
|
||||
}
|
||||
|
||||
static struct cftype tcp_files[] = {
|
||||
{
|
||||
.name = "kmem.tcp.limit_in_bytes",
|
||||
.write_string = tcp_cgroup_write,
|
||||
.read_u64 = tcp_cgroup_read,
|
||||
.private = RES_LIMIT,
|
||||
},
|
||||
{
|
||||
.name = "kmem.tcp.usage_in_bytes",
|
||||
.read_u64 = tcp_cgroup_read,
|
||||
.private = RES_USAGE,
|
||||
},
|
||||
{
|
||||
.name = "kmem.tcp.failcnt",
|
||||
.private = RES_FAILCNT,
|
||||
.trigger = tcp_cgroup_reset,
|
||||
.read_u64 = tcp_cgroup_read,
|
||||
},
|
||||
{
|
||||
.name = "kmem.tcp.max_usage_in_bytes",
|
||||
.private = RES_MAX_USAGE,
|
||||
.trigger = tcp_cgroup_reset,
|
||||
.read_u64 = tcp_cgroup_read,
|
||||
},
|
||||
{ } /* terminate */
|
||||
};
|
||||
|
||||
static int __init tcp_memcontrol_init(void)
|
||||
{
|
||||
WARN_ON(cgroup_add_cftypes(&mem_cgroup_subsys, tcp_files));
|
||||
return 0;
|
||||
}
|
||||
__initcall(tcp_memcontrol_init);
|
||||
|
@@ -22,22 +22,6 @@
|
||||
#include <net/sock.h>
|
||||
#include <net/cls_cgroup.h>
|
||||
|
||||
static struct cgroup_subsys_state *cgrp_create(struct cgroup *cgrp);
|
||||
static void cgrp_destroy(struct cgroup *cgrp);
|
||||
static int cgrp_populate(struct cgroup_subsys *ss, struct cgroup *cgrp);
|
||||
|
||||
struct cgroup_subsys net_cls_subsys = {
|
||||
.name = "net_cls",
|
||||
.create = cgrp_create,
|
||||
.destroy = cgrp_destroy,
|
||||
.populate = cgrp_populate,
|
||||
#ifdef CONFIG_NET_CLS_CGROUP
|
||||
.subsys_id = net_cls_subsys_id,
|
||||
#endif
|
||||
.module = THIS_MODULE,
|
||||
};
|
||||
|
||||
|
||||
static inline struct cgroup_cls_state *cgrp_cls_state(struct cgroup *cgrp)
|
||||
{
|
||||
return container_of(cgroup_subsys_state(cgrp, net_cls_subsys_id),
|
||||
@@ -86,12 +70,19 @@ static struct cftype ss_files[] = {
|
||||
.read_u64 = read_classid,
|
||||
.write_u64 = write_classid,
|
||||
},
|
||||
{ } /* terminate */
|
||||
};
|
||||
|
||||
static int cgrp_populate(struct cgroup_subsys *ss, struct cgroup *cgrp)
|
||||
{
|
||||
return cgroup_add_files(cgrp, ss, ss_files, ARRAY_SIZE(ss_files));
|
||||
}
|
||||
struct cgroup_subsys net_cls_subsys = {
|
||||
.name = "net_cls",
|
||||
.create = cgrp_create,
|
||||
.destroy = cgrp_destroy,
|
||||
#ifdef CONFIG_NET_CLS_CGROUP
|
||||
.subsys_id = net_cls_subsys_id,
|
||||
#endif
|
||||
.base_cftypes = ss_files,
|
||||
.module = THIS_MODULE,
|
||||
};
|
||||
|
||||
struct cls_cgroup_head {
|
||||
u32 handle;
|
||||
|
Reference in New Issue
Block a user