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 F21BFC3ABC9 for ; Tue, 13 May 2025 10:09:09 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3C5A26B00A7; Tue, 13 May 2025 06:08:05 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 34BDD6B00A9; Tue, 13 May 2025 06:08:05 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 15E266B00A8; Tue, 13 May 2025 06:08:05 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id E1F906B00A6 for ; Tue, 13 May 2025 06:08:04 -0400 (EDT) Received: from smtpin01.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 4C8F9E06D2 for ; Tue, 13 May 2025 10:08:06 +0000 (UTC) X-FDA: 83437458972.01.AA14610 Received: from invmail4.hynix.com (exvmail4.hynix.com [166.125.252.92]) by imf25.hostedemail.com (Postfix) with ESMTP id 69E87A0002 for ; Tue, 13 May 2025 10:08:04 +0000 (UTC) Authentication-Results: imf25.hostedemail.com; dkim=none; spf=pass (imf25.hostedemail.com: domain of byungchul@sk.com designates 166.125.252.92 as permitted sender) smtp.mailfrom=byungchul@sk.com; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1747130884; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:in-reply-to: references:references; bh=dd5R8BuO4JhB8AUVoaNcYQhboOx65pcuWXUbwS0vSVc=; b=qHaPw3v2OeeRDiO5a1SI0D7iSEyMFINwiiOqV3o+aCG8I9+p2JnyU/rymH2omiH9vByIyY lDyc3RI4QjKZPG1d0lePK5Okd5OiZ7KJTjYJWAb25T3mQrCdrHjamkUMcMtIDahwpe/ZFW ToKG8tG+6qiet1KdeJ6RFXN62U0QSZ8= ARC-Authentication-Results: i=1; imf25.hostedemail.com; dkim=none; spf=pass (imf25.hostedemail.com: domain of byungchul@sk.com designates 166.125.252.92 as permitted sender) smtp.mailfrom=byungchul@sk.com; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1747130884; a=rsa-sha256; cv=none; b=JPo1YQEdMjgKYheOHLYQjmKVeJGoFz6H5O6EqheTUvK7QWwcjp+pnF4xBbpkkjgkxbxG9S EMOy/j63FP6YbnEgisOkBX1gy1RoL/BTHAs5aC1tOJZm/WeztSr7Pk1nYwVJFl0j5KOSbh pUDFEhS0pBziZAOBnbvduqziMzpaLEo= X-AuditID: a67dfc5b-681ff7000002311f-3c-682319f0bee8 From: Byungchul Park To: linux-kernel@vger.kernel.org Cc: kernel_team@skhynix.com, torvalds@linux-foundation.org, damien.lemoal@opensource.wdc.com, linux-ide@vger.kernel.org, adilger.kernel@dilger.ca, linux-ext4@vger.kernel.org, mingo@redhat.com, peterz@infradead.org, will@kernel.org, tglx@linutronix.de, rostedt@goodmis.org, joel@joelfernandes.org, sashal@kernel.org, daniel.vetter@ffwll.ch, duyuyang@gmail.com, johannes.berg@intel.com, tj@kernel.org, tytso@mit.edu, willy@infradead.org, david@fromorbit.com, amir73il@gmail.com, gregkh@linuxfoundation.org, kernel-team@lge.com, linux-mm@kvack.org, akpm@linux-foundation.org, mhocko@kernel.org, minchan@kernel.org, hannes@cmpxchg.org, vdavydov.dev@gmail.com, sj@kernel.org, jglisse@redhat.com, dennis@kernel.org, cl@linux.com, penberg@kernel.org, rientjes@google.com, vbabka@suse.cz, ngupta@vflare.org, linux-block@vger.kernel.org, josef@toxicpanda.com, linux-fsdevel@vger.kernel.org, jack@suse.cz, jlayton@kernel.org, dan.j.williams@intel.com, hch@infradead.org, djwong@kernel.org, dri-devel@lists.freedesktop.org, rodrigosiqueiramelo@gmail.com, melissa.srw@gmail.com, hamohammed.sa@gmail.com, harry.yoo@oracle.com, chris.p.wilson@intel.com, gwan-gyeong.mun@intel.com, max.byungchul.park@gmail.com, boqun.feng@gmail.com, longman@redhat.com, yskelg@gmail.com, yunseong.kim@ericsson.com, yeoreum.yun@arm.com, netdev@vger.kernel.org, matthew.brost@intel.com, her0gyugyu@gmail.com Subject: [PATCH v15 24/43] dept: make dept able to work with an external wgen Date: Tue, 13 May 2025 19:07:11 +0900 Message-Id: <20250513100730.12664-25-byungchul@sk.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20250513100730.12664-1-byungchul@sk.com> References: <20250513100730.12664-1-byungchul@sk.com> X-Brightmail-Tracker: H4sIAAAAAAAAAzWSa0xTZxjHfd9z+p5DR+GkEnYUF7ELMbqow1TyJDrDPhhOVBITtw9OE23k bK2WiuVSMdPQUYmrQBgLosilIBYClUsxETbqEEO5BagTsSDCwNsIN1NsN6S4FTa/PPnl/8/z e748LCV3StazGl2KqNeptAoipaWzweXb3qz7VP25rWw3eN9epqG43kbAVVeLwHbHiGGqIw6e +GYQLPUNUFBY4EJQPvGMgjvOMQSO6h8IPHoRAoPeeQLdBVcIZN6sJ/Bw2o9h9Go+hlp7PIxb X9HQm1eBoXCKwI3CTBwYf2JYtNYwYM2IgsnqIgb8E9HQPTYkAcfIZ3C9dJRAq6ObBmfzJIZH vxQTGLP9I4FeZxcNvtwIcP2UI4HbcxUEpn1WCqzeeQZ+b7NgcFrCocEUEGYtvJdAZ04bhqzK RgyDw78iuHf5Dwx22xCBB94ZDE32AgreVXUgmMydZeBS9iIDN4y5CK5cukqDaXQXLP0duFzy NhqMZQ003F4eQrFfCLZSGxIezMxTgqnJILzzPiaCw2ehhZ4KXmgpesYIpnsjjGCxpwpN1VuF m61TWCj3eCWCveZHItg9+Yxgnh3Ewlx/P3NowzfSPQmiVpMm6nfsPSFVL1iOJbXHnpt7uURn oBalGQWxPKfkp3uyyQc2jlvpFSbcZt7tXqRWOIyL5JtyXknMSMpS3NBH/JOSYWRGLLuWi+fv v1710FwUX9XpwSss42L4jLLl/50b+dqGtlVPUCBfrupf9cu5XXyepZZecfLcz0H8w/du9N/C Ov5+tZvOQzILWlOD5BpdWqJKo1VuV6frNOe2nzyTaEeB77Je8B9tRh7X4XbEsUgRLOua2qSW S1RpyemJ7YhnKUWYzHg3EMkSVOnnRf2Z4/pUrZjcjiJYWvGxbKfPkCDnvlOliKdFMUnUf2gx G7Q+A+luXRt53KgdPpu/P7vz6wil7Pu4jnJXZPFu/yfPvWf9fXAxZiIpdZ89lZO3hu/bJjVN 9nXEXXt6aoYYgpvdf2UeyjvwWoXpLUdkvuPKyg17B6QxX2Xl9I62bukJrWfIRF3JwfAWMbay bqDI0/hlisHA3A0ZXzgR6jDHfPvbQrZJQSerVdFbKX2y6l/jpQvDWQMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAAzWSfUzMcRzHfb+/x05nv6XxoyWuNSaiTXw21rLZ+gnN2BhrdNOPu/WAu0qx tjvlKUqxnKe4wpXuKHeZQqSb45hE6UmiRhynrLo4PXBl/vnstfd7n9fnnw9L+JRSM1llUrKo SpInyGgJKYlenrnwx4xAxWKjRgauwaMkXCw30dBw04jAVKnF4HgcCS1DTgTDL14SoCtoQFDU 9Y6ASlsngprSgzQ0fpwCTa4+GuwFx2nIvFJOw6tvIxg6zpzCYDSvg/eGHhKe5xVj0DlouKDL xJ7xBYPbUMaAQRME3aXnGRjpCgV7ZzMF1kI7BTXtwXDuUgcN92vsJNiqujE03r1IQ6fpDwXP bU9JGMr1g4b8HApu9BbT8G3IQIDB1cfA61o9Bpt+GlRkeayHB8YoeJJTi+Hw1VsYmtruIXhw 9AMGs6mZBqvLicFiLiDgd8ljBN253xk4dMLNwAVtLoLjh86QkNURBsO/PJcLB0NBe7mChBuj zSgiXDBdMiHB6uwjhCzLPuG36w0t1AzpSeFZMS9Un3/HCFkP2hlBb04RLKXzhSv3HVgo6ndR grnsGC2Y+08xQvb3Jiz01tcz6/23SlbEiQnKVFG1KDxWohjQx+ypi0jr/TRMalD1kmzkxfLc El773kCOM83N5Vtb3cQ4+3KzeUtOD5WNJCzBNU/mWwrbUDZi2ancOv7R54ldkgviS57043GW ckt5zeVR+p8zgDdW1E54vDz5aEn9hN+HC+Pz9EYyD0n0aFIZ8lUmpSbKlQlhIep4RXqSMi1k x+5EM/L8jyFjJL8KDTZG1iGORTJv6VPHHIUPJU9VpyfWIZ4lZL5S7R1PJI2Tp+8XVbu3q1IS RHUd8mNJ2XRp1GYx1ofbJU8W40Vxj6j632LWa6YGHTCcDrd4fU2ztlUfGbRAFJ46/OjO7cqg kJiVPzUfwV2++tx196qRs30x88KqVkRleOuutWacdG6ZNXv6WHRrhsO6rGTNm4i9ge0BwWuT C1bt9AtyPuyI3rajRSpZ+nZX+Kz4ziqqJ3DDRvuCX3Fvv2z6fDDSv31At7xnS4pvkaLLFiAj 1Qp56HxCpZb/BVRCAJE7AwAA X-CFilter-Loop: Reflected X-Rspam-User: X-Rspamd-Queue-Id: 69E87A0002 X-Rspamd-Server: rspam09 X-Stat-Signature: h9mmotiwsch1d4h3tqxj3x4iyod8ra3a X-HE-Tag: 1747130884-955258 X-HE-Meta: U2FsdGVkX1+HDniZYAdTh5HwDcddj8CKzpdKlRgsmT2CVKwNeQiZjQ+umtFQNN7xDlATGGe2ZOPSnJRC+NWo5jd/Qe61jqGKy3S0P/y/7jICScbIXDPiIo3hVl2f3HoNuYlVC4+2c6Py62mzzSR4bpyqHvRssxLVAKktA0vr/sulSjkKtKZwTV5n+4QzuygnIt62GoYxms4fV4G5hMTkZ0XDyZPBIW8ysHC7N8Yf1B7Bgzfk92PonU9/mC08DEFfV8em6dUOiXJ8CTBeYMsAmpccnJmKN/5/mHuFxB8B5duRabIe/4T97AGcqLJ9zbjoKdZgUnPHqKeF4ELm47ilCNMceIzOSDD3oyycH3jZTDmR7de7MphZK2B9nk6ah3daCAVfowPAzGRogHB9+Z71Nai3WBLzW+V7UwJYtqeoOEFqow0nzmeC0WiTvpKAhUvpXGu8dSlDvNkYeDVxcGUBevAsLt8s6rgi4jeg3+3mQpYbHgTQq+jEMW+6iNasLgovSkKL1qP23joppZ/pgetuaVmeHD0nEo55nK/Rhy+SDax/yJXMR08Usz3aesF9v8t2YNEkSIn0eqChJChrq24WHkmiB9QPu7aN0SssEDzSoaK8oHJqCmWCd9Rc13UHZ02F6MG2mh/m+OYkgC0h7+K4Ei4tphOJ7dbTa2+TbNJuAZhODzg716YUUzTme4Uo7+UfoBl9sIRw59KQgXFSzEWPJZlbf9o/TvltVmYcgEo5PcRDubOd/A9Doik4kntKHaVcs+lfw+A08vJ52kMWI6GsmsMO3yEj/LRP+1VkE+/2eGe8/rghpcayxABDET8CvrdQK9f310eNWVHy1rgjN3Q47dj9hgo9b0lqRRBktHr6LpmohRxZz4biKgSyOStDUBWcE/vl4DzdVqNWKiVfDMCKWs3dohOLjoEU339y54nes+f3Bc+1v+aDIb/8cnFiq0mUrfsNv31qwlJJBCXCSwH 9X57tuNO /qIj7V19MoqwBbnKFje+o5S1a3Su0R44YXkzgFk8dIWd3RumoE7WJt7Bl1PMWxcBj5o4D 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: There is a case where the total map size of waits of a class is so large. For instance, PG_locked is the case if every struct page embeds its regular map for PG_locked. The total size for the maps will be 'the # of pages * sizeof(struct dept_map)', which is too big to accept. Keep the minimum data in the case, timestamp called 'wgen', that dept uses. Make dept able to work with the wgen instead of whole regular map. Signed-off-by: Byungchul Park --- include/linux/dept.h | 18 ++++++++++++++---- include/linux/dept_sdt.h | 6 +++--- kernel/dependency/dept.c | 30 +++++++++++++++++++++--------- 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/include/linux/dept.h b/include/linux/dept.h index 58362bd2c4ad..10536418ab41 100644 --- a/include/linux/dept.h +++ b/include/linux/dept.h @@ -371,6 +371,13 @@ struct dept_wait_hist { unsigned int ctxt_id; }; +/* + * for subsystems that requires compact use of memory e.g. struct page + */ +struct dept_ext_wgen { + unsigned int wgen; +}; + extern void dept_on(void); extern void dept_off(void); extern void dept_init(void); @@ -380,6 +387,7 @@ extern void dept_free_range(void *start, unsigned int sz); extern void dept_map_init(struct dept_map *m, struct dept_key *k, int sub_u, const char *n); extern void dept_map_reinit(struct dept_map *m, struct dept_key *k, int sub_u, const char *n); +extern void dept_ext_wgen_init(struct dept_ext_wgen *ewg); extern void dept_map_copy(struct dept_map *to, struct dept_map *from); extern void dept_wait(struct dept_map *m, unsigned long w_f, unsigned long ip, const char *w_fn, int sub_l, long timeout); extern void dept_stage_wait(struct dept_map *m, struct dept_key *k, unsigned long ip, const char *w_fn, long timeout); @@ -388,8 +396,8 @@ extern void dept_clean_stage(void); extern void dept_ttwu_stage_wait(struct task_struct *t, unsigned long ip); extern void dept_ecxt_enter(struct dept_map *m, unsigned long e_f, unsigned long ip, const char *c_fn, const char *e_fn, int sub_l); extern bool dept_ecxt_holding(struct dept_map *m, unsigned long e_f); -extern void dept_request_event(struct dept_map *m); -extern void dept_event(struct dept_map *m, unsigned long e_f, unsigned long ip, const char *e_fn); +extern void dept_request_event(struct dept_map *m, struct dept_ext_wgen *ewg); +extern void dept_event(struct dept_map *m, unsigned long e_f, unsigned long ip, const char *e_fn, struct dept_ext_wgen *ewg); extern void dept_ecxt_exit(struct dept_map *m, unsigned long e_f, unsigned long ip); extern void dept_sched_enter(void); extern void dept_sched_exit(void); @@ -416,6 +424,7 @@ extern void dept_hardirqs_off(void); #else /* !CONFIG_DEPT */ struct dept_key { }; struct dept_map { }; +struct dept_ext_wgen { }; #define DEPT_MAP_INITIALIZER(n, k) { } @@ -428,6 +437,7 @@ struct dept_map { }; #define dept_map_init(m, k, su, n) do { (void)(n); (void)(k); } while (0) #define dept_map_reinit(m, k, su, n) do { (void)(n); (void)(k); } while (0) +#define dept_ext_wgen_init(wg) do { } while (0) #define dept_map_copy(t, f) do { } while (0) #define dept_wait(m, w_f, ip, w_fn, sl, t) do { (void)(w_fn); } while (0) #define dept_stage_wait(m, k, ip, w_fn, t) do { (void)(k); (void)(w_fn); } while (0) @@ -436,8 +446,8 @@ struct dept_map { }; #define dept_ttwu_stage_wait(t, ip) do { } while (0) #define dept_ecxt_enter(m, e_f, ip, c_fn, e_fn, sl) do { (void)(c_fn); (void)(e_fn); } while (0) #define dept_ecxt_holding(m, e_f) false -#define dept_request_event(m) do { } while (0) -#define dept_event(m, e_f, ip, e_fn) do { (void)(e_fn); } while (0) +#define dept_request_event(m, wg) do { } while (0) +#define dept_event(m, e_f, ip, e_fn, wg) do { (void)(e_fn); } while (0) #define dept_ecxt_exit(m, e_f, ip) do { } while (0) #define dept_sched_enter() do { } while (0) #define dept_sched_exit() do { } while (0) diff --git a/include/linux/dept_sdt.h b/include/linux/dept_sdt.h index b92bc8c988c9..b7b0f358646f 100644 --- a/include/linux/dept_sdt.h +++ b/include/linux/dept_sdt.h @@ -24,7 +24,7 @@ #define sdt_wait_timeout(m, t) \ do { \ - dept_request_event(m); \ + dept_request_event(m, NULL); \ dept_wait(m, 1UL, _THIS_IP_, __func__, 0, t); \ } while (0) #define sdt_wait(m) sdt_wait_timeout(m, -1L) @@ -48,9 +48,9 @@ #define sdt_might_sleep_end() dept_clean_stage() #define sdt_ecxt_enter(m) dept_ecxt_enter(m, 1UL, _THIS_IP_, "start", "event", 0) -#define sdt_event(m) dept_event(m, 1UL, _THIS_IP_, __func__) +#define sdt_event(m) dept_event(m, 1UL, _THIS_IP_, __func__, NULL) #define sdt_ecxt_exit(m) dept_ecxt_exit(m, 1UL, _THIS_IP_) -#define sdt_request_event(m) dept_request_event(m) +#define sdt_request_event(m) dept_request_event(m, NULL) #else /* !CONFIG_DEPT */ #define sdt_map_init(m) do { } while (0) #define sdt_map_init_key(m, k) do { (void)(k); } while (0) diff --git a/kernel/dependency/dept.c b/kernel/dependency/dept.c index 75fe64f86ee5..27ca8f723ccc 100644 --- a/kernel/dependency/dept.c +++ b/kernel/dependency/dept.c @@ -2171,6 +2171,11 @@ void dept_map_reinit(struct dept_map *m, struct dept_key *k, int sub_u, } EXPORT_SYMBOL_GPL(dept_map_reinit); +void dept_ext_wgen_init(struct dept_ext_wgen *ewg) +{ + ewg->wgen = 0U; +} + void dept_map_copy(struct dept_map *to, struct dept_map *from) { if (unlikely(!dept_working())) { @@ -2356,7 +2361,7 @@ static void __dept_wait(struct dept_map *m, unsigned long w_f, */ static void __dept_event(struct dept_map *m, struct dept_map *real_m, unsigned long e_f, unsigned long ip, const char *e_fn, - bool sched_map) + bool sched_map, unsigned int wg) { struct dept_class *c; struct dept_key *k; @@ -2378,7 +2383,7 @@ static void __dept_event(struct dept_map *m, struct dept_map *real_m, c = check_new_class(&m->map_key, k, sub_id(m, e), m->name, sched_map); if (c) - do_event(m, real_m, c, READ_ONCE(m->wgen), ip, e_fn); + do_event(m, real_m, c, wg, ip, e_fn); } void dept_wait(struct dept_map *m, unsigned long w_f, @@ -2603,7 +2608,7 @@ void dept_ttwu_stage_wait(struct task_struct *requestor, unsigned long ip) if (!m.keys) goto exit; - __dept_event(&m, real_m, 1UL, ip, "try_to_wake_up", sched_map); + __dept_event(&m, real_m, 1UL, ip, "try_to_wake_up", sched_map, m.wgen); exit: dept_exit(flags); } @@ -2782,10 +2787,11 @@ bool dept_ecxt_holding(struct dept_map *m, unsigned long e_f) } EXPORT_SYMBOL_GPL(dept_ecxt_holding); -void dept_request_event(struct dept_map *m) +void dept_request_event(struct dept_map *m, struct dept_ext_wgen *ewg) { unsigned long flags; unsigned int wg; + unsigned int *wg_p; if (unlikely(!dept_working())) return; @@ -2798,18 +2804,22 @@ void dept_request_event(struct dept_map *m) */ flags = dept_enter_recursive(); + wg_p = ewg ? &ewg->wgen : &m->wgen; + wg = next_wgen(); - WRITE_ONCE(m->wgen, wg); + WRITE_ONCE(*wg_p, wg); dept_exit_recursive(flags); } EXPORT_SYMBOL_GPL(dept_request_event); void dept_event(struct dept_map *m, unsigned long e_f, - unsigned long ip, const char *e_fn) + unsigned long ip, const char *e_fn, + struct dept_ext_wgen *ewg) { struct dept_task *dt = dept_task(); unsigned long flags; + unsigned int *wg_p; if (unlikely(!dept_working())) return; @@ -2817,24 +2827,26 @@ void dept_event(struct dept_map *m, unsigned long e_f, if (m->nocheck) return; + wg_p = ewg ? &ewg->wgen : &m->wgen; + if (dt->recursive) { /* * Dept won't work with this even though an event * context has been asked. Don't make it confused at * handling the event. Disable it until the next. */ - WRITE_ONCE(m->wgen, 0U); + WRITE_ONCE(*wg_p, 0U); return; } flags = dept_enter(); - __dept_event(m, m, e_f, ip, e_fn, false); + __dept_event(m, m, e_f, ip, e_fn, false, READ_ONCE(*wg_p)); /* * Keep the map diabled until the next sleep. */ - WRITE_ONCE(m->wgen, 0U); + WRITE_ONCE(*wg_p, 0U); dept_exit(flags); } -- 2.17.1