Message ID | 20230707101057.29326-4-zhangpeng.00@bytedance.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9f45:0:b0:3ea:f831:8777 with SMTP id v5csp3166351vqx; Fri, 7 Jul 2023 03:35:20 -0700 (PDT) X-Google-Smtp-Source: APBJJlHCEbG0RsuUIMcbmwPfwvRD3YvkaLq96PBOuJWDrPHhz6einlTbbSuujl0ADIWK29v5xbUb X-Received: by 2002:a05:6a00:1409:b0:66a:613f:87e1 with SMTP id l9-20020a056a00140900b0066a613f87e1mr4608865pfu.8.1688726120256; Fri, 07 Jul 2023 03:35:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1688726120; cv=none; d=google.com; s=arc-20160816; b=pTbpjnoVFkTs3iIKrZyRl1/+W+VRuBNP+X2/mfxeCxosn8rW0y3RoiLb0y9Kb6XBfG mjx1WyHQxeQHuOSIlre8M6D6TOP2WnSIv4RzwwT8qF2uFTS/9ZZWxM0Z1HAcib21r7nr rqWxLkYmmSKcWKI2w2OMiORi+l5t6OpuZ2ZCFVl1r2nVMUc6YXUUT6M0iTh8RW2M3h4p 59zAi2aPMvPU06jZStVV7mrUnmxNhdnm6pTl8x+P8WMwzI9H9iiKOb2kiIl6Viv7lhWD IIGJtejgpRrJcq512xRzMek3NmGABnorr+wat0x/BdviXsJaccfAFdic0zJ3qx1PCRUq aLQQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=HNMajAjya5LH1cr0h8UcY7AWKYluSf3DNGPBuMzeW+I=; fh=U74fmUEemPw7sqchHJfHUOA5IBfFk+e2fZn/jtR8IqU=; b=orRCHPQHeawVGlYML6uPcq1uhnIKgFwH6b54apuD8g3z5+h5Oqi+eZxur+uV15QwP3 Ufojxsow38WhKxwx6+d10kJCy//8++KzKtsoCP5iQ/yA2nACvFRh4ta4SHXI9fOuYd0h MXwTDASLAG53K+o0uMBbKdOQy9mxqOiKsOLcaXE4VHaN9Eog7l2oz0tFQaI73NtStWuz 8mIrIIukRh+3PGqfymzRLXs6RXB7AtdrrxLu074qQK5HITreqfNHgcujiurvKIk19A79 DsTCIh5UX+JlXx6wMzxAJkuiNbX3RKwU+OIiLbfhA9r9TM7xys6uxd7yyBt9pDFjfhfW Bxew== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@bytedance.com header.s=google header.b=hOQ+fMw+; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=bytedance.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id i194-20020a636dcb000000b00552db57a742si3566880pgc.279.2023.07.07.03.35.06; Fri, 07 Jul 2023 03:35:20 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@bytedance.com header.s=google header.b=hOQ+fMw+; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=bytedance.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233023AbjGGKMM (ORCPT <rfc822;hadasmailinglist@gmail.com> + 99 others); Fri, 7 Jul 2023 06:12:12 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39612 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233005AbjGGKLq (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Fri, 7 Jul 2023 06:11:46 -0400 Received: from mail-pg1-x52e.google.com (mail-pg1-x52e.google.com [IPv6:2607:f8b0:4864:20::52e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 94848170F for <linux-kernel@vger.kernel.org>; Fri, 7 Jul 2023 03:11:21 -0700 (PDT) Received: by mail-pg1-x52e.google.com with SMTP id 41be03b00d2f7-53fa455cd94so984137a12.2 for <linux-kernel@vger.kernel.org>; Fri, 07 Jul 2023 03:11:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1688724681; x=1691316681; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=HNMajAjya5LH1cr0h8UcY7AWKYluSf3DNGPBuMzeW+I=; b=hOQ+fMw+BoiKkHf4LQFjJnXVHwgx2GGmC/dU+wccE2ou+6cHm99YqltRcJg7kqi77w zjJuucAdKRHBItZe1kbAqEj3SOEHXVqcT+vtsgJH9vPZ1sQHFHGQMUAd73UPZ+IuncE+ PxN6UdZ/JpdNDMEMv9hq8FfOUobjmEvmd0t1+SSb+rvuDL4J5mp6pm8ZeaTupFiAkyn/ 6NBrEumoORrpUSnZ6eOh0MaZQltxZBWELIm9f4h7m4hIOFxH6pHCn/DAtuZ0RgiNSFCL 6GX4aHss9kmIE3DU40cuEcPA98gWIB5scldrp5GwlCikrV/AtjDreQKvRxCIPaVcO+Zd Ssqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1688724681; x=1691316681; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=HNMajAjya5LH1cr0h8UcY7AWKYluSf3DNGPBuMzeW+I=; b=Pvdur0QhjTLBFyPVWxdsSBsY+R4pihndyxwZDiymup8hYv6u0vor3wrS/qGPsyj1ku 2rxSB5nFjTQNWQYkODJ9Rk3Tphsan17UKAyddFuXuQ0RIxl0SsY6SnlLXTW1EyoRlBTa sDDT2YEYrnRxQMGOswvpzlehncwwmtqMfktA+XkQ/u8CJlkWw3d1IFfoZkRdPxzIsH4j 2hipREMl1QVJJwZr/cELUv6/U3ZoPK8rXLvpfcEAaszOR2IRFp95v0Sg+bIOjxyKCvIV Z5GZqygWhZDcNMcJh42SC8Xf2dqIprIyuzJTtU73RFmk7imCdnGCrCYEhsW//uGJ/dj2 cPtw== X-Gm-Message-State: ABy/qLZoPM4WjUlq6tHSwjbtvIgc4V1L7AyyXxkYrmcD4eSBM+aU1AKC 0X8Kc4kNI2MGQidMWAKVPdy8UQ== X-Received: by 2002:a05:6a20:d7:b0:12d:2abd:73f4 with SMTP id 23-20020a056a2000d700b0012d2abd73f4mr3051324pzh.26.1688724681045; Fri, 07 Jul 2023 03:11:21 -0700 (PDT) Received: from GL4FX4PXWL.bytedance.net ([203.208.167.147]) by smtp.gmail.com with ESMTPSA id x11-20020a056a00270b00b0068288aaf23esm2602549pfv.100.2023.07.07.03.11.18 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 07 Jul 2023 03:11:20 -0700 (PDT) From: Peng Zhang <zhangpeng.00@bytedance.com> To: Liam.Howlett@oracle.com Cc: akpm@linux-foundation.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, maple-tree@lists.infradead.org, Peng Zhang <zhangpeng.00@bytedance.com> Subject: [RESEND PATCH 3/8] maple_tree: make mas_validate_gaps() to check metadata Date: Fri, 7 Jul 2023 18:10:52 +0800 Message-Id: <20230707101057.29326-4-zhangpeng.00@bytedance.com> X-Mailer: git-send-email 2.37.0 (Apple Git-136) In-Reply-To: <20230707101057.29326-1-zhangpeng.00@bytedance.com> References: <20230707101057.29326-1-zhangpeng.00@bytedance.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1770757680396479551?= X-GMAIL-MSGID: =?utf-8?q?1770757680396479551?= |
Series |
Improve the validation for maple tree and some cleanup
|
|
Commit Message
Peng Zhang
July 7, 2023, 10:10 a.m. UTC
Make mas_validate_gaps() check whether the offset in the metadata points
to the largest gap. By the way, simplify this function.
Signed-off-by: Peng Zhang <zhangpeng.00@bytedance.com>
---
lib/maple_tree.c | 68 +++++++++++++++++++++++-------------------------
1 file changed, 33 insertions(+), 35 deletions(-)
Comments
* Peng Zhang <zhangpeng.00@bytedance.com> [230707 06:11]: > Make mas_validate_gaps() check whether the offset in the metadata points > to the largest gap. By the way, simplify this function. > > Signed-off-by: Peng Zhang <zhangpeng.00@bytedance.com> > --- > lib/maple_tree.c | 68 +++++++++++++++++++++++------------------------- > 1 file changed, 33 insertions(+), 35 deletions(-) > > diff --git a/lib/maple_tree.c b/lib/maple_tree.c > index 6a8982146338..1fe8b6a787dd 100644 > --- a/lib/maple_tree.c > +++ b/lib/maple_tree.c > @@ -6983,15 +6983,16 @@ EXPORT_SYMBOL_GPL(mt_dump); > static void mas_validate_gaps(struct ma_state *mas) > { > struct maple_enode *mte = mas->node; > - struct maple_node *p_mn; > + struct maple_node *p_mn, *node = mte_to_node(mte); > + enum maple_type mt = mte_node_type(mas->node); > unsigned long gap = 0, max_gap = 0; > unsigned long p_end, p_start = mas->min; > - unsigned char p_slot; > + unsigned char p_slot, offset; > unsigned long *gaps = NULL; > - unsigned long *pivots = ma_pivots(mte_to_node(mte), mte_node_type(mte)); > + unsigned long *pivots = ma_pivots(node, mt); > int i; > > - if (ma_is_dense(mte_node_type(mte))) { > + if (ma_is_dense(mt)) { > for (i = 0; i < mt_slot_count(mte); i++) { > if (mas_get_slot(mas, i)) { > if (gap > max_gap) > @@ -7004,52 +7005,51 @@ static void mas_validate_gaps(struct ma_state *mas) > goto counted; > } > > - gaps = ma_gaps(mte_to_node(mte), mte_node_type(mte)); > + gaps = ma_gaps(node, mt); > for (i = 0; i < mt_slot_count(mte); i++) { > - p_end = mas_logical_pivot(mas, pivots, i, mte_node_type(mte)); > + p_end = mas_logical_pivot(mas, pivots, i, mt); > > if (!gaps) { > - if (mas_get_slot(mas, i)) { > - gap = 0; > - goto not_empty; > - } > - > - gap += p_end - p_start + 1; > + if (!mas_get_slot(mas, i)) > + gap = p_end - p_start + 1; > } else { > void *entry = mas_get_slot(mas, i); > > gap = gaps[i]; > - if (!entry) { > - if (gap != p_end - p_start + 1) { > - pr_err("%p[%u] -> %p %lu != %lu - %lu + 1\n", > - mas_mn(mas), i, > - mas_get_slot(mas, i), gap, > - p_end, p_start); > - mt_dump(mas->tree, mt_dump_hex); > - > - MT_BUG_ON(mas->tree, > - gap != p_end - p_start + 1); > - } > - } else { > - if (gap > p_end - p_start + 1) { > - pr_err("%p[%u] %lu >= %lu - %lu + 1 (%lu)\n", > - mas_mn(mas), i, gap, p_end, p_start, > - p_end - p_start + 1); > - MT_BUG_ON(mas->tree, > - gap > p_end - p_start + 1); > - } > + MT_BUG_ON(mas->tree, !entry); > + > + if (gap > p_end - p_start + 1) { > + pr_err("%p[%u] %lu >= %lu - %lu + 1 (%lu)\n", > + mas_mn(mas), i, gap, p_end, p_start, > + p_end - p_start + 1); > + MT_BUG_ON(mas->tree, > + gap > p_end - p_start + 1); Your change above points out that we are not verifying all gaps are zero in non-leaf nodes after p_end >= mas->max. If we don't have a 'no gap' indicator then this may be an issue, or maybe it already is an issue? > } > } > > if (gap > max_gap) > max_gap = gap; > -not_empty: > + > p_start = p_end + 1; > if (p_end >= mas->max) > break; > } > > counted: > + if (mt == maple_arange_64) { We could loop through the remainder of the gaps here pretty easily. > + offset = ma_meta_gap(node, mt); > + if (offset > mt_slots[mt]) { > + pr_err("gap offset %p[%u] is invalid\n", node, offset); > + MT_BUG_ON(mas->tree, 1); > + } > + > + if (gaps[offset] != max_gap) { > + pr_err("gap %p[%u] is not the largest gap %lu\n", > + node, offset, max_gap); > + MT_BUG_ON(mas->tree, 1); > + } > + } > + > if (mte_is_root(mte)) > return; > > @@ -7059,10 +7059,8 @@ static void mas_validate_gaps(struct ma_state *mas) > if (ma_gaps(p_mn, mas_parent_type(mas, mte))[p_slot] != max_gap) { > pr_err("gap %p[%u] != %lu\n", p_mn, p_slot, max_gap); > mt_dump(mas->tree, mt_dump_hex); > + MT_BUG_ON(mas->tree, 1); > } > - > - MT_BUG_ON(mas->tree, > - ma_gaps(p_mn, mas_parent_type(mas, mte))[p_slot] != max_gap); > } > > static void mas_validate_parent_slot(struct ma_state *mas) > -- > 2.20.1 > > > -- > maple-tree mailing list > maple-tree@lists.infradead.org > https://lists.infradead.org/mailman/listinfo/maple-tree
在 2023/7/7 22:45, Liam R. Howlett 写道: > * Peng Zhang <zhangpeng.00@bytedance.com> [230707 06:11]: >> Make mas_validate_gaps() check whether the offset in the metadata points >> to the largest gap. By the way, simplify this function. >> >> Signed-off-by: Peng Zhang <zhangpeng.00@bytedance.com> >> --- >> lib/maple_tree.c | 68 +++++++++++++++++++++++------------------------- >> 1 file changed, 33 insertions(+), 35 deletions(-) >> >> diff --git a/lib/maple_tree.c b/lib/maple_tree.c >> index 6a8982146338..1fe8b6a787dd 100644 >> --- a/lib/maple_tree.c >> +++ b/lib/maple_tree.c >> @@ -6983,15 +6983,16 @@ EXPORT_SYMBOL_GPL(mt_dump); >> static void mas_validate_gaps(struct ma_state *mas) >> { >> struct maple_enode *mte = mas->node; >> - struct maple_node *p_mn; >> + struct maple_node *p_mn, *node = mte_to_node(mte); >> + enum maple_type mt = mte_node_type(mas->node); >> unsigned long gap = 0, max_gap = 0; >> unsigned long p_end, p_start = mas->min; >> - unsigned char p_slot; >> + unsigned char p_slot, offset; >> unsigned long *gaps = NULL; >> - unsigned long *pivots = ma_pivots(mte_to_node(mte), mte_node_type(mte)); >> + unsigned long *pivots = ma_pivots(node, mt); >> int i; >> >> - if (ma_is_dense(mte_node_type(mte))) { >> + if (ma_is_dense(mt)) { >> for (i = 0; i < mt_slot_count(mte); i++) { >> if (mas_get_slot(mas, i)) { >> if (gap > max_gap) >> @@ -7004,52 +7005,51 @@ static void mas_validate_gaps(struct ma_state *mas) >> goto counted; >> } >> >> - gaps = ma_gaps(mte_to_node(mte), mte_node_type(mte)); >> + gaps = ma_gaps(node, mt); >> for (i = 0; i < mt_slot_count(mte); i++) { >> - p_end = mas_logical_pivot(mas, pivots, i, mte_node_type(mte)); >> + p_end = mas_logical_pivot(mas, pivots, i, mt); >> >> if (!gaps) { >> - if (mas_get_slot(mas, i)) { >> - gap = 0; >> - goto not_empty; >> - } >> - >> - gap += p_end - p_start + 1; >> + if (!mas_get_slot(mas, i)) >> + gap = p_end - p_start + 1; >> } else { >> void *entry = mas_get_slot(mas, i); >> >> gap = gaps[i]; >> - if (!entry) { >> - if (gap != p_end - p_start + 1) { >> - pr_err("%p[%u] -> %p %lu != %lu - %lu + 1\n", >> - mas_mn(mas), i, >> - mas_get_slot(mas, i), gap, >> - p_end, p_start); >> - mt_dump(mas->tree, mt_dump_hex); >> - >> - MT_BUG_ON(mas->tree, >> - gap != p_end - p_start + 1); >> - } >> - } else { >> - if (gap > p_end - p_start + 1) { >> - pr_err("%p[%u] %lu >= %lu - %lu + 1 (%lu)\n", >> - mas_mn(mas), i, gap, p_end, p_start, >> - p_end - p_start + 1); >> - MT_BUG_ON(mas->tree, >> - gap > p_end - p_start + 1); >> - } >> + MT_BUG_ON(mas->tree, !entry); >> + >> + if (gap > p_end - p_start + 1) { >> + pr_err("%p[%u] %lu >= %lu - %lu + 1 (%lu)\n", >> + mas_mn(mas), i, gap, p_end, p_start, >> + p_end - p_start + 1); >> + MT_BUG_ON(mas->tree, >> + gap > p_end - p_start + 1); > > Your change above points out that we are not verifying all gaps are zero > in non-leaf nodes after p_end >= mas->max. If we don't have a 'no gap' > indicator then this may be an issue, or maybe it already is an issue? If we don't have a 'no gap' indicator, why is there an issue? Are you worried that meta_gap is wrongly pointing to the gap after the node limit? If so we can verify that meta_gap points to a gap within the node limit. > >> } >> } >> >> if (gap > max_gap) >> max_gap = gap; >> -not_empty: >> + >> p_start = p_end + 1; >> if (p_end >= mas->max) >> break; >> } >> >> counted: >> + if (mt == maple_arange_64) { > > We could loop through the remainder of the gaps here pretty easily. In this way, it can be verified that the gaps after the node limit are 0. > >> + offset = ma_meta_gap(node, mt); >> + if (offset > mt_slots[mt]) { >> + pr_err("gap offset %p[%u] is invalid\n", node, offset); >> + MT_BUG_ON(mas->tree, 1); >> + } >> + >> + if (gaps[offset] != max_gap) { >> + pr_err("gap %p[%u] is not the largest gap %lu\n", >> + node, offset, max_gap); >> + MT_BUG_ON(mas->tree, 1); >> + } >> + } >> + >> if (mte_is_root(mte)) >> return; >> >> @@ -7059,10 +7059,8 @@ static void mas_validate_gaps(struct ma_state *mas) >> if (ma_gaps(p_mn, mas_parent_type(mas, mte))[p_slot] != max_gap) { >> pr_err("gap %p[%u] != %lu\n", p_mn, p_slot, max_gap); >> mt_dump(mas->tree, mt_dump_hex); >> + MT_BUG_ON(mas->tree, 1); >> } >> - >> - MT_BUG_ON(mas->tree, >> - ma_gaps(p_mn, mas_parent_type(mas, mte))[p_slot] != max_gap); >> } >> >> static void mas_validate_parent_slot(struct ma_state *mas) >> -- >> 2.20.1 >> >> >> -- >> maple-tree mailing list >> maple-tree@lists.infradead.org >> https://lists.infradead.org/mailman/listinfo/maple-tree
* Peng Zhang <zhangpeng.00@bytedance.com> [230710 05:44]: > > > 在 2023/7/7 22:45, Liam R. Howlett 写道: > > * Peng Zhang <zhangpeng.00@bytedance.com> [230707 06:11]: > > > Make mas_validate_gaps() check whether the offset in the metadata points > > > to the largest gap. By the way, simplify this function. > > > > > > Signed-off-by: Peng Zhang <zhangpeng.00@bytedance.com> > > > --- > > > lib/maple_tree.c | 68 +++++++++++++++++++++++------------------------- > > > 1 file changed, 33 insertions(+), 35 deletions(-) > > > > > > diff --git a/lib/maple_tree.c b/lib/maple_tree.c > > > index 6a8982146338..1fe8b6a787dd 100644 > > > --- a/lib/maple_tree.c > > > +++ b/lib/maple_tree.c > > > @@ -6983,15 +6983,16 @@ EXPORT_SYMBOL_GPL(mt_dump); > > > static void mas_validate_gaps(struct ma_state *mas) > > > { > > > struct maple_enode *mte = mas->node; > > > - struct maple_node *p_mn; > > > + struct maple_node *p_mn, *node = mte_to_node(mte); > > > + enum maple_type mt = mte_node_type(mas->node); > > > unsigned long gap = 0, max_gap = 0; > > > unsigned long p_end, p_start = mas->min; > > > - unsigned char p_slot; > > > + unsigned char p_slot, offset; > > > unsigned long *gaps = NULL; > > > - unsigned long *pivots = ma_pivots(mte_to_node(mte), mte_node_type(mte)); > > > + unsigned long *pivots = ma_pivots(node, mt); > > > int i; > > > - if (ma_is_dense(mte_node_type(mte))) { > > > + if (ma_is_dense(mt)) { > > > for (i = 0; i < mt_slot_count(mte); i++) { > > > if (mas_get_slot(mas, i)) { > > > if (gap > max_gap) > > > @@ -7004,52 +7005,51 @@ static void mas_validate_gaps(struct ma_state *mas) > > > goto counted; > > > } > > > - gaps = ma_gaps(mte_to_node(mte), mte_node_type(mte)); > > > + gaps = ma_gaps(node, mt); > > > for (i = 0; i < mt_slot_count(mte); i++) { > > > - p_end = mas_logical_pivot(mas, pivots, i, mte_node_type(mte)); > > > + p_end = mas_logical_pivot(mas, pivots, i, mt); > > > if (!gaps) { > > > - if (mas_get_slot(mas, i)) { > > > - gap = 0; > > > - goto not_empty; > > > - } > > > - > > > - gap += p_end - p_start + 1; > > > + if (!mas_get_slot(mas, i)) > > > + gap = p_end - p_start + 1; > > > } else { > > > void *entry = mas_get_slot(mas, i); > > > gap = gaps[i]; > > > - if (!entry) { > > > - if (gap != p_end - p_start + 1) { > > > - pr_err("%p[%u] -> %p %lu != %lu - %lu + 1\n", > > > - mas_mn(mas), i, > > > - mas_get_slot(mas, i), gap, > > > - p_end, p_start); > > > - mt_dump(mas->tree, mt_dump_hex); > > > - > > > - MT_BUG_ON(mas->tree, > > > - gap != p_end - p_start + 1); > > > - } > > > - } else { > > > - if (gap > p_end - p_start + 1) { > > > - pr_err("%p[%u] %lu >= %lu - %lu + 1 (%lu)\n", > > > - mas_mn(mas), i, gap, p_end, p_start, > > > - p_end - p_start + 1); > > > - MT_BUG_ON(mas->tree, > > > - gap > p_end - p_start + 1); > > > - } > > > + MT_BUG_ON(mas->tree, !entry); > > > + > > > + if (gap > p_end - p_start + 1) { > > > + pr_err("%p[%u] %lu >= %lu - %lu + 1 (%lu)\n", > > > + mas_mn(mas), i, gap, p_end, p_start, > > > + p_end - p_start + 1); > > > + MT_BUG_ON(mas->tree, > > > + gap > p_end - p_start + 1); > > > > Your change above points out that we are not verifying all gaps are zero > > in non-leaf nodes after p_end >= mas->max. If we don't have a 'no gap' > > indicator then this may be an issue, or maybe it already is an issue? > If we don't have a 'no gap' indicator, why is there an issue? Are you > worried that meta_gap is wrongly pointing to the gap after the node > limit? If so we can verify that meta_gap points to a gap within the node > limit. I'm saying we aren't checking that gaps beyond the node limit are zero. I wasn't concerned about the meta_gap pointing beyond the node limit, but it would probably be a good check too. > > > > > } > > > } > > > if (gap > max_gap) > > > max_gap = gap; > > > -not_empty: > > > + > > > p_start = p_end + 1; > > > if (p_end >= mas->max) > > > break; > > > } > > > counted: > > > + if (mt == maple_arange_64) { > > > > We could loop through the remainder of the gaps here pretty easily. > In this way, it can be verified that the gaps after the node limit are > 0. Yes, I think that's a good idea. I don't believe we have a check for this anywhere. > > > > > > + offset = ma_meta_gap(node, mt); > > > + if (offset > mt_slots[mt]) { > > > + pr_err("gap offset %p[%u] is invalid\n", node, offset); > > > + MT_BUG_ON(mas->tree, 1); > > > + } > > > + > > > + if (gaps[offset] != max_gap) { > > > + pr_err("gap %p[%u] is not the largest gap %lu\n", > > > + node, offset, max_gap); > > > + MT_BUG_ON(mas->tree, 1); > > > + } > > > + } > > > + > > > if (mte_is_root(mte)) > > > return; > > > @@ -7059,10 +7059,8 @@ static void mas_validate_gaps(struct ma_state *mas) > > > if (ma_gaps(p_mn, mas_parent_type(mas, mte))[p_slot] != max_gap) { > > > pr_err("gap %p[%u] != %lu\n", p_mn, p_slot, max_gap); > > > mt_dump(mas->tree, mt_dump_hex); > > > + MT_BUG_ON(mas->tree, 1); > > > } > > > - > > > - MT_BUG_ON(mas->tree, > > > - ma_gaps(p_mn, mas_parent_type(mas, mte))[p_slot] != max_gap); > > > } > > > static void mas_validate_parent_slot(struct ma_state *mas) > > > -- > > > 2.20.1 > > > > > > > > > -- > > > maple-tree mailing list > > > maple-tree@lists.infradead.org > > > https://lists.infradead.org/mailman/listinfo/maple-tree
diff --git a/lib/maple_tree.c b/lib/maple_tree.c index 6a8982146338..1fe8b6a787dd 100644 --- a/lib/maple_tree.c +++ b/lib/maple_tree.c @@ -6983,15 +6983,16 @@ EXPORT_SYMBOL_GPL(mt_dump); static void mas_validate_gaps(struct ma_state *mas) { struct maple_enode *mte = mas->node; - struct maple_node *p_mn; + struct maple_node *p_mn, *node = mte_to_node(mte); + enum maple_type mt = mte_node_type(mas->node); unsigned long gap = 0, max_gap = 0; unsigned long p_end, p_start = mas->min; - unsigned char p_slot; + unsigned char p_slot, offset; unsigned long *gaps = NULL; - unsigned long *pivots = ma_pivots(mte_to_node(mte), mte_node_type(mte)); + unsigned long *pivots = ma_pivots(node, mt); int i; - if (ma_is_dense(mte_node_type(mte))) { + if (ma_is_dense(mt)) { for (i = 0; i < mt_slot_count(mte); i++) { if (mas_get_slot(mas, i)) { if (gap > max_gap) @@ -7004,52 +7005,51 @@ static void mas_validate_gaps(struct ma_state *mas) goto counted; } - gaps = ma_gaps(mte_to_node(mte), mte_node_type(mte)); + gaps = ma_gaps(node, mt); for (i = 0; i < mt_slot_count(mte); i++) { - p_end = mas_logical_pivot(mas, pivots, i, mte_node_type(mte)); + p_end = mas_logical_pivot(mas, pivots, i, mt); if (!gaps) { - if (mas_get_slot(mas, i)) { - gap = 0; - goto not_empty; - } - - gap += p_end - p_start + 1; + if (!mas_get_slot(mas, i)) + gap = p_end - p_start + 1; } else { void *entry = mas_get_slot(mas, i); gap = gaps[i]; - if (!entry) { - if (gap != p_end - p_start + 1) { - pr_err("%p[%u] -> %p %lu != %lu - %lu + 1\n", - mas_mn(mas), i, - mas_get_slot(mas, i), gap, - p_end, p_start); - mt_dump(mas->tree, mt_dump_hex); - - MT_BUG_ON(mas->tree, - gap != p_end - p_start + 1); - } - } else { - if (gap > p_end - p_start + 1) { - pr_err("%p[%u] %lu >= %lu - %lu + 1 (%lu)\n", - mas_mn(mas), i, gap, p_end, p_start, - p_end - p_start + 1); - MT_BUG_ON(mas->tree, - gap > p_end - p_start + 1); - } + MT_BUG_ON(mas->tree, !entry); + + if (gap > p_end - p_start + 1) { + pr_err("%p[%u] %lu >= %lu - %lu + 1 (%lu)\n", + mas_mn(mas), i, gap, p_end, p_start, + p_end - p_start + 1); + MT_BUG_ON(mas->tree, + gap > p_end - p_start + 1); } } if (gap > max_gap) max_gap = gap; -not_empty: + p_start = p_end + 1; if (p_end >= mas->max) break; } counted: + if (mt == maple_arange_64) { + offset = ma_meta_gap(node, mt); + if (offset > mt_slots[mt]) { + pr_err("gap offset %p[%u] is invalid\n", node, offset); + MT_BUG_ON(mas->tree, 1); + } + + if (gaps[offset] != max_gap) { + pr_err("gap %p[%u] is not the largest gap %lu\n", + node, offset, max_gap); + MT_BUG_ON(mas->tree, 1); + } + } + if (mte_is_root(mte)) return; @@ -7059,10 +7059,8 @@ static void mas_validate_gaps(struct ma_state *mas) if (ma_gaps(p_mn, mas_parent_type(mas, mte))[p_slot] != max_gap) { pr_err("gap %p[%u] != %lu\n", p_mn, p_slot, max_gap); mt_dump(mas->tree, mt_dump_hex); + MT_BUG_ON(mas->tree, 1); } - - MT_BUG_ON(mas->tree, - ma_gaps(p_mn, mas_parent_type(mas, mte))[p_slot] != max_gap); } static void mas_validate_parent_slot(struct ma_state *mas)