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 BC1BAC7EE22 for ; Mon, 15 May 2023 06:26:40 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2373C900003; Mon, 15 May 2023 02:26:40 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 1E7CC900002; Mon, 15 May 2023 02:26:40 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0B02E900003; Mon, 15 May 2023 02:26:40 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id EF38A900002 for ; Mon, 15 May 2023 02:26:39 -0400 (EDT) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id BC6B11412DB for ; Mon, 15 May 2023 06:26:39 +0000 (UTC) X-FDA: 80791505718.16.E997D17 Received: from szxga03-in.huawei.com (szxga03-in.huawei.com [45.249.212.189]) by imf04.hostedemail.com (Postfix) with ESMTP id F073640007 for ; Mon, 15 May 2023 06:26:35 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=none; spf=pass (imf04.hostedemail.com: domain of gongruiqi1@huawei.com designates 45.249.212.189 as permitted sender) smtp.mailfrom=gongruiqi1@huawei.com; dmarc=pass (policy=quarantine) header.from=huawei.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1684131998; 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:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=nJnAtxh+M2dK8VZ1TLjKhd31KUufOlL/y9nDByIgcww=; b=Nfw+kEIQmySXF0PFosVIVhCPGZDAWMzUorE6ZAMBxKZboOELs6akLrYjyPifLOiVxLkUn4 E6IvnXFoMu724Ed8K+ABRD06aYGGNCDgvj1jFPMg2xMNXUnXOlEMr3y/n8Vau/b7DINE4n K/Wjdra43y/NU2Ykq+506fF9Rx9AwGQ= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1684131998; a=rsa-sha256; cv=none; b=cfPmh1eUk+zPeVgLehpmbtdvxhv5ThhAGDYc36GAf4bgvbokoPYSc1iM/0uiL3RwpV+H2d cHz4tBdfbThdIDyAcGPUdhHe+Lsw//Yhd1J/+SSQJPH5RvHcbcO1AuBgqvLazWXw5LXsm1 eWPH3RqOyNV1HCpI6RAdRQv7bWVRg4M= ARC-Authentication-Results: i=1; imf04.hostedemail.com; dkim=none; spf=pass (imf04.hostedemail.com: domain of gongruiqi1@huawei.com designates 45.249.212.189 as permitted sender) smtp.mailfrom=gongruiqi1@huawei.com; dmarc=pass (policy=quarantine) header.from=huawei.com Received: from dggpemm500016.china.huawei.com (unknown [172.30.72.53]) by szxga03-in.huawei.com (SkyGuard) with ESMTP id 4QKTr91CXhzLmJB; Mon, 15 May 2023 14:25:13 +0800 (CST) Received: from [10.67.110.48] (10.67.110.48) by dggpemm500016.china.huawei.com (7.185.36.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Mon, 15 May 2023 14:26:31 +0800 Message-ID: Date: Mon, 15 May 2023 14:26:31 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.10.0 Subject: Re: [PATCH RFC v2] Randomized slab caches for kmalloc() Content-Language: en-US To: Alexander Lobakin CC: , , , Hyeonggon Yoo <42.hyeyoo@gmail.com>, , Wang Weiyang , Xiu Jianfeng , Pedro Falcato , Hyeonggon Yoo <42.hyeyoo@gmail.com>, Vlastimil Babka , Christoph Lameter , David Rientjes , Roman Gushchin , Joonsoo Kim , Andrew Morton , Pekka Enberg , Kees Cook , Paul Moore , James Morris , "Serge E. Hallyn" , "Gustavo A. R. Silva" References: <20230508075507.1720950-1-gongruiqi1@huawei.com> <75179e0d-f62c-6d3c-9353-e97dd5c9d9ad@intel.com> From: Gong Ruiqi In-Reply-To: <75179e0d-f62c-6d3c-9353-e97dd5c9d9ad@intel.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.67.110.48] X-ClientProxiedBy: dggems703-chm.china.huawei.com (10.3.19.180) To dggpemm500016.china.huawei.com (7.185.36.25) X-CFilter-Loop: Reflected X-Rspamd-Queue-Id: F073640007 X-Stat-Signature: up4e1hawdc3yup4bqcj8fp1kpn1b9kad X-Rspam-User: X-Rspamd-Server: rspam09 X-HE-Tag: 1684131995-348792 X-HE-Meta: U2FsdGVkX1/F/Ntf5b5vpXPu3q9CLY8W76sheoyHidX121Rc31cCxxHnftBbjbSYTkTJqt6nmlCGBrRx/w3Zdj6YUr++wgzwQtOYSBEuspHAeyKiQAmlbN/NYwF7hSDqHgTzXaWmdiika8L+rckzb/gRTbDHNFwQ0x2Ud4An7lY8sTBx7Y4zGtexJR8+SUEj7D/qgCbc21m9xeOd/JEh/o27S265THcPCkVmHb/KX6kbUjZDxEO+kWQLJUGhDHddmtNv3DxH/I39tdWNojmaWG19ZWqFbEqnL6pmdroonIUQZ5uvmPB/L2OQACFbOUC3gjWFGS0fRfkmPxSkkIQLF/9jX9/IP7G9nxyKi+xbt0G8DvmPALIw68ekucWBMMa+VFklczgTmy2+KHmneA08A+27H5QUWH0ITTsvOwgYBj0nogPXpxX0YE2sXyp4utVzs4VmzuQgYxxOVw39Wrc5oYtoJYwMJLVSzSA0E8Bv9GaEw0+oJXiOlLQnZ9TH0twOoruxi9hcUMUe5WwokrqG/JgDJbnqiapY6yZ64Baaa75S37B4RTAaMW7J3ttIuHKIBJHyMP5GhX2URnSMMNX+6Ftb1VR6C+Ee6GETXyPUB98Psdfu/TVKQh40t+6gZUQgQlrySoSl522QKUZ6eqh+FG75ZM2yjFrBsVu5FPy7RL6EV5peY3uhAcHNTrs/6dt8U7+ev98iAdDP2GFrL1qHU53V7loWQ/jveKuRWo0yEFfP/weVSwiI5FKBK3TCcKbvM/6wuZqJn8ElIs+M3yFxkGqfpcI4l7EsYy8nJSdCQJTEAytfMsyakmu/DMmRCs4fM+VDs6LbrC3xY3PO+A6zWcEJ+4OmtWpnWT3rx8HH255TwSWivDVa+hM3s4pCczQxLBnEwnTe2Jd0taqdnAVKmekaTkSDkaOV0MuKlVzTXwbbp8YLTPdfqctbG7QidEydTJro9dTHY9C7ux7XjLe aZSzgFhP esEHx1A3GAhkliN/NwvrIUbDxplJos53ScxHFqR3yqxM+XfOfIH+LxW1AGF3/KYe1dyQvCwfoHqKMpY7PrcgZLDOIGYv30EyEoj/KvLI7jwpzuwTPEau4q172Xxtozpy1aMVi0ILlZx3Rm6ytW8m+V3uYp1+bvyRnNrKf4M1ztQwk7RW4H0iS+/QAzvJl6NE9hTG1rlsQEHsk/3YDJEvB/nm6MTET/Kl0SJXg8ma5c8xEhuIoGUJ9wPhQTi45pOag2zIfelclM4mfE4qY92hAsCKgTiQuEaoIZ3CS 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: On 2023/05/11 22:54, Alexander Lobakin wrote: [...] >> @@ -777,12 +783,44 @@ EXPORT_SYMBOL(kmalloc_size_roundup); >> #define KMALLOC_RCL_NAME(sz) >> #endif >> >> +#ifdef CONFIG_RANDOM_KMALLOC_CACHES >> +#define __KMALLOC_RANDOM_CONCAT(a, b, c) a ## b ## c >> +#define KMALLOC_RANDOM_NAME(N, sz) __KMALLOC_RANDOM_CONCAT(KMALLOC_RANDOM_, N, _NAME)(sz) >> +#if CONFIG_RANDOM_KMALLOC_CACHES_BITS >= 1 >> +#define KMALLOC_RANDOM_1_NAME(sz) .name[KMALLOC_RANDOM_START + 0] = "kmalloc-random-01-" #sz, >> +#define KMALLOC_RANDOM_2_NAME(sz) KMALLOC_RANDOM_1_NAME(sz) .name[KMALLOC_RANDOM_START + 1] = "kmalloc-random-02-" #sz, >> +#endif >> +#if CONFIG_RANDOM_KMALLOC_CACHES_BITS >= 2 >> +#define KMALLOC_RANDOM_3_NAME(sz) KMALLOC_RANDOM_2_NAME(sz) .name[KMALLOC_RANDOM_START + 2] = "kmalloc-random-03-" #sz, >> +#define KMALLOC_RANDOM_4_NAME(sz) KMALLOC_RANDOM_3_NAME(sz) .name[KMALLOC_RANDOM_START + 3] = "kmalloc-random-04-" #sz, >> +#endif >> +#if CONFIG_RANDOM_KMALLOC_CACHES_BITS >= 3 >> +#define KMALLOC_RANDOM_5_NAME(sz) KMALLOC_RANDOM_4_NAME(sz) .name[KMALLOC_RANDOM_START + 4] = "kmalloc-random-05-" #sz, >> +#define KMALLOC_RANDOM_6_NAME(sz) KMALLOC_RANDOM_5_NAME(sz) .name[KMALLOC_RANDOM_START + 5] = "kmalloc-random-06-" #sz, >> +#define KMALLOC_RANDOM_7_NAME(sz) KMALLOC_RANDOM_6_NAME(sz) .name[KMALLOC_RANDOM_START + 6] = "kmalloc-random-07-" #sz, >> +#define KMALLOC_RANDOM_8_NAME(sz) KMALLOC_RANDOM_7_NAME(sz) .name[KMALLOC_RANDOM_START + 7] = "kmalloc-random-08-" #sz, >> +#endif >> +#if CONFIG_RANDOM_KMALLOC_CACHES_BITS >= 4 >> +#define KMALLOC_RANDOM_9_NAME(sz) KMALLOC_RANDOM_8_NAME(sz) .name[KMALLOC_RANDOM_START + 8] = "kmalloc-random-09-" #sz, >> +#define KMALLOC_RANDOM_10_NAME(sz) KMALLOC_RANDOM_9_NAME(sz) .name[KMALLOC_RANDOM_START + 9] = "kmalloc-random-10-" #sz, >> +#define KMALLOC_RANDOM_11_NAME(sz) KMALLOC_RANDOM_10_NAME(sz) .name[KMALLOC_RANDOM_START + 10] = "kmalloc-random-11-" #sz, >> +#define KMALLOC_RANDOM_12_NAME(sz) KMALLOC_RANDOM_11_NAME(sz) .name[KMALLOC_RANDOM_START + 11] = "kmalloc-random-12-" #sz, >> +#define KMALLOC_RANDOM_13_NAME(sz) KMALLOC_RANDOM_12_NAME(sz) .name[KMALLOC_RANDOM_START + 12] = "kmalloc-random-13-" #sz, >> +#define KMALLOC_RANDOM_14_NAME(sz) KMALLOC_RANDOM_13_NAME(sz) .name[KMALLOC_RANDOM_START + 13] = "kmalloc-random-14-" #sz, >> +#define KMALLOC_RANDOM_15_NAME(sz) KMALLOC_RANDOM_14_NAME(sz) .name[KMALLOC_RANDOM_START + 14] = "kmalloc-random-15-" #sz, >> +#define KMALLOC_RANDOM_16_NAME(sz) KMALLOC_RANDOM_15_NAME(sz) .name[KMALLOC_RANDOM_START + 15] = "kmalloc-random-16-" #sz, > > This all can be compressed. Only two things are variables here, so > > #define KMALLOC_RANDOM_N_NAME(cur, prev, sz) \ > KMALLOC_RANDOM_##prev##_NAME(sz), \ > .name[KMALLOC_RANDOM_START + prev] = \ > "kmalloc-random-##cur##-" #sz > > #define KMALLOC_RANDOM_16_NAME(sz) KMALLOC_RANDOM_N_NAME(16, 15, sz) > I tried this way of implementation but it didn't work: it did not propagate from 16 to 1, but stopped in the middle. I think it's because the macro is somehow (indirectly) self-referential and the preprocessor won't expand it. Check this for more info: https://gcc.gnu.org/onlinedocs/cpp/Self-Referential-Macros.html > Also I'd rather not put commas ',' at the end of each macro, they're > usually put outside where the macro is used. It seems here we have to put commas at the end. Not only it's to align with how KMALLOC_{RCL,CGROUP,DMA}_NAME are implemented, but also otherwise the expansion of INIT_KMALLOC_INFO would in some cases be like: { .name[KMALLOC_NORMAL] = "kmalloc-" #__short_size, , // an empty entry with a comma } which would cause compilation error in kmalloc_info[]'s initialization. >> +#endif >> +#else // CONFIG_RANDOM_KMALLOC_CACHES >> +#define KMALLOC_RANDOM_NAME(N, sz) >> +#endif >> + >> #define INIT_KMALLOC_INFO(__size, __short_size) \ >> { \ >> .name[KMALLOC_NORMAL] = "kmalloc-" #__short_size, \ >> KMALLOC_RCL_NAME(__short_size) \ >> KMALLOC_CGROUP_NAME(__short_size) \ >> KMALLOC_DMA_NAME(__short_size) \ >> + KMALLOC_RANDOM_NAME(CONFIG_RANDOM_KMALLOC_CACHES_NR, __short_size) \ > > Can't those names be __initconst and here you'd just do one loop from 1 > to KMALLOC_CACHES_NR, which would assign names? I'm not sure compilers > will expand that one to a compile-time constant and assigning 69 > different string pointers per one kmalloc size is a bit of a waste to me. I'm not sure if I understand the question correctly, but I believe these names have been __initconst since kmalloc_info[] is already marked with it. Please let me know if it doesn't answer your question. >> .size = __size, \ >> } >> >> @@ -878,6 +916,11 @@ new_kmalloc_cache(int idx, enum kmalloc_cache_type type, slab_flags_t flags) >> flags |= SLAB_CACHE_DMA; >> } >> >> +#ifdef CONFIG_RANDOM_KMALLOC_CACHES >> + if (type >= KMALLOC_RANDOM_START && type <= KMALLOC_RANDOM_END) >> + flags |= SLAB_RANDOMSLAB; >> +#endif >> + >> kmalloc_caches[type][idx] = create_kmalloc_cache( >> kmalloc_info[idx].name[type], >> kmalloc_info[idx].size, flags, 0, >> @@ -904,7 +947,7 @@ void __init create_kmalloc_caches(slab_flags_t flags) >> /* >> * Including KMALLOC_CGROUP if CONFIG_MEMCG_KMEM defined >> */ >> - for (type = KMALLOC_NORMAL; type < NR_KMALLOC_TYPES; type++) { >> + for (type = KMALLOC_RANDOM_START; type < NR_KMALLOC_TYPES; type++) { > > Can't we just define something like __KMALLOC_TYPE_START at the > beginning of the enum to not search for all such places each time > something new is added? Yeah I'm okay with this. Before I apply this change I would like to know more opinions (especially from the maintainers) about it. > >> for (i = KMALLOC_SHIFT_LOW; i <= KMALLOC_SHIFT_HIGH; i++) { >> if (!kmalloc_caches[type][i]) >> new_kmalloc_cache(i, type, flags); >> @@ -922,6 +965,9 @@ void __init create_kmalloc_caches(slab_flags_t flags) >> new_kmalloc_cache(2, type, flags); >> } >> } >> +#ifdef CONFIG_RANDOM_KMALLOC_CACHES >> + random_kmalloc_seed = get_random_u64(); >> +#endif >> >> /* Kmalloc array is now usable */ >> slab_state = UP; >> @@ -957,7 +1003,7 @@ void *__do_kmalloc_node(size_t size, gfp_t flags, int node, unsigned long caller >> return ret; >> } >> >> - s = kmalloc_slab(size, flags); >> + s = kmalloc_slab(size, flags, caller); >> >> if (unlikely(ZERO_OR_NULL_PTR(s))) >> return s; > > Thanks, > Olek