X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fmemhog.c;h=1d98e88a71b5e7c4ef782be2f470ca7aaf50b720;hb=82a1b0453c8dccf63d23f3c96f1b2355524b952c;hp=098e7873a5920bb33d70c67c9b81196d89b692b8;hpb=191061ee668400324f4505cf498f1ee2d57e4962;p=fs%2Flustre-release.git diff --git a/lustre/tests/memhog.c b/lustre/tests/memhog.c index 098e787..1d98e88 100644 --- a/lustre/tests/memhog.c +++ b/lustre/tests/memhog.c @@ -1,3 +1,39 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + * GPL HEADER END + */ +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Use is subject to license terms. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + */ + #include #include #include @@ -50,30 +86,36 @@ int main(int argc, char *argv[]) mem = calloc(numchunk, sizeof(*mem)); if (mem == NULL) { fprintf(stderr, "error allocating initial chunk array\n"); - exit(1); + exit(-1); } alloc = CHUNK; printf("[%d] allocating %lld kbytes in %u kbyte chunks\n", getpid(), kbtotal, alloc); - for (i = kballoc = 0; i < numchunk; i++, kballoc += alloc) { + for (i = kballoc = 0; i < numchunk && alloc > 0; i++, kballoc += alloc){ if (kbtotal - kballoc < alloc) alloc = kbtotal - kballoc; - tmp = mem[i] = malloc(alloc * 1024); - if (tmp == NULL) { + while (alloc > 0 && (mem[i] = malloc(alloc * 1024)) == NULL) { fprintf(stderr, "malloc(%u) failed (%lld/%lld)\n", alloc * 1024, kballoc, kbtotal); - } else { - printf("touching %p (%lld/%lld)\n", - tmp, kballoc, kbtotal); - for (j = 0; j < alloc; j += 4) { - for (k = 0, sum = 0; k < 4095; k++, tmp++) - sum += *tmp; - *tmp = sum; - } + alloc /= 2; + } + if (alloc == 0) + break; + + printf("touching %p ([%lld-%lld]/%lld)\n", mem[i], kballoc, + kballoc + alloc - 1, kbtotal); + for (j = 0, tmp = mem[i]; j < alloc; j += 4) { + for (k = 0, sum = 0; k < 4095; k++, tmp++) + sum += *tmp; + *tmp = sum; } } + if (kballoc == 0) + exit(-2); + + kbtotal = kballoc; printf("touched %lld kbytes\n", kballoc); alloc = CHUNK; @@ -92,7 +134,7 @@ int main(int argc, char *argv[]) if (*tmp != sum) { fprintf(stderr, "sum %x != %x at %p\n", *tmp, sum, tmp - 4092); - rc = 1; + rc++; } } }