static int tcp_update_limit(struct mem_cgroup *memcg, u64 val) { struct net *net = current->nsproxy->net_ns; struct tcp_memcontrol *tcp; struct cg_proto *cg_proto; u64 old_lim; int i; int ret; cg_proto = tcp_prot.proto_cgroup(memcg); if (!cg_proto) return -EINVAL; if (val > RESOURCE_MAX) val = RESOURCE_MAX; tcp = tcp_from_cgproto(cg_proto); old_lim = res_counter_read_u64(&tcp->tcp_memory_allocated, RES_LIMIT); ret = res_counter_set_limit(&tcp->tcp_memory_allocated, val); if (ret) return ret; for (i = 0; i < 3; i++) tcp->tcp_prot_mem[i] = min_t(long, val >> PAGE_SHIFT, net->ipv4.sysctl_tcp_mem[i]); if (val == RESOURCE_MAX && old_lim != RESOURCE_MAX) static_key_slow_dec(&memcg_socket_limit_enabled); else if (old_lim == RESOURCE_MAX && val != RESOURCE_MAX) static_key_slow_inc(&memcg_socket_limit_enabled); return 0; }
static u64 tcp_read_usage(struct mem_cgroup *memcg) { struct cg_proto *cg_proto; cg_proto = tcp_prot.proto_cgroup(memcg); if (!cg_proto) return atomic_long_read(&tcp_memory_allocated) << PAGE_SHIFT; return res_counter_read_u64(&cg_proto->memory_allocated, RES_USAGE); }
static u64 tcp_read_stat(struct mem_cgroup *memcg, int type, u64 default_val) { struct cg_proto *cg_proto; cg_proto = tcp_prot.proto_cgroup(memcg); if (!cg_proto) return default_val; return res_counter_read_u64(&cg_proto->memory_allocated, type); }
unsigned long long tcp_max_memory(const struct mem_cgroup *memcg) { struct tcp_memcontrol *tcp; struct cg_proto *cg_proto; cg_proto = tcp_prot.proto_cgroup((struct mem_cgroup *)memcg); if (!cg_proto) return 0; tcp = tcp_from_cgproto(cg_proto); return res_counter_read_u64(&tcp->tcp_memory_allocated, RES_LIMIT); }
static u64 tcp_read_usage(struct mem_cgroup *memcg) { struct tcp_memcontrol *tcp; struct cg_proto *cg_proto; cg_proto = tcp_prot.proto_cgroup(memcg); if (!cg_proto) return atomic_long_read(&tcp_memory_allocated) << PAGE_SHIFT; tcp = tcp_from_cgproto(cg_proto); return res_counter_read_u64(&tcp->tcp_memory_allocated, RES_USAGE); }
static u64 tcp_read_stat(struct mem_cgroup *memcg, int type, u64 default_val) { struct tcp_memcontrol *tcp; struct cg_proto *cg_proto; cg_proto = tcp_prot.proto_cgroup(memcg); if (!cg_proto) return default_val; tcp = tcp_from_cgproto(cg_proto); return res_counter_read_u64(&tcp->tcp_memory_allocated, type); }
void tcp_destroy_cgroup(struct cgroup *cgrp) { struct mem_cgroup *memcg = mem_cgroup_from_cont(cgrp); struct cg_proto *cg_proto; struct tcp_memcontrol *tcp; u64 val; cg_proto = tcp_prot.proto_cgroup(memcg); if (!cg_proto) return; tcp = tcp_from_cgproto(cg_proto); percpu_counter_destroy(&tcp->tcp_sockets_allocated); val = res_counter_read_u64(&tcp->tcp_memory_allocated, RES_LIMIT); if (val != RESOURCE_MAX) static_key_slow_dec(&memcg_socket_limit_enabled); }