Re: CONFIG_HIMEM instability?

From: Anthony DeRobertis (asd@suespammers.org)
Date: Mon Jan 07 2002 - 06:49:44 EST


On Sunday, January 6, 2002, at 11:57 , Tony Hoyle wrote:
>
> Unfortunately memtest86 is incompatible with this mobo, but the
> memory checks out on another machine I tried it on, so I expect
> it's OK.

I've had DIMMs not get along. So have other people. This little
tester seems to find that fairly well, stunningly --- even when
Memtest86 can't find them at all. It found mine in about 30min
(512mb box); another persons in an hour or two.

Adjust the defines up top.

PS: You did report the failure to the memtest86 people, right?

#include <iostream>
#include <cstdlib>
#include <ctime>
#ifdef TWO_PROCESSOR
# include <unistd.h>
# include <cstdio>
#endif

#define BLOCK_TYPE int
#define BLOCK_SIZE (32*1024*1024/sizeof(BLOCK_TYPE)) /* = 32MB */
#define BLOCK_COUNT (15) /* = 480MB */

using namespace std;

void FillBlock(BLOCK_TYPE *ptr);
void CheckBlock(BLOCK_TYPE *ptr, int seed, int ident, int proc);

int main() {
        BLOCK_TYPE *block[BLOCK_COUNT];
        int seed[BLOCK_COUNT];

        cerr << "Allocating Blocks...\n";
        for (int x = 0; x < BLOCK_COUNT; ++x)
                block[x] = new BLOCK_TYPE[BLOCK_SIZE];
        cerr << "Done allocating blocks.\n";

        cerr << "Filling blocks...\n";
        for (int x = 0; x < BLOCK_COUNT; ++x) {
                int rnd = rand();
                srand(rnd);
                seed[x] = rnd;
                FillBlock(block[x]);
        };
        cerr << "Done filling blocks.\n";
#ifdef TWO_PROCESSOR
        int proc_ident;
        {
                int res = fork();
                if (res == 0) {
                        srand(time(NULL));
                        proc_ident = 1;
                } else if (res == -1) {
                        perror("fork");
                        exit(1);
                } else
                        proc_ident = 0;
        }
#else
        int proc_ident = 0;
#endif
        cerr << "Running test. This will take forever.\n";
        while (1) {
                int which = (rand() % BLOCK_COUNT);
                CheckBlock(block[which], seed[which], which, proc_ident);
        }

        return 0;
}

void FillBlock(BLOCK_TYPE *ptr) {
        for (BLOCK_TYPE *stop = ptr+BLOCK_SIZE-1; ptr < stop; ++ptr)
                *ptr = rand();
}

void CheckBlock(BLOCK_TYPE *ptr, int seed, int ident, int proc) {
        int old = rand();
        srand(seed);
        for (BLOCK_TYPE *stop = ptr+BLOCK_SIZE-1; ptr < stop; ++ptr) {
                BLOCK_TYPE got = *ptr;
                BLOCK_TYPE want = rand();
                if (got != want)
                        cerr << "Block #" << ident << " (" << proc << ") not OK; *"
                                 << ptr << " = " << got << ", not " << want << "!\n";
        }
        srand(old);
}

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Mon Jan 07 2002 - 21:00:34 EST