From: Troy Kisky <troy.kisky@boundarydevices.com>
To: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
Cc: linux-mtd@lists.infradead.org, David Woodhouse <dwmw2@infradead.org>
Subject: Re: [RESUBMIT] [PATCH] [MTD] NAND nand_ecc.c: rewrite for improved performance
Date: Mon, 18 Aug 2008 14:29:02 -0700 [thread overview]
Message-ID: <48A9E99E.7070302@boundarydevices.com> (raw)
In-Reply-To: <ac9c93b10808181409uca8dc59ja62f43a217f4a969@mail.gmail.com>
Frans Meulenbroeks wrote:
> 2008/8/18 Troy Kisky <troy.kisky@boundarydevices.com>:
>> Frans Meulenbroeks wrote:
>>> Yes, the NSLU2 had a filesystem that was created before the patch was applied.
>>> But actually I think the filesystem is irrelevant.
>>> I verified the proper operation by comparing the values generated by
>>> the original code with the values generated by my code over a set of
>>> input blocks.
>>> Guess there is no endianness dependency and that if the data is big
>>> endian the ecc is too.
>> Does that make logical sense to you? The correction routine
>> accesses the data as a byte and flips a bit. If it accessed it as
>> an uint32 and flipped the bit, then I can see that there would be
>> no endianness dependency. I'm not suggesting you do that, as it would be
>> incompatible with current ecc, just explaining my logic. I'd very
>> much appreciate an explanation of why I'm wrong. I would expect
>> big endian ecc to have 4 bits differences whenever the entire
>> block parity is odd. These would be the bits that select the byte
>> within the uint32.
>
> Troy, did a further investigation.
> Your explanation is correct. My test program had a flaw causing this
> case to be undetected.
> Indeed in case of odd parity the 4 bits selecting the byte are flipped
> on big endian systems.
> (little endian is ok).
I appreciate you digging into it, as I don't have a big endian system.
>
> Still looking at what the best way to fix it. In the code you posted
> before you used __cpu_to_le64s.
> Not sure why you are using the 64 variant. As it is an uint32_t, I
> would expect __cpu_to_le32s to suffice.
My bug.
>
> Then again I am not too eager to use that function as it generates
> some overhead. I'd rather use the builtin gcc macro __BIG_ENDIAN__ (in
> that case I can just use an #ifdef to distinguish the two cases and in
> case of BE no byte swapping is needed.
> What is your opinion on this?
I agree.
>
> Frans.
>
> PS: wrt the 11 bits check for the other message. Can't really envision
> why this fails, but maybe it is just too late.
> If you have an ecc and a faulty 256 byte data block that would be
> erroneously accepted by my code and that would be rightfully rejected
> by the original code, I'll be more than happy to change it.
> Performancewise the difference is very small and it is a rare
> situation anyway. The original test is definitely more rigid than just
> the nr of bits test.
>
(ignoring inversions)
Example: You have a block of all zeros.
The ecc stored in the spare bytes of this is also 0.
Now, upon reading this block of zeroes, a two bit ecc occurs. The bits that happen to be
read incorrectly are bit # 0 & bit # 0x3f of the block
The hardware calculated ecc will be
0:0 ^ 0:fff = 0:fff after bit 0
0:fff ^ 3f:fc00 = 3f:3f after bit 3f
Now, when your algorithm counts bits you get 12, and decide
it is a single bit ecc error.
The old way however will xor the high and low 12 bits 3f ^ 3f = 0, 0 != fff and
decide it is multi bit ecc error and give an error.
Note, that both approaches would have decide it was a single bit error, if the second
error wouldn't have happened.
So, try a block of zeroes and flip bits 0 and 0x3f.
Troy
next prev parent reply other threads:[~2008-08-18 21:29 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-31 8:35 [RESUBMIT] [PATCH] [MTD] NAND nand_ecc.c: rewrite for improved performance frans
2008-08-11 11:35 ` Frans Meulenbroeks
2008-08-11 16:30 ` David Woodhouse
[not found] ` <ac9c93b10808120153m7435424ci3e49a70d3599cc06@mail.gmail.com>
[not found] ` <1218535872.2977.133.camel@pmac.infradead.org>
2008-08-14 18:07 ` frans
2008-08-14 19:10 ` Troy Kisky
2008-08-15 8:41 ` Frans Meulenbroeks
2008-08-15 8:46 ` David Woodhouse
2008-08-15 9:23 ` Frans Meulenbroeks
2008-08-15 9:41 ` David Woodhouse
2008-08-15 10:04 ` Frans Meulenbroeks
2008-08-15 10:12 ` David Woodhouse
2008-08-15 18:56 ` Troy Kisky
2008-08-15 21:14 ` frans
2008-08-16 10:04 ` David Woodhouse
2008-08-17 21:09 ` Troy Kisky
2008-08-18 6:33 ` Frans Meulenbroeks
2008-08-18 17:20 ` Troy Kisky
2008-08-18 21:09 ` Frans Meulenbroeks
2008-08-18 21:29 ` Troy Kisky [this message]
2008-08-18 21:31 ` David Woodhouse
2008-08-18 22:14 ` Troy Kisky
2008-08-18 22:10 ` Troy Kisky
2008-08-19 6:00 ` Frans Meulenbroeks
2008-08-17 23:30 ` Troy Kisky
2008-08-18 6:40 ` Frans Meulenbroeks
2008-08-18 17:08 ` Troy Kisky
-- strict thread matches above, loose matches on Subject: below --
2008-07-29 17:58 Frans Meulenbroeks
2008-07-29 20:04 ` Ricard Wanderlof
2008-07-30 6:17 ` Artem Bityutskiy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=48A9E99E.7070302@boundarydevices.com \
--to=troy.kisky@boundarydevices.com \
--cc=dwmw2@infradead.org \
--cc=fransmeulenbroeks@gmail.com \
--cc=linux-mtd@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox