Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 15 Mar 2017 11:51:49 -0700
From:      Mark Millard <markmi@dsl-only.net>
To:        Scott Bennett <bennett@sdf.org>
Cc:        freebsd-arm <freebsd-arm@freebsd.org>, FreeBSD Current <freebsd-current@freebsd.org>, FreeBSD-STABLE Mailing List <freebsd-stable@freebsd.org>
Subject:   Re: arm64 fork/swap data corruptions: A ~110 line C program demonstrating an example (Pine64+ 2GB context) [Corrected subject: arm64!]
Message-ID:  <FC7930F8-B9CC-429B-9618-FB50F1FE685F@dsl-only.net>
In-Reply-To: <345EE889-A429-4C13-9B08-B762DA3F4D71@dsl-only.net>
References:  <mailman.15.1489579200.37820.freebsd-stable@freebsd.org> <201703151315.v2FDFWOr028842@sdf.org> <345EE889-A429-4C13-9B08-B762DA3F4D71@dsl-only.net>

next in thread | previous in thread | raw e-mail | index | archive | help
[Something strange happened to the automatic CC: fill-in for my original
reply. Also I should have mentioned that for my test program if a
variant is made that does not fork the swapping works fine.]

On 2017-Mar-15, at 9:37 AM, Mark Millard <markmi at dsl-only.net> wrote:

