diff --git a/src/mem/abstract_mem.cc b/src/mem/abstract_mem.cc --- a/src/mem/abstract_mem.cc +++ b/src/mem/abstract_mem.cc @@ -51,6 +51,7 @@ #include #include +#include #include #include @@ -486,9 +487,16 @@ fatal("Insufficient memory to allocate compression state for %s\n", filename); - if (gzwrite(compressedMem, pmemAddr, size()) != (int)size()) { - fatal("Write failed on physical memory checkpoint file '%s'\n", - filename); + // gzwrite fails if (int)len < 0 (gzwrite returns int) + for (uint64_t written=0, pass_size; written < size(); written+=pass_size) { + pass_size = (uint64_t)INT_MAX < (size()-written) ? + (uint64_t)INT_MAX : (size()-written); + + if (gzwrite(compressedMem, pmemAddr+written, (unsigned int)pass_size) + != (int)pass_size) { + fatal("Write failed on physical memory checkpoint file '%s'\n", + filename); + } } if (gzclose(compressedMem))