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 D96E8C02196 for ; Thu, 6 Feb 2025 06:13:29 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6795F6B0085; Thu, 6 Feb 2025 01:13:29 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 6294C6B0088; Thu, 6 Feb 2025 01:13:29 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4F0AD6B0089; Thu, 6 Feb 2025 01:13:29 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 3176C6B0085 for ; Thu, 6 Feb 2025 01:13:29 -0500 (EST) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id D5EB51A0EAA for ; Thu, 6 Feb 2025 06:13:28 +0000 (UTC) X-FDA: 83088502896.05.72B10DA Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) by imf12.hostedemail.com (Postfix) with ESMTP id A409F40007 for ; Thu, 6 Feb 2025 06:13:23 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf12.hostedemail.com: domain of shikemeng@huaweicloud.com designates 45.249.212.56 as permitted sender) smtp.mailfrom=shikemeng@huaweicloud.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1738822407; 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=UatQGXwb6yC3qbr4rbwaRKOXrvzUdgL7dbfzQztlSrY=; b=jlk/IybOveZvX08sxyhQmJGlrh2vYqEDXXeNru3pn6Y0LTAAjwFWYU1OM5H50RznW8mKck nZpaWs0skWSLCOwvrklNY/LQaJy4FAMW1+yWbCz/1345ZwKmPEl4rq6mQ53+hl8AYmlEep fP/nQqtYNOqVzsJq6J8u2rn4svucPdo= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1738822407; a=rsa-sha256; cv=none; b=VRYGB963XSEoW1yFK7tj2+d0ZKL9cW6hQnnYhOYHv5W2TicTdF9s7DK9ctcjpgUTxTHxrf Lz2XGttzE1+OMzE64wP4S2qnTVUOeqFRZxSY2PoW5zIMl2o5nRFcZt5K/NX4R9ZjEdE94E PycxLOyAiIzhlHu3i9DEsGBKkNmTnKI= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf12.hostedemail.com: domain of shikemeng@huaweicloud.com designates 45.249.212.56 as permitted sender) smtp.mailfrom=shikemeng@huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.216]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTP id 4YpRbm3VDYz4f3jMV for ; Thu, 6 Feb 2025 14:12:52 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 9BDE61A12F9 for ; Thu, 6 Feb 2025 14:13:13 +0800 (CST) Received: from [10.174.178.129] (unknown [10.174.178.129]) by APP4 (Coremail) with SMTP id gCh0CgCnCF34UqRnpFU0DA--.34331S2; Thu, 06 Feb 2025 14:13:13 +0800 (CST) Subject: Re: [PATCH v4 2/5] Xarray: move forward index correctly in xas_pause() To: Geert Uytterhoeven Cc: akpm@linux-foundation.org, willy@infradead.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, linux-nfs@vger.kernel.org, linux-m68k References: <20241218154613.58754-1-shikemeng@huaweicloud.com> <20241218154613.58754-3-shikemeng@huaweicloud.com> From: Kemeng Shi Message-ID: <82014768-2ea7-2a28-cade-99d5d8ebe59e@huaweicloud.com> Date: Thu, 6 Feb 2025 14:13:11 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.5.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-CM-TRANSID:gCh0CgCnCF34UqRnpFU0DA--.34331S2 X-Coremail-Antispam: 1UD129KBjvJXoWxJFW7Ww15Kw18XryUAF17GFg_yoWrCFWDpF WDJa4xKFW8Jr1Ikr18ta10q3409w1Yka13KrW5GF10yrsrCrnaya1jgrZ8uFyDuF4qvry2 yF4vgw1qgw4DJaDanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUkEb4IE77IF4wAFF20E14v26r4j6ryUM7CY07I20VC2zVCF04k2 6cxKx2IYs7xG6rWj6s0DM7CIcVAFz4kK6r1j6r18M28lY4IEw2IIxxk0rwA2F7IY1VAKz4 vEj48ve4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7Cj xVAFwI0_Gr1j6F4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x 0267AKxVW0oVCq3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG 6I80ewAv7VC0I7IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFV Cjc4AY6r1j6r4UM4x0Y48IcVAKI48JMxk0xIA0c2IEe2xFo4CEbIxvr21lc7CjxVAaw2AF wI0_JF0_Jw1l42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4 xG67AKxVWUJVWUGwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r1q6r43 MIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I 0E14v26r1j6r4UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVWU JVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r1j6r4UYxBIdaVFxhVjvjDU0xZFpf9x07UK2N tUUUUU= X-CM-SenderInfo: 5vklyvpphqwq5kxd4v5lfo033gof0z/ X-Rspamd-Queue-Id: A409F40007 X-Stat-Signature: pr3j4axmnxafq9qbdssnognn5heh8ynd X-Rspam-User: X-Rspamd-Server: rspam12 X-HE-Tag: 1738822403-638135 X-HE-Meta: U2FsdGVkX182rVB714ZKhHAi/AsV3X6VN6BcBNT4Lzh/olbiUyLbU80e06yA1v1yYKFoMM/zfUIk4SxyUA1Bqp5E8pDF5Q+8FyDa1Rf8i7Tuk7ArTaBLmJLNAxe1jIAJhKvPVkYMLIOEYsLlOZdKo310V/eD1f9qkmYO1w5cINspAWxBABlLtcCgUSLPkHORVYToOqiahi25e/xNrY3MLkX+rNP/N+DNlfXE5Ss+xkjGG0B5ZMEzTGXmiEp72QCpH1cM/hTgnmAUTPDY4MC7xc+uR9LmQY0ZK5JsEiAtREmk/2nWQPQFqHGbpC4IqkO0Mj+6DU7gBEDYfSYmAVn/y5r2A+M5TA5Pf7BiMkNcEbg6LWGAQ1fptBtkkWTSPOn6uMa/O6OJ81hlF7dLr58457CDEROkaOqeHLkHQWWa58U2rqzW+UPjqCcJe9VKlbQ6kHga5+LArCSdnIsSxZ5n7ydK3DFYXjzwevZVbKTGZ3NwjlB2+5+VBpap+N1DkXOSTQzFsYdxB8aDcf3xofONslxluJ9yst4B9/hdMe09+dNHEEjyO628joZ9D8/XeGrNt8V/0wfJLFOtSWcJaFIY0x5ijUjXGaKBzDJzz4iLZ6GXGsXGooTQz2NhZbrlqXmvnNWqTqmq8+mGnSLYdfNE7ZM+PCrvypphio+LoFtRWd5CJVdKr8ufS/ZioeLpHaqqXEWTIGBXhtRUy+BTHr/aki1rvUjRZqXKq6+KcrFMxMcjV6aoQpcrQNs7VsS52OqDpjayFQhqKmKelbqmzTAIatNVLoFawvk8vGYlTc8Aow1zDWIuowt2oH9IJccnmnNp5FcfA8E/e2FMTPqQoqbacMqyNIpd09mim3BOCO9m1mgvavoSql1OWkQW25lj1Vlha+TiaqlkSIHS0SYafQSMLxAcrIbqfLuOwcUKdciGCrU7A6hCxQEVNyMGEAoBJxgaf5e5Qbl5Sqe35KdOb8m lUKAw8hx xYkQ4wA6bcvbWHSbFx3uSGBd2ssWXRiToGT8/NxGOnMJIhOxqS2ZxgHQBt2AwfpwGR2qjI0jBOeq4P9osrPFljICbFyXz9chB7wB7P6oLoGEfroZqP6gFbTksovYapLvnL097Yhqm4suLrsj8peiIe9RiKYLq20VXT2QBGByTug0YAQ89sDRLIWcQyu7nzpomWRs971pyfVqY6ARjny/ec6+O4iy4Q2Uvn23eEttapj8rGL1rkvw5x2bU+Q== 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: on 1/28/2025 12:21 AM, Geert Uytterhoeven wrote: > Hi Kemeng, > > On Wed, 18 Dec 2024 at 07:58, Kemeng Shi wrote: >> After xas_load(), xas->index could point to mid of found multi-index entry >> and xas->index's bits under node->shift maybe non-zero. The afterward >> xas_pause() will move forward xas->index with xa->node->shift with bits >> under node->shift un-masked and thus skip some index unexpectedly. >> >> Consider following case: >> Assume XA_CHUNK_SHIFT is 4. >> xa_store_range(xa, 16, 31, ...) >> xa_store(xa, 32, ...) >> XA_STATE(xas, xa, 17); >> xas_for_each(&xas,...) >> xas_load(&xas) >> /* xas->index = 17, xas->xa_offset = 1, xas->xa_node->xa_shift = 4 */ >> xas_pause() >> /* xas->index = 33, xas->xa_offset = 2, xas->xa_node->xa_shift = 4 */ >> As we can see, index of 32 is skipped unexpectedly. >> >> Fix this by mask bit under node->xa_shift when move forward index in >> xas_pause(). >> >> For now, this will not cause serious problems. Only minor problem >> like cachestat return less number of page status could happen. >> >> Signed-off-by: Kemeng Shi > > Thanks for your patch, which is now commit c9ba5249ef8b080c ("Xarray: > move forward index correctly in xas_pause()") upstream. > >> --- a/lib/test_xarray.c >> +++ b/lib/test_xarray.c >> @@ -1448,6 +1448,41 @@ static noinline void check_pause(struct xarray *xa) >> XA_BUG_ON(xa, count != order_limit); >> >> xa_destroy(xa); >> + >> + index = 0; >> + for (order = XA_CHUNK_SHIFT; order > 0; order--) { >> + XA_BUG_ON(xa, xa_store_order(xa, index, order, >> + xa_mk_index(index), GFP_KERNEL)); >> + index += 1UL << order; >> + } >> + >> + index = 0; >> + count = 0; >> + xas_set(&xas, 0); >> + rcu_read_lock(); >> + xas_for_each(&xas, entry, ULONG_MAX) { >> + XA_BUG_ON(xa, entry != xa_mk_index(index)); >> + index += 1UL << (XA_CHUNK_SHIFT - count); >> + count++; >> + } >> + rcu_read_unlock(); >> + XA_BUG_ON(xa, count != XA_CHUNK_SHIFT); >> + >> + index = 0; >> + count = 0; >> + xas_set(&xas, XA_CHUNK_SIZE / 2 + 1); >> + rcu_read_lock(); >> + xas_for_each(&xas, entry, ULONG_MAX) { >> + XA_BUG_ON(xa, entry != xa_mk_index(index)); >> + index += 1UL << (XA_CHUNK_SHIFT - count); >> + count++; >> + xas_pause(&xas); >> + } >> + rcu_read_unlock(); >> + XA_BUG_ON(xa, count != XA_CHUNK_SHIFT); >> + >> + xa_destroy(xa); >> + >> } > > On m68k, the last four XA_BUG_ON() checks above are triggered when > running the test. With extra debug prints added: > > entry = 00000002 xa_mk_index(index) = 000000c1 > entry = 00000002 xa_mk_index(index) = 000000e1 > entry = 00000002 xa_mk_index(index) = 000000f1 > ... > entry = 000000e2 xa_mk_index(index) = fffff0ff > entry = 000000f9 xa_mk_index(index) = fffff8ff > entry = 000000f2 xa_mk_index(index) = fffffcff > count = 63 XA_CHUNK_SHIFT = 6 > entry = 00000081 xa_mk_index(index) = 00000001 > entry = 00000002 xa_mk_index(index) = 00000081 > entry = 00000002 xa_mk_index(index) = 000000c1 > ... > entry = 000000e2 xa_mk_index(index) = ffffe0ff > entry = 000000f9 xa_mk_index(index) = fffff0ff > entry = 000000f2 xa_mk_index(index) = fffff8ff > count = 62 XA_CHUNK_SHIFT = 6 > > On arm32, the test succeeds, so it's probably not a 32-vs-64-bit issue. > Perhaps a big-endian or alignment issue (alignof(int/long) = 2)? Hi Geert, Sorry for late reply. After check the debug info and the code, I think the test is failed because CONFIG_XARRAY_MULTI is off. I guess CONFIG_XARRAY_MULTI is on arm32 and is off on m68k so the test result diffs. Luckly it's only a problem of of test code. I will send patch to correct the test code soon. Thanks! Kemeng > >> --- a/lib/xarray.c >> +++ b/lib/xarray.c >> @@ -1147,6 +1147,7 @@ void xas_pause(struct xa_state *xas) >> if (!xa_is_sibling(xa_entry(xas->xa, node, offset))) >> break; >> } >> + xas->xa_index &= ~0UL << node->shift; >> xas->xa_index += (offset - xas->xa_offset) << node->shift; >> if (xas->xa_index == 0) >> xas->xa_node = XAS_BOUNDS; > > Gr{oetje,eeting}s, > > Geert > > -- > Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org > > In personal conversations with technical people, I call myself a hacker. But > when I'm talking to journalists I just say "programmer" or something like that. > -- Linus Torvalds >