> On 2017-Mar-15, at 6:15 AM, Scott Bennett <bennett at sdf.org> wrote:
>=20
>>    On Tue, 14 Mar 2017 18:18:56 -0700 Mark Millard
>> <markmi at dsl-only.net> wrote:
>>> On 2017-Mar-14, at 4:44 PM, Bernd Walter <ticso@cicely7.cicely.de> =
wrote:
>>>=20
>>>> On Tue, Mar 14, 2017 at 03:28:53PM -0700, Mark Millard wrote:
>>>>> [test_check() between the fork and the wait/sleep prevents the
>>>>> failure from occurring. Even a small access to the memory at
>>>>> that stage prevents the failure. Details follow.]
>>>>=20
>>>> Maybe a stupid question, since you might have written it somewhere.
>>>> What medium do you swap to?
>>>> I've seen broken firmware on microSD cards doing silent data
>>>> corruption for some access patterns.
>>>=20
>>> The root filesystem is on a USB SSD on a powered hub.
>>>=20
>>> Only the kernel is from the microSD card.
>>>=20
>>> I have several examples of the USB SSD model and have
>>> never observed such problems in any other context.
>>>=20
>>> [remainder of irrelevant material deleted  --SB]
>>=20
>>    You gave a very long-winded non-answer to Bernd's question, so =
I'll
>> repeat it here.  What medium do you swap to?
>=20
> My wording of:
>=20
> The root filesystem is on a USB SSD on a powered hub.
>=20
> was definitely poor. It should have explicitly mentioned the
> swap partition too:
>=20
> The root filesystem and swap partition are both on the same
> USB SSD on a powered hub.
>=20
> More detail from dmesg -a for usb:
>=20
> usbus0: 12Mbps Full Speed USB v1.0
> usbus1: 480Mbps High Speed USB v2.0
> usbus2: 12Mbps Full Speed USB v1.0
> usbus3: 480Mbps High Speed USB v2.0
> ugen0.1: <Generic OHCI root HUB> at usbus0
> uhub0: <Generic OHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on =
usbus0
> ugen1.1: <Allwinner EHCI root HUB> at usbus1
> uhub1: <Allwinner EHCI root HUB, class 9/0, rev 2.00/1.00, addr 1> on =
usbus1
> ugen2.1: <Generic OHCI root HUB> at usbus2
> uhub2: <Generic OHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on =
usbus2
> ugen3.1: <Allwinner EHCI root HUB> at usbus3
> uhub3: <Allwinner EHCI root HUB, class 9/0, rev 2.00/1.00, addr 1> on =
usbus3
> . . .
> uhub0: 1 port with 1 removable, self powered
> uhub2: 1 port with 1 removable, self powered
> uhub1: 1 port with 1 removable, self powered
> uhub3: 1 port with 1 removable, self powered
> ugen3.2: <GenesysLogic USB2.0 Hub> at usbus3
> uhub4 on uhub3
> uhub4: <GenesysLogic USB2.0 Hub, class 9/0, rev 2.00/90.20, addr 2> on =
usbus3
> uhub4: MTT enabled
> uhub4: 4 ports with 4 removable, self powered
> ugen3.3: <OWC Envoy Pro mini> at usbus3
> umass0 on uhub4
> umass0: <OWC Envoy Pro mini, class 0/0, rev 2.10/1.00, addr 3> on =
usbus3
> umass0:  SCSI over Bulk-Only; quirks =3D 0x0100
> umass0:0:0: Attached to scbus0
> . . .
> da0 at umass-sim0 bus 0 scbus0 target 0 lun 0
> da0: <OWC Envoy Pro mini 0> Fixed Direct Access SPC-4 SCSI device
> da0: Serial Number <REPLACED>
> da0: 40.000MB/s transfers
>=20
> (Edited a bit because there is other material interlaced, even
> internal to some lines. Also: I removed the serial number of the
> specific example device.)
>=20
>>    I will further note that any kind of USB device cannot =
automatically
>> be trusted to behave properly.  USB devices are notorious, for =
example,
>> for momentarily dropping off-line and then immediately reconnecting.  =
(ZFS
>> reacts very poorly to such events, BTW.)  This misbehavior can be =
caused
>> by either processor involved, i.e., the one controlling either the
>> upstream or the downstream device.  Hubs are really bad about this, =
but
>> any USB device can be guilty.  You may have a defective storage =
device,
>> its controller may be defective, or any controller in the chain all =
the
>> way back to the motherboard may be defective or, not defective, but
>> corrupted by having been connected to another device with corrupted
>> (infected) firmware that tries to flash itself into the firmware =
flash
>> chips in its potential victim.
>>    Flash memory chips, spinning disks, or {S,}{D,}RAM chips can be
>> defective.  Without parity bits, the devices may return bad data and =
lie
>> about the presence of corrupted data.  That, for example, is where =
ZFS
>> is better than any kind of classical RAID because ZFS keeps checksums =
on
>> everything, so it has a reasonable chance of detecting corruption =
even
>> without parity support and, if there is any redundancy in the pool or =
the
>> data set, fixing the bad data machine.  Even having parity generally
>> allows only the detection of single-bit errors, but not of repairing =
them.
>>    You should identify where you page/swap to and then try =
substituting
>> a different device for that function as a test to eliminate the =
possibility
>> of a bad storage device/controller.  If the problem still occurs, =
that
>> means there still remains the possibility that another controller or =
its
>> firmware is defective instead.  It could be a kernel bug, it is true, =
but
>> making sure there is no hardware or firmware error occurring is =
important,
>> and as I say, USB devices should always be considered suspect unless =
and
>> until proven innocent.
>=20
> [FYI: This is a ufs context, not a zfs one.]
>=20
> I'm aware of such  things. There is no evidence that has resulted in
> suggesting the USB devices that I can replace are a problem. Otherwise
> I'd not be going down this path. I only have access to the one arm64
> device (a Pine64+ 2GB) so I've no ability to substitution-test what
> is on that board.
>=20
> It would be neat if some folks used my code to test other arm64
> contexts and reported the results. I'd be very interested.
> (This is easier to do on devices that do not have massive
> amounts of RAM, which may limit the range of devices or
> device configurations that are reasonable to test.)
>=20
> There is that other people using other devices have reported
> the behavior that started this investigation. I can produce the
> behavior that they reported, although I've not seen anyone else
> listing specific steps that lead to the problem or ways to tell
> if the symptom is going to happen before it actually does. Nor
> have I seen any other core dump analysis. (I have bugzilla
> submittals 217138 and 217239 tied to symptoms others have
> reported as well as this test program material.)
>=20
> Also, considering that for my test program I can control which pages
> get the zeroed-problem by read-accessing even one byte of any 4K
> Byte page that I want to make work normally, doing so in the child
> process of the fork, between the fork and the sleep/swap-out, it does
> not suggest USB-device-specific behavior. The read-access is changing
> the status of the page in some way as far as I can tell.
>=20
> (Such read-accesses in the parent process make no difference to the
> behavior.)

I should have noted another comparison/contrast between
having memory corruption and not in my context:

I've tried variants of my test program that do not fork but
just sleep for 60s to allow me to force the swap-out. I
did this before adding fork and before using
parital_test_check, for example. I gradually added things
apparently involved in the reports others had made
until I found a combination that produced a memory
corruption test failure.

These tests without fork involved find no problems with
the memory content after the swap-in.

For my test program it appears that fork-before-swap-out
or the like is essential to having the problem occur.

=3D=3D=3D
Mark Millard
markmi at dsl-only.net





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?FC7930F8-B9CC-429B-9618-FB50F1FE685F>