From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v2,1/2] ras: fix an off-by-one error in __find_elem() From: Borislav Petkov Message-Id: <20190420113444.GC29704@zn.tnic> Date: Sat, 20 Apr 2019 13:34:44 +0200 To: Cong Wang Cc: LKML , linux-edac@vger.kernel.org, Tony Luck , Thomas Gleixner List-ID: T24gVHVlLCBBcHIgMTYsIDIwMTkgYXQgMDQ6MTY6MDhQTSAtMDcwMCwgQ29uZyBXYW5nIHdyb3Rl Ogo+IEl0IGlzIGFjdHVhbGx5IGZhaXJseSBlYXN5Ogo+IAo+IDEpIEZpbGwgdGhlIHdob2xlIHBh Z2Ugd2l0aCBQRk4nczoKPiBmb3IgaSBpbiBgc2VxIDAgNTExYDsgZG8gZWNobyAkaSA+PiAvc3lz L2tlcm5lbC9kZWJ1Zy9yYXMvY2VjL3BmbjsgZG9uZQo+IAo+IDIpIFNldCB0aHJlc2ggdG8gMSBp biBvcmRlciB0byB0cmlnZ2VyIHRoZSBkZWxldGlvbjoKPiBlY2hvIDEgPiAvc3lzL2tlcm5lbC9k ZWJ1Zy9yYXMvY2VjL2NvdW50X3RocmVzaG9sZAo+IAo+IDMpIFJlcGVhdGVkbHkgYWRkIGFuZCBy ZW1vdmUgdGhlIGxhc3QgZWxlbWVudDoKPiBlY2hvIDUxMiA+PiAvc3lzL2tlcm5lbC9kZWJ1Zy9y YXMvY2VjL3Bmbgo+ICh1bnRpbCB5b3UgZ2V0IGEgY3Jhc2guKQoKVGhhbmtzLCBJIHdhcyBhYmxl IHRvIHJlcHJvZHVjZSB3aXRoIHRoYXQuIEJlbG93IGlzIGEgY29uZ2xvbWVyYXRlIHBhdGNoCndo aWNoIGNvbnZlcnRzIF9fZmluZF9lbGVtKCkgdG8gdXNpbmcgRG9uYWxkIEtudXRoJ3MgYmluYXJ5 IHNlYXJjaAp2ZXJzaW9uLiBJIGRvbid0IGtub3cgd2hhdCBJIHdhcyB0aGlua2luZyB0aGVuIGFu ZCB3aHkgSSBkaWRuJ3QgdXNlCml0IGZyb20gdGhlIGdldC1nby4gVGhlIHRleHRib29rIGV2ZW4g c2F5cyB0aGF0IG9uZSBjYW4gZWFzaWx5IGdldCBpdAp3cm9uZy4uLgoKQW55d2F5LCBzZWUgYmVs b3cuIEl0IGhhcyBzb21lIGRlYnVnIG91dHB1dCBmb3IgZWFzaWVyIGRlYnVnZ2luZywgdGhhdAp3 aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZpbmFsIHZlcnNpb24sIG9mIGNvdXJzZS4gV2l0aCBpdCwg dGhlIGluamVjdGlvbgpwYXR0ZXJuIGFib3ZlIHdvcmtzIGFzIGV4cGVjdGVkIGFuZCBJJ2xsIGNv bnRpbnVlIGhhbW1lcmluZyBvbiBpdCB0byBzZWUKaWYgdGhlcmUgYXJlIG1vcmUgZnVua3kgaXNz dWVzLgoKRm9yIGVhc2llciBleHBlcmltZW50aW5nLCB0aGUgd2hvbGUgYnJhbmNoIGlzIGFsc28g aGVyZToKCmh0dHBzOi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2Jw L2JwLmdpdC9sb2cvP2g9dGlwLXJhcy1jb3JlLWNlYwoKVGh4LgotLS0KRnJvbTogQm9yaXNsYXYg UGV0a292IDxicEBzdXNlLmRlPgpEYXRlOiBTYXQsIDIwIEFwciAyMDE5IDEzOjI3OjUxICswMjAw ClN1YmplY3Q6IFtQQVRDSF0gV0lQCgpTaWduZWQtb2ZmLWJ5OiBCb3Jpc2xhdiBQZXRrb3YgPGJw QHN1c2UuZGU+Ci0tLQogZHJpdmVycy9yYXMvY2VjLmMgfCA4MyArKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDYyIGluc2VydGlv bnMoKyksIDIxIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmFzL2NlYy5jIGIv ZHJpdmVycy9yYXMvY2VjLmMKaW5kZXggM2U5ZjYyYjg0Mzc4Li45NDZlNTI3NTFhZTIgMTAwNjQ0 Ci0tLSBhL2RyaXZlcnMvcmFzL2NlYy5jCisrKyBiL2RyaXZlcnMvcmFzL2NlYy5jCkBAIC0xODUs MzEgKzE4NSw0MiBAQCBzdGF0aWMgdm9pZCBjZWNfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3Qg KndvcmspCiAgKi8KIHN0YXRpYyBpbnQgX19maW5kX2VsZW0oc3RydWN0IGNlX2FycmF5ICpjYSwg dTY0IHBmbiwgdW5zaWduZWQgaW50ICp0bykKIHsKKwlpbnQgbWluID0gMCwgbWF4ID0gY2EtPm4g LSAxOwogCXU2NCB0aGlzX3BmbjsKLQlpbnQgbWluID0gMCwgbWF4ID0gY2EtPm47CiAKLQl3aGls ZSAobWluIDwgbWF4KSB7Ci0JCWludCB0bXAgPSAobWF4ICsgbWluKSA+PiAxOworCXByX2luZm8o IiVzOiBlbnRyeSAlbGx1IGluIFslZDolZF0/XG4iLCBfX2Z1bmNfXywgcGZuLCBtaW4sIG1heCk7 CiAKLQkJdGhpc19wZm4gPSBQRk4oY2EtPmFycmF5W3RtcF0pOworCXdoaWxlIChtaW4gPD0gbWF4 KSB7CisJCWludCBpID0gKG1pbiArIG1heCkgPj4gMTsKKworCQl0aGlzX3BmbiA9IFBGTihjYS0+ YXJyYXlbaV0pOworCisJCXByX2luZm8oIiVzOiAuLi4gdGhpc19wZm46ICUzbGx1LCBbJTNkOiUz ZDolM2RdXG4iLAorCQkJX19mdW5jX18sIHRoaXNfcGZuLCBtaW4sIGksIG1heCk7CiAKIAkJaWYg KHRoaXNfcGZuIDwgcGZuKQotCQkJbWluID0gdG1wICsgMTsKKwkJCW1pbiA9IGkgKyAxOwogCQll bHNlIGlmICh0aGlzX3BmbiA+IHBmbikKLQkJCW1heCA9IHRtcDsKLQkJZWxzZSB7Ci0JCQltaW4g PSB0bXA7Ci0JCQlicmVhazsKKwkJCW1heCA9IGkgLSAxOworCQllbHNlIGlmICh0aGlzX3BmbiA9 PSBwZm4pIHsKKwkJCXByX2luZm8oIiVzOiAuLiBGT1VORCBhdCAlZFxuIiwgX19mdW5jX18sIGkp OworCisJCQlpZiAodG8pCisJCQkJKnRvID0gaTsKKworCQkJcmV0dXJuIGk7CiAJCX0KIAl9CiAK LQlpZiAodG8pCi0JCSp0byA9IG1pbjsKLQotCXRoaXNfcGZuID0gUEZOKGNhLT5hcnJheVttaW5d KTsKKwkvKgorCSAqIFdoZW4gdGhlIGxvb3AgdGVybWluYXRlcyB3aXRob3V0IGZpbmRpbmcgQHBm biwgbWluIGhhcyB0aGUgaW5kZXggb2YKKwkgKiB0aGUgZWxlbWVudCBzbG90IHdoZXJlIHRoZSBu ZXcgQHBmbiBzaG91bGQgYmUgaW5zZXJ0ZWQuCisJICovCiAKLQlpZiAodGhpc19wZm4gPT0gcGZu KQotCQlyZXR1cm4gbWluOworCWlmICh0bykgeworCQkqdG8gPSBtaW47CisJCXByX2luZm8oIiVz OiBbJWQ6JWRdXG4iLCBfX2Z1bmNfXywgbWluLCBtYXgpOworCX0KIAogCXJldHVybiAtRU5PS0VZ OwogfQpAQCAtMjM0LDYgKzI0NSw4IEBAIHN0YXRpYyB2b2lkIGRlbF9lbGVtKHN0cnVjdCBjZV9h cnJheSAqY2EsIGludCBpZHgpCiAJCQkoY2EtPm4gLSAoaWR4ICsgMSkpICogc2l6ZW9mKHU2NCkp OwogCiAJY2EtPm4tLTsKKworCXByX2luZm8oIiVzOiBpZHg6ICVkLCBjYS0+bjogJWRcbiIsIF9f ZnVuY19fLCBpZHgsIGNhLT5uKTsKIH0KIAogc3RhdGljIHU2NCBkZWxfbHJ1X2VsZW1fdW5sb2Nr ZWQoc3RydWN0IGNlX2FycmF5ICpjYSkKQEAgLTI3NCwxMyArMjg3LDQzIEBAIHN0YXRpYyB1NjQg X19tYXliZV91bnVzZWQgZGVsX2xydV9lbGVtKHZvaWQpCiAJcmV0dXJuIHBmbjsKIH0KIAorc3Rh dGljIGJvb2wgc2FuaXR5X2NoZWNrKHN0cnVjdCBjZV9hcnJheSAqY2EpCit7CisJYm9vbCByZXQg PSBmYWxzZTsKKwl1NjQgcHJldiA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2Et Pm47IGkrKykgeworCQl1NjQgdGhpcyA9IFBGTihjYS0+YXJyYXlbaV0pOworCisJCWlmIChXQVJO KHByZXYgPiB0aGlzLCAicHJldjogMHglMDE2bGx4IDwtPiB0aGlzOiAweCUwMTZsbHhcbiIsIHBy ZXYsIHRoaXMpKQorCQkJcmV0ID0gdHJ1ZTsKKworCQlwcmV2ID0gdGhpczsKKwl9CisKKwlpZiAo IXJldCkKKwkJcmV0dXJuIHJldDsKKworCXByX2luZm8oIlNhbml0eSBjaGVjazpcbnsgbjogJWRc biIsIGNhLT5uKTsKKwlmb3IgKGkgPSAwOyBpIDwgY2EtPm47IGkrKykgeworCQl1NjQgdGhpcyA9 IFBGTihjYS0+YXJyYXlbaV0pOworCQlwcl9pbmZvKCIgJTAzZDogWyUwMTZsbHh8JTAzbGx4XVxu IiwgaSwgdGhpcywgRlVMTF9DT1VOVChjYS0+YXJyYXlbaV0pKTsKKwl9CisJcHJfaW5mbygifVxu Iik7CisKKwlyZXR1cm4gcmV0OworfQogCiBpbnQgY2VjX2FkZF9lbGVtKHU2NCBwZm4pCiB7CiAJ c3RydWN0IGNlX2FycmF5ICpjYSA9ICZjZV9hcnI7Ci0JdW5zaWduZWQgaW50IHRvOworCXVuc2ln bmVkIGludCB0byA9IDA7CiAJaW50IGNvdW50LCByZXQgPSAwOwogCisJcHJfaW5mbygiPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCXByX2luZm8o IiVzOiBlbnRyeSwgcGZuOiAlbGxkLCBjYS0+bjogJWRcbiIsIF9fZnVuY19fLCBwZm4sIGNhLT5u KTsKKwogCS8qCiAJICogV2UgY2FuIGJlIGNhbGxlZCB2ZXJ5IGVhcmx5IG9uIHRoZSBpZGVudGlm eV9jcHUoKSBwYXRoIHdoZXJlIHdlIGFyZQogCSAqIG5vdCBpbml0aWFsaXplZCB5ZXQuIFdlIGln bm9yZSB0aGUgZXJyb3IgZm9yIHNpbXBsaWNpdHkuCkBAIC0yOTYsNiArMzM5LDcgQEAgaW50IGNl Y19hZGRfZWxlbSh1NjQgcGZuKQogCQlXQVJOX09OKCFkZWxfbHJ1X2VsZW1fdW5sb2NrZWQoY2Ep KTsKIAogCXJldCA9IGZpbmRfZWxlbShjYSwgcGZuLCAmdG8pOworCXByX2luZm8oIiVzOiBmaW5k X2VsZW06IHJldDogJWQ6IHRvOiAlZFxuIiwgX19mdW5jX18sIHJldCwgdG8pOwogCWlmIChyZXQg PCAwKSB7CiAJCS8qCiAJCSAqIFNoaWZ0IHJhbmdlIFt0by1lbmRdIHRvIG1ha2Ugcm9vbSBmb3Ig b25lIG1vcmUgZWxlbWVudC4KQEAgLTM1MCw2ICszOTQsOCBAQCBpbnQgY2VjX2FkZF9lbGVtKHU2 NCBwZm4pCiAJaWYgKGNhLT5kZWNheV9jb3VudCA+PSBDTEVBTl9FTEVNUykKIAkJZG9fc3ByaW5n X2NsZWFuaW5nKGNhKTsKIAorCVdBUk5fT05fT05DRShzYW5pdHlfY2hlY2soY2EpKTsKKwogdW5s b2NrOgogCW11dGV4X3VubG9jaygmY2VfbXV0ZXgpOwogCkBAIC00MDcsNyArNDUzLDYgQEAgREVG SU5FX0RFQlVHRlNfQVRUUklCVVRFKGNvdW50X3RocmVzaG9sZF9vcHMsIHBmbl9nZXQsIGNvdW50 X3RocmVzaG9sZF9zZXQsICIlbGwKIHN0YXRpYyBpbnQgYXJyYXlfZHVtcChzdHJ1Y3Qgc2VxX2Zp bGUgKm0sIHZvaWQgKnYpCiB7CiAJc3RydWN0IGNlX2FycmF5ICpjYSA9ICZjZV9hcnI7Ci0JdTY0 IHByZXYgPSAwOwogCWludCBpOwogCiAJbXV0ZXhfbG9jaygmY2VfbXV0ZXgpOwpAQCAtNDE3LDEw ICs0NjIsNiBAQCBzdGF0aWMgaW50IGFycmF5X2R1bXAoc3RydWN0IHNlcV9maWxlICptLCB2b2lk ICp2KQogCQl1NjQgdGhpcyA9IFBGTihjYS0+YXJyYXlbaV0pOwogCiAJCXNlcV9wcmludGYobSwg IiAlMDNkOiBbJTAxNmxseHwlMDNsbHhdXG4iLCBpLCB0aGlzLCBGVUxMX0NPVU5UKGNhLT5hcnJh eVtpXSkpOwotCi0JCVdBUk5fT04ocHJldiA+IHRoaXMpOwotCi0JCXByZXYgPSB0aGlzOwogCX0K IAogCXNlcV9wcmludGYobSwgIn1cbiIpOwo= 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 X-Spam-Level: X-Spam-Status: No, score=-13.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_PASS,USER_AGENT_MUTT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3B390C282DD for ; Sat, 20 Apr 2019 11:34:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 035FB20850 for ; Sat, 20 Apr 2019 11:34:53 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=alien8.de header.i=@alien8.de header.b="iFuPvSoZ" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726082AbfDTLex (ORCPT ); Sat, 20 Apr 2019 07:34:53 -0400 Received: from mail.skyhub.de ([5.9.137.197]:49102 "EHLO mail.skyhub.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726071AbfDTLex (ORCPT ); Sat, 20 Apr 2019 07:34:53 -0400 Received: from zn.tnic (p200300EC2F112E00718873C84F24A365.dip0.t-ipconnect.de [IPv6:2003:ec:2f11:2e00:7188:73c8:4f24:a365]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.skyhub.de (SuperMail on ZX Spectrum 128k) with ESMTPSA id B10521EC023E; Sat, 20 Apr 2019 13:34:50 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alien8.de; s=dkim; t=1555760090; h=from:from: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:in-reply-to:in-reply-to: references:references; bh=JfyP/Kkhj228wRApkUcncrlNU0Z4l9io7YpRHyjIx0Y=; b=iFuPvSoZTwOopoUXbtUw8LjyhnsVVU0OTc7pVbKvDhUXyhA6Y88hdW2ueerheE/3Gv16+h k/9BpAlxngF9Ue5iqG5tHl20ww1U2Rozbh/nq+ic6YLYTEby9C8pxvWpZ8o08fVYa+p8MN +ETheSmEvKlgU1iYiJNuNaYkotiiT6I= Date: Sat, 20 Apr 2019 13:34:44 +0200 From: Borislav Petkov To: Cong Wang Cc: LKML , linux-edac@vger.kernel.org, Tony Luck , Thomas Gleixner Subject: Re: [PATCH v2 1/2] ras: fix an off-by-one error in __find_elem() Message-ID: <20190420113444.GC29704@zn.tnic> References: <20190416213351.28999-1-xiyou.wangcong@gmail.com> <20190416214634.GP31772@zn.tnic> MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-edac-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-edac@vger.kernel.org Message-ID: <20190420113444.vgZXoAQa9AjddFwcbj8Fq21qSUWTF8teqF12L-DkJv0@z> On Tue, Apr 16, 2019 at 04:16:08PM -0700, Cong Wang wrote: > It is actually fairly easy: > > 1) Fill the whole page with PFN's: > for i in `seq 0 511`; do echo $i >> /sys/kernel/debug/ras/cec/pfn; done > > 2) Set thresh to 1 in order to trigger the deletion: > echo 1 > /sys/kernel/debug/ras/cec/count_threshold > > 3) Repeatedly add and remove the last element: > echo 512 >> /sys/kernel/debug/ras/cec/pfn > (until you get a crash.) Thanks, I was able to reproduce with that. Below is a conglomerate patch which converts __find_elem() to using Donald Knuth's binary search version. I don't know what I was thinking then and why I didn't use it from the get-go. The textbook even says that one can easily get it wrong... Anyway, see below. It has some debug output for easier debugging, that will be removed in the final version, of course. With it, the injection pattern above works as expected and I'll continue hammering on it to see if there are more funky issues. For easier experimenting, the whole branch is also here: https://git.kernel.org/pub/scm/linux/kernel/git/bp/bp.git/log/?h=tip-ras-core-cec Thx. --- From: Borislav Petkov Date: Sat, 20 Apr 2019 13:27:51 +0200 Subject: [PATCH] WIP Signed-off-by: Borislav Petkov --- drivers/ras/cec.c | 83 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 62 insertions(+), 21 deletions(-) diff --git a/drivers/ras/cec.c b/drivers/ras/cec.c index 3e9f62b84378..946e52751ae2 100644 --- a/drivers/ras/cec.c +++ b/drivers/ras/cec.c @@ -185,31 +185,42 @@ static void cec_work_fn(struct work_struct *work) */ static int __find_elem(struct ce_array *ca, u64 pfn, unsigned int *to) { + int min = 0, max = ca->n - 1; u64 this_pfn; - int min = 0, max = ca->n; - while (min < max) { - int tmp = (max + min) >> 1; + pr_info("%s: entry %llu in [%d:%d]?\n", __func__, pfn, min, max); - this_pfn = PFN(ca->array[tmp]); + while (min <= max) { + int i = (min + max) >> 1; + + this_pfn = PFN(ca->array[i]); + + pr_info("%s: ... this_pfn: %3llu, [%3d:%3d:%3d]\n", + __func__, this_pfn, min, i, max); if (this_pfn < pfn) - min = tmp + 1; + min = i + 1; else if (this_pfn > pfn) - max = tmp; - else { - min = tmp; - break; + max = i - 1; + else if (this_pfn == pfn) { + pr_info("%s: .. FOUND at %d\n", __func__, i); + + if (to) + *to = i; + + return i; } } - if (to) - *to = min; - - this_pfn = PFN(ca->array[min]); + /* + * When the loop terminates without finding @pfn, min has the index of + * the element slot where the new @pfn should be inserted. + */ - if (this_pfn == pfn) - return min; + if (to) { + *to = min; + pr_info("%s: [%d:%d]\n", __func__, min, max); + } return -ENOKEY; } @@ -234,6 +245,8 @@ static void del_elem(struct ce_array *ca, int idx) (ca->n - (idx + 1)) * sizeof(u64)); ca->n--; + + pr_info("%s: idx: %d, ca->n: %d\n", __func__, idx, ca->n); } static u64 del_lru_elem_unlocked(struct ce_array *ca) @@ -274,13 +287,43 @@ static u64 __maybe_unused del_lru_elem(void) return pfn; } +static bool sanity_check(struct ce_array *ca) +{ + bool ret = false; + u64 prev = 0; + int i; + + for (i = 0; i < ca->n; i++) { + u64 this = PFN(ca->array[i]); + + if (WARN(prev > this, "prev: 0x%016llx <-> this: 0x%016llx\n", prev, this)) + ret = true; + + prev = this; + } + + if (!ret) + return ret; + + pr_info("Sanity check:\n{ n: %d\n", ca->n); + for (i = 0; i < ca->n; i++) { + u64 this = PFN(ca->array[i]); + pr_info(" %03d: [%016llx|%03llx]\n", i, this, FULL_COUNT(ca->array[i])); + } + pr_info("}\n"); + + return ret; +} int cec_add_elem(u64 pfn) { struct ce_array *ca = &ce_arr; - unsigned int to; + unsigned int to = 0; int count, ret = 0; + pr_info("===============================================\n"); + pr_info("%s: entry, pfn: %lld, ca->n: %d\n", __func__, pfn, ca->n); + /* * We can be called very early on the identify_cpu() path where we are * not initialized yet. We ignore the error for simplicity. @@ -296,6 +339,7 @@ int cec_add_elem(u64 pfn) WARN_ON(!del_lru_elem_unlocked(ca)); ret = find_elem(ca, pfn, &to); + pr_info("%s: find_elem: ret: %d: to: %d\n", __func__, ret, to); if (ret < 0) { /* * Shift range [to-end] to make room for one more element. @@ -350,6 +394,8 @@ int cec_add_elem(u64 pfn) if (ca->decay_count >= CLEAN_ELEMS) do_spring_cleaning(ca); + WARN_ON_ONCE(sanity_check(ca)); + unlock: mutex_unlock(&ce_mutex); @@ -407,7 +453,6 @@ DEFINE_DEBUGFS_ATTRIBUTE(count_threshold_ops, pfn_get, count_threshold_set, "%ll static int array_dump(struct seq_file *m, void *v) { struct ce_array *ca = &ce_arr; - u64 prev = 0; int i; mutex_lock(&ce_mutex); @@ -417,10 +462,6 @@ static int array_dump(struct seq_file *m, void *v) u64 this = PFN(ca->array[i]); seq_printf(m, " %03d: [%016llx|%03llx]\n", i, this, FULL_COUNT(ca->array[i])); - - WARN_ON(prev > this); - - prev = this; } seq_printf(m, "}\n"); -- 2.21.0 -- Regards/Gruss, Boris. Good mailing practices for 400: avoid top-posting and trim the reply.