All of lore.kernel.org
 help / color / mirror / Atom feed
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

  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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.