On 11/2/2014 3:54 PM, Richard Weinberger wrote:
Am 02.11.2014 um 14:23 schrieb Tanya Brokhman:
Okay, read-disturb will only happen if you read blocks *very* often. Do you
have numbers, datasheets, etc...?
Yes. In 0001-mtd-ubi-Read-disturb-infrastructure.patch you'll find:
#define UBI_RD_THRESHOLD 100000
Can't share more than that. This value is defined by card manufacturer and
configurable by this define.
Somehow I managed to oversee that value. It is as large as I expected.
But is is *very* sad that you can't share more details.
We'd have make this value configurable at runtime.
Other manufacturers may have other magical values...
Yea, thought of that as well while answering your email. will do. thanks!
Let's recap.
We need to address two issues:
a) If a PEB is ready very often we need to scrub it.
right. this is what the read-counter is for.
b) PEBs which are not read for a very long time need to be re-read/scrubbed to
detect bit-rot
it need to be scrubbed. this is for data retention and these pebs are found by
last_erase_timestamp. I referred to them as "pebs that are rarely accessed. "
Solving b) is easy, just re-read every PEB from time to time. No persistent
data at all is needed.
That isn't good enough. Because if we just re-read the peb we will find the
"problematic" once only when the read produces ecc errors. But if we relay on
that we may be too late
because we might hit ecc errors that we just wont be able to fix and data will
be lost. So the goal is *to prevent* ecc errors on read. That's why we need
both the read-counter
(for heavily read pebs) and the last_erase_timestamp (for once that are rarely
accessed).
To solve a) you suggest adding the read-counter to the UBI on-disk layout like
the erase-counter values.
No, not on disk layout. You're mixing the read-counter with the
last_erase_timestamp.
read-counter: maintained only at RAM, saved *only* as part of fastmap data. If
fastmap data is lost: read counters are lost too
last-erase-timestamp: part of ec_header, maintained on disk
You're right I mixed that up. Sorry.
Copy&Pasting from your other mail:
Another point:
What if we scrub every PEB once a week?
Why would that not work?
It will work but it's an overkill because we don't want to scrub (and erase)
pebs that don't need this because this way we will ware out the device in terms
on wear-leveling.
Besides, scrubbing all pebs will also be a performance hit.
A year has 52 weeks. So, in 10 (!) years we would scrub each PEB only 520 times.
Even if we scrub every day we'd only scrub each PEB 3650 times in 10 years.
I don't see any overhead at all. Of course only a stupid implementation would
scrub them at once, this would
be a performance issue.
Back to topic.
Storing the read-counters into fastmap also not a good idea because the fastmap
can get lost completely (by design).
yes,I'm aware of that. We have a default value for that case, and we're
trying to avoid fastmap being invalid...
Better store the read-counter lazily into a new internal UBI volume (use
UBI_COMPAT_PRESERVE).
not familiar with UBI_COMPAT_PRESERVE. will look into this and consider
your suggestion.
This way you can make sure that they are not lost.
I suggest the following:
a) Maintain the erase-counters in RAM
b) From time to time write them to an internal UBI volume. (e.g. at detach time
and once a day).
c) Implement a logic in UBI which scrubs a PEB if it got a lot of reads.
You could do c) even in userspace.
And for bit-rot detection you can do the same, but with timestamps instead of
read-counters...
Artem, what do you think?
Thanks,
//richard
Thanks,
Tanya Brokhman
--
Qualcomm Israel, on behalf of Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
--
To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html