mirror of
https://github.com/torvalds/linux.git
synced 2026-05-05 23:05:25 -04:00
net-memcg: Introduce mem_cgroup_from_sk().
We will store a flag in the lowest bit of sk->sk_memcg. Then, directly dereferencing sk->sk_memcg will be illegal, and we do not want to allow touching the raw sk->sk_memcg in many places. Let's introduce mem_cgroup_from_sk(). Other places accessing the raw sk->sk_memcg will be converted later. Note that we cannot define the helper as an inline function in memcontrol.h as we cannot access any fields of struct sock there due to circular dependency, so it is placed in sock.h. Signed-off-by: Kuniyuki Iwashima <kuniyu@google.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Acked-by: Roman Gushchin <roman.gushchin@linux.dev> Acked-by: Shakeel Butt <shakeel.butt@linux.dev> Link: https://patch.msgid.link/20250815201712.1745332-7-kuniyu@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
bd4aa23373
commit
f7161b234f
@@ -2594,6 +2594,18 @@ static inline gfp_t gfp_memcg_charge(void)
|
||||
return in_softirq() ? GFP_ATOMIC : GFP_KERNEL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MEMCG
|
||||
static inline struct mem_cgroup *mem_cgroup_from_sk(const struct sock *sk)
|
||||
{
|
||||
return sk->sk_memcg;
|
||||
}
|
||||
#else
|
||||
static inline struct mem_cgroup *mem_cgroup_from_sk(const struct sock *sk)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline long sock_rcvtimeo(const struct sock *sk, bool noblock)
|
||||
{
|
||||
return noblock ? 0 : READ_ONCE(sk->sk_rcvtimeo);
|
||||
|
||||
@@ -5020,19 +5020,24 @@ out:
|
||||
|
||||
void mem_cgroup_sk_free(struct sock *sk)
|
||||
{
|
||||
if (sk->sk_memcg)
|
||||
css_put(&sk->sk_memcg->css);
|
||||
struct mem_cgroup *memcg = mem_cgroup_from_sk(sk);
|
||||
|
||||
if (memcg)
|
||||
css_put(&memcg->css);
|
||||
}
|
||||
|
||||
void mem_cgroup_sk_inherit(const struct sock *sk, struct sock *newsk)
|
||||
{
|
||||
struct mem_cgroup *memcg;
|
||||
|
||||
if (sk->sk_memcg == newsk->sk_memcg)
|
||||
return;
|
||||
|
||||
mem_cgroup_sk_free(newsk);
|
||||
|
||||
if (sk->sk_memcg)
|
||||
css_get(&sk->sk_memcg->css);
|
||||
memcg = mem_cgroup_from_sk(sk);
|
||||
if (memcg)
|
||||
css_get(&memcg->css);
|
||||
|
||||
newsk->sk_memcg = sk->sk_memcg;
|
||||
}
|
||||
|
||||
@@ -718,7 +718,7 @@ struct sock *inet_csk_accept(struct sock *sk, struct proto_accept_arg *arg)
|
||||
lock_sock(newsk);
|
||||
|
||||
mem_cgroup_sk_alloc(newsk);
|
||||
if (newsk->sk_memcg) {
|
||||
if (mem_cgroup_from_sk(newsk)) {
|
||||
/* The socket has not been accepted yet, no need
|
||||
* to look at newsk->sk_wmem_queued.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user