From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from SEYPR02CU001.outbound.protection.outlook.com (mail-koreacentralazon11013041.outbound.protection.outlook.com [40.107.44.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A226E4C6E; Fri, 25 Apr 2025 03:19:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.44.41 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745551195; cv=fail; b=eLbb8j/I7rkL5lxzVpLhHejnAP0HUdV+MR1cnpT8jJkW0J3OQfJ/bWNxGk53xHIBRZBIq6dQ/VCZuAqTgJnTlFuH7GHQo0/Tge7p9UN95X/2wBUnmtW/iqXjOuuWaYq7iAlvB91apofqgZPG7dPUpbDOvJiSp3rDWa0uDZoJEss= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745551195; c=relaxed/simple; bh=dKNsrXuilq7LjEC8IwZVuncWmXHcZlK2swm6Y2GlY9k=; h=From:To:Cc:Subject:Date:Message-ID:Content-Type:MIME-Version; b=uKX1/VjkRFqNNHgOk+/a8AQyLX524/XPpFXjZ04hvFk0l2ieJbTWo4QCXevcF3NSGQblVOcC42i6slmIvnQd07u4ktxUJVloVF6f72SvTHYKJA0C1nbTEF05RIHtnCuyJgDEY0gxBQ6Sr8rxHVkHNMBypx45dbG0wlHNiZqcrXw= ARC-Authentication-Results:i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=vivo.com; spf=pass smtp.mailfrom=vivo.com; dkim=pass (2048-bit key) header.d=vivo.com header.i=@vivo.com header.b=K6O59jvT; arc=fail smtp.client-ip=40.107.44.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=vivo.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=vivo.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=vivo.com header.i=@vivo.com header.b="K6O59jvT" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=LzU28olKZHHmVkW8vYxmOG0elKR8neIkrbD0mPzWWsSwvcNxloZLqir5pJH/5Ae+XgRwyF/xVr4CwsRricIHt2s9+DBngFDK2hyIlG5T67NTryA9eha82ygK6MQXoPoVydHwgG+BG/8W7jJS1BuZHkBRtKof+N+QuYgJizEGNxIjdddZcQkOJsjkXSoTp+7Yd6MK4ZPvYv/vc4ZyJNvMfMkbAX5x3xrhDMshd/WvCWxSzKd1CM8Olq5O/bLy434noabgVSicQSM37Bb1udqkasHGQyo7+QFRtcjJjxjsMkqhNqPcgMFpi8+4S1AQA1JoQ+LAoAoGv2v350Pyefsdmg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=n/zWTx3tMaYxho2wJgGhFeGo/iT1h/wvLOwV4ALqQtE=; b=QNw2nlLJKP0lvBQOH5OMiAlkco/4SG9ST2rbyzc/g2IDltPYfKay3yM1XuVy9JkoTkgFxngsM5k5PtB9ND6wDCFrJOPBUNjRPiyJ4hOvd5XEbM4O9YSfsCfRHLxg8Gz8H9lSc8+BcKXUc2bnXYd47kdbyDeI/npQ5b6jRAwtPUJ4iNkLpo2148l5F2olfFv8FxPhFKiPJ74tpHgqqs3V7aovIPLaIETUaUIY+0AcP3BsFcj+PurevmbBONAZCMN5rWHd/7dwiuUzNFmkmpRRcgD4ELJ2c5UDUYwWMog4x7JGN2cyBRhzEjft69RramdQNWxo58nW1kgJ4X3sqhOngQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=vivo.com; dmarc=pass action=none header.from=vivo.com; dkim=pass header.d=vivo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vivo.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=n/zWTx3tMaYxho2wJgGhFeGo/iT1h/wvLOwV4ALqQtE=; b=K6O59jvTDhb6Hbi8dWFIzi3qB2pr+Zt+cBUNKmehLxbLzGWm3jPuAHm6ThgZhMyWnvu8i87Hpmo1/mRbPxoEqPR2rODpITzGIWzPO3f+z2jf4BY3HGNERWnI8znrG4vkY1sdKxkQn8zzquqEcCHKBA64DOJL98wlX2AWFaPM9pRRw8WZInR/ivTH5C6CCw1d7Z1ygkf/TzENn3blQZ6QrPGOfNIj1UT46hbhd+T4k3usCnDGE2wuK8qS7Tx0p+Ypzta2XiPg+TO5izh34qnSMRzavYGqrTrixIwBlY8Mrxb444MwiQEK37XAjOIdFj6YJfSydZudh8RiXArGQLtSWQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=vivo.com; Received: from PUZPR06MB5676.apcprd06.prod.outlook.com (2603:1096:301:f8::10) by JH0PR06MB6604.apcprd06.prod.outlook.com (2603:1096:990:3f::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8655.33; Fri, 25 Apr 2025 03:19:49 +0000 Received: from PUZPR06MB5676.apcprd06.prod.outlook.com ([fe80::a00b:f422:ac44:636f]) by PUZPR06MB5676.apcprd06.prod.outlook.com ([fe80::a00b:f422:ac44:636f%6]) with mapi id 15.20.8632.036; Fri, 25 Apr 2025 03:19:48 +0000 From: Huan Yang To: Johannes Weiner , Michal Hocko , Roman Gushchin , Shakeel Butt , Muchun Song , Andrew Morton , Petr Mladek , Vlastimil Babka , Rasmus Villemoes , Francesco Valla , Raul E Rangel , "Paul E. McKenney" , Huang Shijie , Guo Weikang , "Uladzislau Rezki (Sony)" , KP Singh , cgroups@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Huan Yang Cc: opensource.kernel@vivo.com Subject: [PATCH v3 0/3] Use kmem_cache for memcg alloc Date: Fri, 25 Apr 2025 11:19:22 +0800 Message-ID: <20250425031935.76411-1-link@vivo.com> X-Mailer: git-send-email 2.48.1 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: TYWPR01CA0036.jpnprd01.prod.outlook.com (2603:1096:400:aa::23) To PUZPR06MB5676.apcprd06.prod.outlook.com (2603:1096:301:f8::10) Precedence: bulk X-Mailing-List: cgroups@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PUZPR06MB5676:EE_|JH0PR06MB6604:EE_ X-MS-Office365-Filtering-Correlation-Id: 3a3bb28e-8ace-4db2-b373-08dd83a8087b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|7416014|376014|52116014|366016|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?PAPiOvZgvTvW3Y9Qg7NP4LMytVCSIJDEe2Ci8iT8H6E20qOGvSY14bV1msrd?= =?us-ascii?Q?z83MYi510TMUgsktjafgbj14NwEwFkEUC7zP9y9TzdV5zTFEE3MwB6c7n9d4?= =?us-ascii?Q?rvs/A17CjOO3KUUJyYey33UlUkYwMu7c82BPhbHLmsOgy4Rrc20QYMdiFJa+?= =?us-ascii?Q?X/dWuUyJ1cmUG+IozZ8aiYTLrF2I+PgEZ3LU1+ugRYJPliPyVvJ9F81KiokQ?= =?us-ascii?Q?oryy0m+PopYO1yjhldtVFH2DHIs9W5Al8LgF8ZFtNP/eofaVAzDnVzzPomxu?= =?us-ascii?Q?lJde1yhdaQi4VgGu81eXUXtXFwYGGpFoUTAeFjk8GwUEGM2yD9L2YAGfnY5w?= =?us-ascii?Q?2h03zmhssGu67+UnP9FJqOQohTNLSszSC5ytjwaVIq1zMy6hj459EnDfthrH?= =?us-ascii?Q?D7H8+rC21qanxdXiNgWIS34wkg107D8KueTqR4EjKDerBu5jqVvkL3eIDYBN?= =?us-ascii?Q?FXZXarwCgmqblCtOFgSLYF8y1MROjQYaDxwL4hXku0xMuy0HZl/hq49rcAfb?= =?us-ascii?Q?VFpfIFdYrVXSMzCVblxoyFO9e29H2S75IsfVTVT9g6nVWZZw6bAEK3gHKVT3?= =?us-ascii?Q?uiqEo0ZrWj6hxuaJzZkZZAisxdi3lD2Kty+E8gY2A42rukRRrHHWGnCHWDZ9?= =?us-ascii?Q?RbKntbsml+uR/RRG+HzPbJUlj4LxdOIeDgvYoHc966lbJlLBiN1SGzTJgVYF?= =?us-ascii?Q?n3UxPpFllreEXOT0kfOjlpx0D1XEBJ6B7EquhjccxkNIFYLY5qvODa3lBeLt?= =?us-ascii?Q?PoNIGeR5sQL155KXNxA5A7UpdQQY6V0LlGPb9sX+20i0tm/7mG/VAnCZmiR6?= =?us-ascii?Q?FPwcKPQO/LJSkRB3ePo68hwJE+4W9tJL5CUZqLYgMPYIhhZ/7CKTMhZClXyP?= =?us-ascii?Q?8GlKEkHHkAh4ByolVTjh8qHOPjG0Oi3gJn0RDR4uDj0bGps+kDbVaT3bmRYO?= =?us-ascii?Q?D0EDufCEvp5pI+01piA5fTg4Ox41DXBUUAroeOwZrLq7a6nluZ5o/rPHgC5o?= =?us-ascii?Q?oihs41nTybVe6OerpFEOqnyQoMpzhI3H8TltjFlRxNFUJ6Yd6ALzvyr25Vxq?= =?us-ascii?Q?jooHQXKFHZKykFq7tkBhLB0KCw2PpIqWy1zrlgDm6/KbKFDCAioi0lTIrFaW?= =?us-ascii?Q?Mslu04DUvahHRCDC6gu93CPYQZCizUFx+xLdvUWkUc5sVHPQzriLeyTs+ngT?= =?us-ascii?Q?Mtjg3Tv64/9JwZbaerUzy5JhJERd5SKie8sOAqYj6IY+W2z5a8fzFXEzjnkg?= =?us-ascii?Q?qSyYhpkCEwfxkvtApDNVAqEl7Y0qj8m2DjC6cVLiYSvtWLfuXY9BmHyJo+2B?= =?us-ascii?Q?+q4tEj4e4ObFS9nUnL+5jZsERTaJ1iIQEWn2IaanqlT9SgPUQhUoWU0isX6X?= =?us-ascii?Q?Gh9B5m28ApSdxrjNGq8pHLFfIgvig+4tS4vgR3NjSWhFfMS3UjYmrc94M55o?= =?us-ascii?Q?PyKUkya04LaZ9OqhXFNxAUN5nmlt+adBsp3+7pQSqUopxpj4XM3gqX26l9J4?= =?us-ascii?Q?1aSuWx9Wx5I2q+unqb/MqASGWmzY+FljTvF0?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR06MB5676.apcprd06.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(7416014)(376014)(52116014)(366016)(38350700014)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Wjj8bpRqAct367crGvCR840tA3gtLR2OrtX2qPwGbUuutodXW1sJFQhBsPCP?= =?us-ascii?Q?AAsUhZ1rHT53sMvkpeP7iitjYdLI72WzuMFev7PvHxs3GYQlWpGeoU+Pgr+d?= =?us-ascii?Q?fBAcU5ryumLnUvIgRwmTJ5L98GbJHGw+V9FtL0WsEDUJjJSDWLneYJvKfjc/?= =?us-ascii?Q?z62zJ9Vu2K6XCnqF2YQvFrdGu96Yz8oevCEXc7vNtDcap0lT16c3X4QCrfWO?= =?us-ascii?Q?b6VUQGubBJ8/MD9h9sqaDmVmcjUrqoCE+AKE8iwvNKdCNHap+MNsWLkLh8zX?= =?us-ascii?Q?JUTTQRgymDuodZ1LihCq6mrJYwbtWHoL4AgGUIeyAiNWPbS9GLFphSmqdFEt?= =?us-ascii?Q?NviLbpgp7p0y89k6cA1ZdPoyDkw87frxCMoWJXH7mKj8ZYvXR1kabu+W3YdE?= =?us-ascii?Q?x9HhEYagOH+uY0VdEa38rhn1R/WG1EbAHdseqE3YHmzlN3WNuSvDjeibeo8X?= =?us-ascii?Q?39l+QAocqsxBTkQyU2LHlKq0Hk0WqKsBY9nbZn6ymPR9W08yxvHBSPQ9WVnq?= =?us-ascii?Q?AJKzhUbWGQmjidkv8rJD0GgzF+KfnO0qkVZWH3ZGCt5TnRLkOpYwipPOEAO9?= =?us-ascii?Q?aCYU7mZzCiHtEPy/oy4/fB9fWxNxX+rRCFJWalPKLBdekMVebEPwFY5cxuLU?= =?us-ascii?Q?45jX24feVeLAtLp+iXxEJESIkK73tmVysEO8oJR2GK8+Wd4zr5+BVxdBKD3W?= =?us-ascii?Q?tggDoIMoesCOtIdfn9xKL3ApMgqcNMrypeTVayJeFpoTaQG8M02zkC8iVtXM?= =?us-ascii?Q?9KYaMfFKLIBpcluriYQxYodzf5dxnaxD4gvB+CEbUKQMjZSVE7GSyO0aEBzD?= =?us-ascii?Q?W0DuQ9gxnD4Ajn1748GbP4RqnpNlbGGdwGaXVXb9LiJk/PcJyZMndp/VgXOO?= =?us-ascii?Q?ZzYP9cYe/XZ0J3pkoFJKbdkkiSeRrqrvBZffEh4y/EZz5i3R7mt7kvPtz9my?= =?us-ascii?Q?Kb5i0qUjd6z77t2fntB4IVIDzjtaVRSUjtSyys/IJMU45smOA5HEvKplH2ep?= =?us-ascii?Q?pDJzTsUL97NBP/lolIVuNW2ydjjM8wcNscZsQLtFiNkzr8ZEctdazMNU8lr5?= =?us-ascii?Q?4Z4kvcTx6Gv2QADTqdbfLodla04XORfXANg87bdbEBk5vL3Kk0keKnqH+xeb?= =?us-ascii?Q?YjNvjIaH7zIhcLB9VojU50zgmYBGzo/c6OPedPlkl1Vs/B3ro6ZJBqmalmLE?= =?us-ascii?Q?JNCd8LW6nS0czTRe8IwOXZo0BcG0PgXCry2aUX6du6n/u/VgnORVbkuAwpHM?= =?us-ascii?Q?YXurq8ZiRPluT166VAOFMTsR9C+TvGRiGSb3ItCVhxCm+MnVzQBoWhYcdlK6?= =?us-ascii?Q?g6P3czIzdXUORviFx4ZGXQ8KlA80j9GRdoBdLtnbU39bvohOkoT1Ul+2GbKf?= =?us-ascii?Q?GbNoJwr0fryqk1Urwz8X/PhLtH5oozWX1krjYxNSkbRRL3KObFAlRgR8d8gG?= =?us-ascii?Q?Uopus8w96RQbR4IjSq3fQX6hPfI1XnWWSVbxCAJbDf4K7VHJcNTF51DOjAdo?= =?us-ascii?Q?xowVx5glXMOc6LCXV6Z+zZoBPb/44HbtbGdHja95DDMTMpddwt7xe6tRqnhe?= =?us-ascii?Q?yTJghgfD/f9EdfYcfpE/yi9Cjl82Zx7oX3xkxrBv?= X-OriginatorOrg: vivo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3a3bb28e-8ace-4db2-b373-08dd83a8087b X-MS-Exchange-CrossTenant-AuthSource: PUZPR06MB5676.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Apr 2025 03:19:47.9121 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 923e42dc-48d5-4cbe-b582-1a797a6412ed X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: xyv4pZViwv+mm96bOyp5o8buFKlmRNfo3GsWSutGsjSx+qFrdswyFrU7Dl66sJKXYw/6lpol6tgJP0aMYLTgww== X-MS-Exchange-Transport-CrossTenantHeadersStamped: JH0PR06MB6604 The mem_cgroup_alloc function creates mem_cgroup struct and it's associated structures including mem_cgroup_per_node. Through detailed analysis on our test machine (Arm64, 16GB RAM, 6.6 kernel, 1 NUMA node, memcgv2 with nokmem,nosocket,cgroup_disable=pressure), we can observe the memory allocation for these structures using the following shell commands: # Enable tracing echo 1 > /sys/kernel/tracing/events/kmem/kmalloc/enable echo 1 > /sys/kernel/tracing/tracing_on cat /sys/kernel/tracing/trace_pipe | grep kmalloc | grep mem_cgroup # Trigger allocation if cgroup subtree do not enable memcg echo +memory > /sys/fs/cgroup/cgroup.subtree_control Ftrace Output: # mem_cgroup struct allocation sh-6312 [000] ..... 58015.698365: kmalloc: call_site=mem_cgroup_css_alloc+0xd8/0x5b4 ptr=000000003e4c3799 bytes_req=2312 bytes_alloc=4096 gfp_flags=GFP_KERNEL|__GFP_ZERO node=-1 accounted=false # mem_cgroup_per_node allocation sh-6312 [000] ..... 58015.698389: kmalloc: call_site=mem_cgroup_css_alloc+0x1d8/0x5b4 ptr=00000000d798700c bytes_req=2896 bytes_alloc=4096 gfp_flags=GFP_KERNEL|__GFP_ZERO node=0 accounted=false Key Observations: 1. Both structures use kmalloc with requested sizes between 2KB-4KB 2. Allocation alignment forces 4KB slab usage due to pre-defined sizes (64B, 128B,..., 2KB, 4KB, 8KB) 3. Memory waste per memcg instance: Base struct: 4096 - 2312 = 1784 bytes Per-node struct: 4096 - 2896 = 1200 bytes Total waste: 2984 bytes (1-node system) NUMA scaling: (1200 + 8) * nr_node_ids bytes So, it's a little waste. This patchset introduces dedicated kmem_cache: Patch2 - mem_cgroup kmem_cache - memcg_cachep Patch3 - mem_cgroup_per_node kmem_cache - memcg_pn_cachep The benefits of this change can be observed with the following tracing commands: # Enable tracing echo 1 > /sys/kernel/tracing/events/kmem/kmem_cache_alloc/enable echo 1 > /sys/kernel/tracing/tracing_on cat /sys/kernel/tracing/trace_pipe | grep kmem_cache_alloc | grep mem_cgroup # In another terminal: echo +memory > /sys/fs/cgroup/cgroup.subtree_control The output might now look like this: # mem_cgroup struct allocation sh-9827 [000] ..... 289.513598: kmem_cache_alloc: call_site=mem_cgroup_css_alloc+0xbc/0x5d4 ptr=00000000695c1806 bytes_req=2312 bytes_alloc=2368 gfp_flags=GFP_KERNEL|__GFP_ZERO node=-1 accounted=false # mem_cgroup_per_node allocation sh-9827 [000] ..... 289.513602: kmem_cache_alloc: call_site=mem_cgroup_css_alloc+0x1b8/0x5d4 ptr=000000002989e63a bytes_req=2896 bytes_alloc=2944 gfp_flags=GFP_KERNEL|__GFP_ZERO node=0 accounted=false This indicates that the `mem_cgroup` struct now requests 2312 bytes and is allocated 2368 bytes, while `mem_cgroup_per_node` requests 2896 bytes and is allocated 2944 bytes. The slight increase in allocated size is due to `SLAB_HWCACHE_ALIGN` in the `kmem_cache`. Without `SLAB_HWCACHE_ALIGN`, the allocation might appear as: # mem_cgroup struct allocation sh-9269 [003] ..... 80.396366: kmem_cache_alloc: call_site=mem_cgroup_css_alloc+0xbc/0x5d4 ptr=000000005b12b475 bytes_req=2312 bytes_alloc=2312 gfp_flags=GFP_KERNEL|__GFP_ZERO node=-1 accounted=false # mem_cgroup_per_node allocation sh-9269 [003] ..... 80.396411: kmem_cache_alloc: call_site=mem_cgroup_css_alloc+0x1b8/0x5d4 ptr=00000000f347adc6 bytes_req=2896 bytes_alloc=2896 gfp_flags=GFP_KERNEL|__GFP_ZERO node=0 accounted=false While the `bytes_alloc` now matches the `bytes_req`, this patchset defaults to using `SLAB_HWCACHE_ALIGN` as it is generally considered more beneficial for performance. Please let me know if there are any issues or if I've misunderstood anything. This patchset also move mem_cgroup_init ahead of cgroup_init() due to cgroup_init() will allocate root_mem_cgroup, but each initcall invoke after cgroup_init, so if each kmem_cache do not prepare, we need testing NULL before use it. ChangeLog: v2 -> v3: Move v2 patch3 ahead, reuse and move mem_cgroup_init ahead of cgroup_init. v1 -> v2: Patch1-2 simple change commit message. Patch3: Add mem_cgroup_init_early to help "memcg" prepare resources before cgroup_init(). v2: https://lore.kernel.org/all/20250424120937.96164-1-link@vivo.com/ v1: https://lore.kernel.org/all/20250423084306.65706-1-link@vivo.com/ Huan Yang (3): mm/memcg: move mem_cgroup_init() ahead of cgroup_init() mm/memcg: use kmem_cache when alloc memcg mm/memcg: use kmem_cache when alloc memcg pernode info include/linux/memcontrol.h | 3 +++ init/main.c | 2 ++ mm/memcontrol.c | 21 ++++++++++++++++----- 3 files changed, 21 insertions(+), 5 deletions(-) base-commit: 2c9c612abeb38aab0e87d48496de6fd6daafb00b -- 2.48.1