foundations of per-cgroup memory pressure controlling.
This patch replaces all uses of struct sock fields' memory_pressure, memory_allocated, sockets_allocated, and sysctl_mem to acessor macros. Those macros can either receive a socket argument, or a mem_cgroup argument, depending on the context they live in. Since we're only doing a macro wrapping here, no performance impact at all is expected in the case where we don't have cgroups disabled. Signed-off-by: Glauber Costa <glommer@parallels.com> Reviewed-by: Hiroyouki Kamezawa <kamezawa.hiroyu@jp.fujitsu.com> CC: David S. Miller <davem@davemloft.net> CC: Eric W. Biederman <ebiederm@xmission.com> CC: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
e5671dfae5
commit
180d8cd942
@@ -53,6 +53,7 @@
|
||||
#include <linux/security.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/memcontrol.h>
|
||||
|
||||
#include <linux/filter.h>
|
||||
#include <linux/rculist_nulls.h>
|
||||
@@ -867,6 +868,99 @@ static inline void sk_refcnt_debug_release(const struct sock *sk)
|
||||
#define sk_refcnt_debug_release(sk) do { } while (0)
|
||||
#endif /* SOCK_REFCNT_DEBUG */
|
||||
|
||||
static inline bool sk_has_memory_pressure(const struct sock *sk)
|
||||
{
|
||||
return sk->sk_prot->memory_pressure != NULL;
|
||||
}
|
||||
|
||||
static inline bool sk_under_memory_pressure(const struct sock *sk)
|
||||
{
|
||||
if (!sk->sk_prot->memory_pressure)
|
||||
return false;
|
||||
return !!*sk->sk_prot->memory_pressure;
|
||||
}
|
||||
|
||||
static inline void sk_leave_memory_pressure(struct sock *sk)
|
||||
{
|
||||
int *memory_pressure = sk->sk_prot->memory_pressure;
|
||||
|
||||
if (memory_pressure && *memory_pressure)
|
||||
*memory_pressure = 0;
|
||||
}
|
||||
|
||||
static inline void sk_enter_memory_pressure(struct sock *sk)
|
||||
{
|
||||
if (sk->sk_prot->enter_memory_pressure)
|
||||
sk->sk_prot->enter_memory_pressure(sk);
|
||||
}
|
||||
|
||||
static inline long sk_prot_mem_limits(const struct sock *sk, int index)
|
||||
{
|
||||
long *prot = sk->sk_prot->sysctl_mem;
|
||||
return prot[index];
|
||||
}
|
||||
|
||||
static inline long
|
||||
sk_memory_allocated(const struct sock *sk)
|
||||
{
|
||||
struct proto *prot = sk->sk_prot;
|
||||
return atomic_long_read(prot->memory_allocated);
|
||||
}
|
||||
|
||||
static inline long
|
||||
sk_memory_allocated_add(struct sock *sk, int amt)
|
||||
{
|
||||
struct proto *prot = sk->sk_prot;
|
||||
return atomic_long_add_return(amt, prot->memory_allocated);
|
||||
}
|
||||
|
||||
static inline void
|
||||
sk_memory_allocated_sub(struct sock *sk, int amt)
|
||||
{
|
||||
struct proto *prot = sk->sk_prot;
|
||||
atomic_long_sub(amt, prot->memory_allocated);
|
||||
}
|
||||
|
||||
static inline void sk_sockets_allocated_dec(struct sock *sk)
|
||||
{
|
||||
struct proto *prot = sk->sk_prot;
|
||||
percpu_counter_dec(prot->sockets_allocated);
|
||||
}
|
||||
|
||||
static inline void sk_sockets_allocated_inc(struct sock *sk)
|
||||
{
|
||||
struct proto *prot = sk->sk_prot;
|
||||
percpu_counter_inc(prot->sockets_allocated);
|
||||
}
|
||||
|
||||
static inline int
|
||||
sk_sockets_allocated_read_positive(struct sock *sk)
|
||||
{
|
||||
struct proto *prot = sk->sk_prot;
|
||||
|
||||
return percpu_counter_sum_positive(prot->sockets_allocated);
|
||||
}
|
||||
|
||||
static inline int
|
||||
proto_sockets_allocated_sum_positive(struct proto *prot)
|
||||
{
|
||||
return percpu_counter_sum_positive(prot->sockets_allocated);
|
||||
}
|
||||
|
||||
static inline long
|
||||
proto_memory_allocated(struct proto *prot)
|
||||
{
|
||||
return atomic_long_read(prot->memory_allocated);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
proto_memory_pressure(struct proto *prot)
|
||||
{
|
||||
if (!prot->memory_pressure)
|
||||
return false;
|
||||
return !!*prot->memory_pressure;
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
/* Called with local bh disabled */
|
||||
@@ -1674,7 +1768,7 @@ static inline struct page *sk_stream_alloc_page(struct sock *sk)
|
||||
|
||||
page = alloc_pages(sk->sk_allocation, 0);
|
||||
if (!page) {
|
||||
sk->sk_prot->enter_memory_pressure(sk);
|
||||
sk_enter_memory_pressure(sk);
|
||||
sk_stream_moderate_sndbuf(sk);
|
||||
}
|
||||
return page;
|
||||
|
Reference in New Issue
Block a user