Hi Richard

On 10/27/2014 10:56 AM, Richard Weinberger wrote:
Tanya,

Am 27.10.2014 um 09:41 schrieb Tanya Brokhman:
So, your patch addresses the following issue:
We need to re-read a PEB after a specific time (to detect bit rot) or after N 
reads (to detect read disturb issues).
Is this correct?

Not exactly... We need to scrub a PEB that is being frequently read from in 
order to prevent bit-flip errors that might occur due to read-disturb

This is what I meant with "after N reads". :)


Currently users of UBI do this by having cron jobs which read the complete UBI 
volume
and then cause scrub work.
The draw back of this is that only UBI payload will be read and not all data 
like EC and VID headers.
I understand that you want to fix this issue.

Not sure I completely understand what this crons do but the last patch in the 
series does something similar.

The cron job reads the complete UBI volume. i.e. dd=/dev/ubi0_X of=/dev/null. 
It will trigger scrub work
for bit-flipping PEBs. Is the poor men variant of your feature.


According to my opinion it is not a good idea to store read counters and 
timestamps into the UBI/Fastmap on-disk layout.
Both the read counters and timestamps don't have to be exact values.

Why not? Storing last_erase_timestamp doesn't increase the memory consumption 
on NAND since I used reserved bytes in the ec_header. I agree that the RAM is 
increased but I couldn't
find any other way to have these statistics saved.
read_counters can be saved ONLY as part of fastmap unfortunately because of the 
erase-before-write limitation.

Please explain in detail why those counters have to be exact.
I was not complaining about RAM consumption. But I think we should change the 
on-disk layout only for very
serious reasons.


What about this idea?
Add a userspace interface which allows UBI to expose read counters and last 
access timestamps.

Where will you save those?

In a plain file? As I said, the counters don't have to be exact. If you lose 
one cycle, who cares....
The counters and timestamps are only a rough estimate.
i.e. the userspace daemon dumps all this informations from UBI and stores them 
to a file (or a static UBI volume).
Upon system boot it restores them.

A userspace daemon (let's name it ubihealthd) then can decide whether it is 
time to trigger a re-read of a PEB.

Not a re-read - scrub. read-disturb is fixed by erasing the PEB.

It will trigger a scrub work if bit-flipps happen. But what I was trying to 
say, this all can be done perfectly fine
in userspace.

This daemon can also store and load the timestamp values and counters from and 
to UBI. If it misses these meta data some times due to a
power cut it won't hurt.

Not sure i follow. How is this better then doing this from the kernel? you do 
have to store the timestamps and the read_counters somewhere and they are both 
updated in the ubi
layer. I must be missing something here. Could you please elaborate on your 
idea?

If it can be done in userspace, do it in userspace. We have to make sure that 
the kernel stays maintainable.
We really don't want to add new complexity which is not really needed.

We could also add another internal UBI volume which can carry these data.

I'm afraid I have to disagree with this idea. First of all having a dedicated 
volume for this data is an overkill. Its not a sufficient amount of data to 
reserve a volume for. and
what about the PEBs that belong to this volume? Taking this feature out of the 
UBI layer is just complicated, feels wrong from design perspective, and I don't 
see the benefit of
it. Basically, its very similar to the wear-leveling but for "reads" instead of 
"writes".

But adding this data to fastmap is a better idea? fastmap is also just another 
internal volume.


All in all, I like the idea but changing/extending the on-disk layout is 
overkill IMHO.

Why? Without addressing this issues we can't have devices with life span of 
more then ~5 years (and we need to). And this is very similar to wear-leveling 
and erase counters. So
why is read-counters and erase_timestamp is an overkill?
I'm working on your idea of changing the fastmap layout to save all the read 
disturb data at the end of it and not integrated into fastmap existing data 
structures (as is done in
this version of the code). But as I see it, fastmap has to be updates as well.

I meant that adding these data to the on-disk layout is overkill. I like your 
feature but not the part
where you extend the on-disk layout. In my opinion most of it can be done 
without storing this data into fastmap
or other UBI internal on-disk data structures.
As I said, the counters don't have to be exact. Let a daemon handle and persist 
them.

I'll try to address all you comments in one place.
You're right that the read counters don't have to be exact but they do have to reflect the real state.

Regarding your idea of saving them to a file, or somehow with userspace involved; This is doable, but such solution will depend on user space implementation: - one need to update kernel with correct read counters (saved somewhere in userspace)
- it is required on every boot.
- saving the counters back to userspace should be periodically triggered as well.
So the minimal workflow for each boot life cycle will be:
- on boot: update kernel with correct values from userspace
- kernel updates the counters on each read operation
- on powerdown: save the updated kernel counters back to userspace

The read-disturb handling is based on kernel updating and monitoring read counters. Taking this out of the kernel space will result in an incomplete and very fragile solution for the read-disturb problem since the dependency in userspace is just too big.

Another issue to consider is that each SW upgrade will result in loosing the counters saved in userspace and reset all. Otherwise, system upgrade process will also have to be updated.

The read counters are very much like the ec counters used for wear-leveling; One is updated on each erase, other on each read; One is used to handle issues caused by frequent writes (erase operations), the other handle issues caused by frequent reads. So how are the two different? Why isn't wear-leveling (and erase counters) handled by userspace? My guess that the decision to encapsulate the wear-leveling into the kernel was due to the above mentioned reasons.


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

Reply via email to