[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: filesystem corruption



"David S. Miller" <davem@redhat.com> writes:

>> Boot with "ide=nodma" on the kernel command line.

I did this.  I didn't see any of the previous errors when I ran the
rsync 40 times, but I did get this once:

    building file list ... done
    rsync: relocation error: rsync: symbol qsort, version  not defined in file  with link time reference
    rsync: connection unexpectedly closed (8 bytes read so far)
    rsync error: error in rsync protocol data stream (code 12) at io.c(190)

I do see a 60% slowdown in read times (from about 14.5MB/sec to about
5.5MB/sec) with dma disabled, according to hdparm -t, which obviously
isn't desirable, but it's better than unreliable reads.

I am a little curious if this is all the performance I should be
expecting, as on an x86 machine with a similar drive, but a different
controller, I see 46MB/sec.

I've asked around, and learned that on the x1 and v100 (in particular,
the SUNW,UltraAX-i2 platform), the native OS (which I will leave
unnamed :-) includes some magic code whose purpose, I am told, is to
work around a chipset bug on those platforms which leads to some sort
of unspecified data corruption.

Briefly: each time an IDE channel is reset, this code reads pci config
register 0x58, and saves it.  For channel 0, it clears bit 0x04,
writes it back to the register, waits a millisecond, then writes the
original saved value back.  For channel 1, it does the same with bit
0x08.

I'm not sure what this register does, but the algorithm is easy enough
to implement.  However the kernel build is blowing out early, so I
can't test it out:

    # make-kpkg --subarch=sun4u --arch_in_name --revision=marc.1 kernel_image
    <time passes>
    /usr/bin/make -C arch/sparc64/kernel check_asm
    make[3]: Entering directory `/u1/usr/src/kernel-source-2.4.21/arch/sparc64/kernel'
    gcc -E -D__KERNEL__ -I/u1/usr/src/kernel-source-2.4.21/include -P tmp.c -o tmp.i
    /bin/sh ./check_asm.sh -data task tmp.i check_asm_data.c
    /bin/sh ./check_asm.sh -data mm tmp.i check_asm_data.c
    /bin/sh ./check_asm.sh -data thread tmp.i check_asm_data.c
    gcc -D__KERNEL__ -I/u1/usr/src/kernel-source-2.4.21/include -m64 -mcmodel=medlow -ffixed-g4 -S -o check_asm_data.s check_asm_data.c
    /bin/sh ./check_asm.sh -ints check_asm_data.s check_asm.c
    /bin/sh ./check_asm.sh -printf task tmp.i check_asm.c
    /bin/sh ./check_asm.sh -printf mm tmp.i check_asm.c
    /bin/sh ./check_asm.sh -printf thread tmp.i check_asm.c
    gcc -o check_asm check_asm.c
    check_asm.c:312: error: field name not in record or union initializer
    check_asm.c:312: error: (near initialization for `check_asm_data')
    check_asm.c:313: warning: initialization makes integer from pointer without a cast
    make[3]: *** [check_asm] Error 1
    make[3]: Leaving directory `/u1/usr/src/kernel-source-2.4.21/arch/sparc64/kernel'

Any hints on getting the kernel to build?

                Marc



Reply to: