From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3E7DDC83F1A for ; Thu, 17 Jul 2025 19:46:52 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id BEE158D0009; Thu, 17 Jul 2025 15:46:51 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id B975C8D0002; Thu, 17 Jul 2025 15:46:51 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A38088D0009; Thu, 17 Jul 2025 15:46:51 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 910318D0002 for ; Thu, 17 Jul 2025 15:46:51 -0400 (EDT) Received: from smtpin11.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 3F4DA1D897F for ; Thu, 17 Jul 2025 19:46:51 +0000 (UTC) X-FDA: 83674789422.11.A360E5E Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) by imf10.hostedemail.com (Postfix) with ESMTP id 86996C0006 for ; Thu, 17 Jul 2025 19:46:49 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=qw818u8M; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf10.hostedemail.com: domain of 3KFN5aAYKCP0pzsn3zlttlqj.htrqnsz2-rrp0fhp.twl@flex--kuniyu.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=3KFN5aAYKCP0pzsn3zlttlqj.htrqnsz2-rrp0fhp.twl@flex--kuniyu.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1752781609; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding:in-reply-to: references:dkim-signature; bh=5EdHvL0O+WMOopknGPS8Q8Op4XbYFfX8HdMIHJSvw5c=; b=urfSXbOZ+Jzkk5LQANY3yv1NSdgQuRuF4wNMGZpZ7uDCR+NKEY/TyLCa/dUqJTyNXEadGr HRGwhtYlHPmYBmLJTQu+naJ78EJgKXMv4jf1sg5z56SIFjJFVvcXhvfVwQ9RihvOs+kiS7 +SG/fP48fCXC/FtvNiK+UrfDbFowCJU= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1752781609; a=rsa-sha256; cv=none; b=5wzJ71Q16bF3QRlZkI3UwDo3pz7sLqeoVpom/2e/vzO3fLltoZdCINiHn6Yy/UaRSsM/11 8GB+9g3xbo03nlDmRQaEc78HK2wwOD4bS/6pAGSJQXyE3nDpPKO8lPUl8s0ntyhNli52HR eka0qDAQajnb4rl/u4vsfxVZHhN0Ntg= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=qw818u8M; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf10.hostedemail.com: domain of 3KFN5aAYKCP0pzsn3zlttlqj.htrqnsz2-rrp0fhp.twl@flex--kuniyu.bounces.google.com designates 209.85.214.202 as permitted sender) smtp.mailfrom=3KFN5aAYKCP0pzsn3zlttlqj.htrqnsz2-rrp0fhp.twl@flex--kuniyu.bounces.google.com Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-234f1acc707so13535875ad.3 for ; Thu, 17 Jul 2025 12:46:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1752781608; x=1753386408; darn=kvack.org; h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject :date:message-id:reply-to; bh=5EdHvL0O+WMOopknGPS8Q8Op4XbYFfX8HdMIHJSvw5c=; b=qw818u8M1eQQk85mGNN2gX82Oagv28Nz4vQswmr8IFR8GTeTD2MD28N0yBquTm4yRA DUIRS/BT0r5WVjS3p6DA5gr+rfz3HTpfOqNCeeoviO1Lt5LjFBfMU0dSVwqtjaEqzOsb zRLQL6keykxbVZwEtTR4i20mM2enQ2lR51eWmBZQqHf+yyjqhhrjc7dgmhb+ZjTo1y2+ llPM+w5qoxdPJ014S/IQjxDTpTDnkh1KoBHBs7TDuNgI0+xE3I+F8UKNq7TmLRP9zP3/ mkiDKZ2wf+8nwTfVcO93pSQIjJKLIuBHpmALev6ykwjQYxxWB2UcvQ5zMQ/gwPDQI39j Jdtw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752781608; x=1753386408; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=5EdHvL0O+WMOopknGPS8Q8Op4XbYFfX8HdMIHJSvw5c=; b=rPvMchwetcrf/Z+uw7QRDqFful0m+mb4xw3CrN/bWEvE7yo5o5rkBxUAA969xBZRjR m6ef6AS9f86uXisyh3R6B5t5XDuQPi5WRP2ljIm9jhokO3p36RW9iDXr/YRQtdq+iQAb CV4cqU2i4mPCGD6f96eIxIn8TngETHfNiW4i8rZKAirO/8mDWMcCX1rumUo+jogNOZ0g wHCU0mtzkytXpKpWIDc9igV9qRZ1QXhl0TeaxV2Nr04vfdq6QH3Fc47cwx8KiCguDePE SjqM40AiKmbs4c/i4YnmlfT4yxhsK+MXz/kJWupYPmvvfZuZ2mKtjurshooQp14lJUUS ynBQ== X-Forwarded-Encrypted: i=1; AJvYcCV2nG59HMedUVVJsKVL/EVxgHtfbAq+f7MYLDZoo6dFmmGrbOAlTlK/uMz1PK/I3pFvyuy//gTatQ==@kvack.org X-Gm-Message-State: AOJu0YxxqOwD7/sdBtQkO6kCpF4VGEEZGzQSXAn2LdJYYjevnjhaeLJU 44FV/sEcOzkG8GkxHvYv0/kSFDBf3sO4pY6JKD+qmlEMLasLNAkHQaeLAZ0qTyz8J7668iUDMN8 PJelc1Q== X-Google-Smtp-Source: AGHT+IGY4ZPUUbg8muV6v5HXbqEtq4rwzfLeRmtPzukd4Kgk1aU0KPcByozladkR51yiVYxG2FbNX5LfGCQ= X-Received: from plbmp5.prod.google.com ([2002:a17:902:fd05:b0:223:5693:a4e9]) (user=kuniyu job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:da8a:b0:23c:8f21:ac59 with SMTP id d9443c01a7336-23e2572b0c0mr121948665ad.29.1752781608284; Thu, 17 Jul 2025 12:46:48 -0700 (PDT) Date: Thu, 17 Jul 2025 19:46:43 +0000 Mime-Version: 1.0 X-Mailer: git-send-email 2.50.0.727.gbf7dc18ff4-goog Message-ID: <20250717194645.1096500-1-kuniyu@google.com> Subject: [PATCH v2] memcg: Convert memcg->socket_pressure to u64. From: Kuniyuki Iwashima To: Andrew Morton Cc: Johannes Weiner , "David S. Miller" , Vladimir Davydov , Shakeel Butt , Kuniyuki Iwashima , Kuniyuki Iwashima , linux-mm@kvack.org, Neal Cardwell Content-Type: text/plain; charset="UTF-8" X-Rspamd-Queue-Id: 86996C0006 X-Stat-Signature: pw8ctbph7cimkymjwtgu87deeraxbfep X-Rspam-User: X-Rspamd-Server: rspam11 X-HE-Tag: 1752781609-580886 X-HE-Meta: U2FsdGVkX18SPTMdXmIbam3nIfjiqIne2hy1oHFWnWiA450FiJzmS0W+ufwxqcSC+2yPXrQbLIbolyqnjZGVmQ1fhjUDt1E4SEIDwO6sV83DP27uMQschiScBqFzTxoXSZhmfdRb2zhClPtwaKJXKqHDKZaxxYkQKrXbhRuNJfbmGJ2coMEwEh/u2m97AL5gQD2wwGuhsivmoTDYpvnFIqT1v+v8pPkPPuuIWv7Di1WKzaukvA8Z7XCBVkuf4pjstECLWDX1JDS5IQoZ9rrN/7kzcO+pWTpZjjNGdOU7St7wWMq+4QZCCZopLS0E0eEMd/LP47Jst89yOCFhqN8+7b/Oc2xixuValSlfZrBLmTvfrzOb28DZlIqXkOaUMnFcrpDGnCL3Tcu+k5xuqAnGafGRh2h1vVdMb5z3wSpgZJXL7S6dWEEi8aNObOpvUaKH8lFWsFjMD07mBMWcoKtREZ+uEdJxynllip++2mfrUReFRrJGP29vF1d4A4J+/kLARfFfymjVOlqHjb2aZcsUPlJ3GaVSSAIx12FC23z53I/pLeoQmAZeYOqJSHUYmI8NBxxs3KRmrJSdR9zCssdwsXattsSWq+eTNWSaPYugToNoojM0oS5wfjrmGDNEYJcpWrIFUZpRzrJfKrC8tKeQ9w5c9F+HsS3oKd4F4LykNKF5ZdAacQ17KjNtN/4oRiXuFCwVDIC1BJxs1hy/QXSExxrQUPVJN7ZZVRu41mlrX0EPqwo+xGzasm+ZVITpZ00I2FKx701xyvD6/hOrmUWjzv+9kHEnB7nOYjqK+BIyeCcUzuZQ30MmwxDeJj57Gdo+sI/2ZMWENGrz0mv9uXOYru9rfJ0a0VvKrr6p0qK9hJLUOGrW8LoZF3ng6dvqSdyOuidJPO/nlm7iq/hYz/M/sDHBN6P6VngrxED/ep7uc7TrarA3tRccoCMxWSmsnUJGaEpvlvcVR8R1MfZE8rv b7wBH4In sdl6R6tQsXL/uH7Y5g/Oot0MIdsR/dYh0grJYSii28Q34G79k6H3MhSXQWk4hVJsEnMnof3CM1FZNlpg8zmGJKGcpkM9ajg4PNi/fN/v/J4kiYaP0E16X2H6nPnmuhTWMURkfO0JsTlTXV9bd/4JElRJQanx2vtko7XgQmHfB+6XBK9xSOi3NEdSAdVy6nleCArSYVEdKqt4WEfjcOKP0jh+7M4AFgDvp438PReGXeWUmfvcC8JZ3GO8HKyodsqotHTN5y20ZkoKjvW/YPoqOztfxITpOU4RU2ERMZHSRCa37os7Ukazn49LY6tcl0kE1FDIqMCGOzu9TJ3Sxfz0t5dqkkjAbgRmOp1LvYPLkehEenW4b2Qf2Lf97XstJNrzl31rFBqovv6hwqo0YmNUwBc98SAAG6PrjQEsy/3dSf01ttd7MZ3diVYUXEdGwQN7a1b9Zas+oT+pJO/4SYRfT5xKjpu1lwL2RTru9r8xzNVQlj1i9wI89y8I9Y2tf+xV4K40oiyJ5TTiGfv92KnDErra/bwXVoLev+4+atawv4EkbUS7PHNUheRYh2NB4/Eb8BddZ9elxs5Q1s+vzJmh/j+iAPExfZxQC8dWmxoqybzBVKlA+G2Vpbia1EW29sLxZuVmo6fnVltYqsbRsfw8t5MENKT4uISI9clmLkktUGvUx7tC4/ngPEngCt/UckZJnQ1u/ZGH9on7M5wWL2b6vo9m5tlJpkqkTPfEfu8JC3mElcbHE8wJElPLHqfQ23SfZYfVh7jGk9Hn8Je4= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: memcg->socket_pressure is initialised with jiffies when the memcg is created. Once vmpressure detects that the cgroup is under memory pressure, the field is updated with jiffies + HZ to signal the fact to the socket layer and suppress memory allocation for one second. Otherwise, the field is not updated. mem_cgroup_under_socket_pressure() uses time_before() to check if jiffies is less than memcg->socket_pressure, and this has a bug on 32-bit kernel. if (time_before(jiffies, memcg->socket_pressure)) return true; As time_before() casts the final result to long, the acceptable delta between two timestamps is 2 ^ (BITS_PER_LONG - 1). On 32-bit kernel with CONFIG_HZ=1000, this is about 24 days. >>> (2 ** 31) / 1000 / 60 / 60 / 24 24.855134814814818 Once 24 days have passed since the last update of socket_pressure, mem_cgroup_under_socket_pressure() starts to lie until the next 24 days pass. We don't need to worry about this on 64-bit machines unless they serve for 300 million years. >>> (2 ** 63) / 1000 / 60 / 60 / 24 / 365 292471208.6775361 Let's convert memcg->socket_pressure to u64. Fixes: 8e8ae645249b8 ("mm: memcontrol: hook up vmpressure to socket pressure") Reported-by: Neal Cardwell Suggested-by: Andrew Morton Signed-off-by: Kuniyuki Iwashima --- v2: No delayed work, simply make socket_pressure u64 v1: https://lore.kernel.org/all/20250716042925.106239-1-kuniyu@google.com/T/#u --- include/linux/memcontrol.h | 44 +++++++++++++++++++++++++++++++++++--- mm/memcontrol.c | 5 ++++- mm/vmpressure.c | 2 +- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 87b6688f124a7..785173aa0739c 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -251,8 +251,10 @@ struct mem_cgroup { * that this indicator should NOT be used in legacy cgroup mode * where socket memory is accounted/charged separately. */ - unsigned long socket_pressure; - + u64 socket_pressure; +#if BITS_PER_LONG < 64 + seqlock_t socket_pressure_seqlock; +#endif int kmemcg_id; /* * memcg->objcg is wiped out as a part of the objcg repaprenting @@ -1602,6 +1604,42 @@ extern struct static_key_false memcg_sockets_enabled_key; #define mem_cgroup_sockets_enabled static_branch_unlikely(&memcg_sockets_enabled_key) void mem_cgroup_sk_alloc(struct sock *sk); void mem_cgroup_sk_free(struct sock *sk); + +#if BITS_PER_LONG < 64 +static inline void mem_cgroup_set_socket_pressure(struct mem_cgroup *memcg) +{ + u64 val = get_jiffies_64() + HZ; + unsigned long flags; + + write_seqlock_irqsave(&memcg->socket_pressure_seqlock, flags); + memcg->socket_pressure = val; + write_sequnlock_irqrestore(&memcg->socket_pressure_seqlock, flags); +} + +static inline u64 mem_cgroup_get_socket_pressure(struct mem_cgroup *memcg) +{ + unsigned int seq; + u64 val; + + do { + seq = read_seqbegin(&memcg->socket_pressure_seqlock); + val = memcg->socket_pressure; + } while (read_seqretry(&memcg->socket_pressure_seqlock, seq)); + + return val; +} +#else +static inline void mem_cgroup_set_socket_pressure(struct mem_cgroup *memcg) +{ + WRITE_ONCE(memcg->socket_pressure, jiffies + HZ); +} + +static inline u64 mem_cgroup_get_socket_pressure(struct mem_cgroup *memcg) +{ + return READ_ONCE(memcg->socket_pressure); +} +#endif + static inline bool mem_cgroup_under_socket_pressure(struct mem_cgroup *memcg) { #ifdef CONFIG_MEMCG_V1 @@ -1609,7 +1647,7 @@ static inline bool mem_cgroup_under_socket_pressure(struct mem_cgroup *memcg) return !!memcg->tcpmem_pressure; #endif /* CONFIG_MEMCG_V1 */ do { - if (time_before(jiffies, READ_ONCE(memcg->socket_pressure))) + if (time_before64(get_jiffies_64(), mem_cgroup_get_socket_pressure(memcg))) return true; } while ((memcg = parent_mem_cgroup(memcg))); return false; diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 902da8a9c643a..2900594e21766 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -3757,7 +3757,10 @@ static struct mem_cgroup *mem_cgroup_alloc(struct mem_cgroup *parent) INIT_LIST_HEAD(&memcg->memory_peaks); INIT_LIST_HEAD(&memcg->swap_peaks); spin_lock_init(&memcg->peaks_lock); - memcg->socket_pressure = jiffies; + memcg->socket_pressure = get_jiffies_64(); +#if BITS_PER_LONG < 64 + seqlock_init(&memcg->socket_pressure_seqlock); +#endif memcg1_memcg_init(memcg); memcg->kmemcg_id = -1; INIT_LIST_HEAD(&memcg->objcg_list); diff --git a/mm/vmpressure.c b/mm/vmpressure.c index bd5183dfd8791..c197ed47bcc45 100644 --- a/mm/vmpressure.c +++ b/mm/vmpressure.c @@ -316,7 +316,7 @@ void vmpressure(gfp_t gfp, struct mem_cgroup *memcg, bool tree, * asserted for a second in which subsequent * pressure events can occur. */ - WRITE_ONCE(memcg->socket_pressure, jiffies + HZ); + mem_cgroup_set_socket_pressure(memcg); } } } -- 2.50.0.727.gbf7dc18ff4-goog