Commit 6bae7ed8b900bc0f1fb1df0f70ceed5e8cca0ca1
1 parent
74c161bd
informative message about low memory on /dev/shm
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1388 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
27 additions
and
0 deletions
osdep.c
| @@ -323,6 +323,7 @@ void qemu_vfree(void *ptr) | @@ -323,6 +323,7 @@ void qemu_vfree(void *ptr) | ||
| 323 | 323 | ||
| 324 | #elif defined(USE_KQEMU) | 324 | #elif defined(USE_KQEMU) |
| 325 | 325 | ||
| 326 | +#include <sys/vfs.h> | ||
| 326 | #include <sys/mman.h> | 327 | #include <sys/mman.h> |
| 327 | #include <fcntl.h> | 328 | #include <fcntl.h> |
| 328 | 329 | ||
| @@ -333,11 +334,37 @@ void *qemu_vmalloc(size_t size) | @@ -333,11 +334,37 @@ void *qemu_vmalloc(size_t size) | ||
| 333 | const char *tmpdir; | 334 | const char *tmpdir; |
| 334 | char phys_ram_file[1024]; | 335 | char phys_ram_file[1024]; |
| 335 | void *ptr; | 336 | void *ptr; |
| 337 | + struct statfs stfs; | ||
| 336 | 338 | ||
| 337 | if (phys_ram_fd < 0) { | 339 | if (phys_ram_fd < 0) { |
| 338 | tmpdir = getenv("QEMU_TMPDIR"); | 340 | tmpdir = getenv("QEMU_TMPDIR"); |
| 339 | if (!tmpdir) | 341 | if (!tmpdir) |
| 340 | tmpdir = "/dev/shm"; | 342 | tmpdir = "/dev/shm"; |
| 343 | + if (statfs(tmpdir, &stfs) == 0) { | ||
| 344 | + int64_t free_space; | ||
| 345 | + int ram_mb; | ||
| 346 | + | ||
| 347 | + extern int ram_size; | ||
| 348 | + free_space = (int64_t)stfs.f_bavail * stfs.f_bsize; | ||
| 349 | + if ((ram_size + 8192 * 1024) >= free_space) { | ||
| 350 | + ram_mb = (ram_size / (1024 * 1024)); | ||
| 351 | + fprintf(stderr, | ||
| 352 | + "You do not have enough space in '%s' for the %d MB of QEMU virtual RAM.\n", | ||
| 353 | + tmpdir, ram_mb); | ||
| 354 | + if (strcmp(tmpdir, "/dev/shm") == 0) { | ||
| 355 | + fprintf(stderr, "To have more space available provided you have enough RAM and swap, do as root:\n" | ||
| 356 | + "umount /dev/shm\n" | ||
| 357 | + "mount -t tmpfs -o size=%dm none /dev/shm\n", | ||
| 358 | + ram_mb + 16); | ||
| 359 | + } else { | ||
| 360 | + fprintf(stderr, | ||
| 361 | + "Use the '-m' option of QEMU to diminish the amount of virtual RAM or use the\n" | ||
| 362 | + "QEMU_TMPDIR environment variable to set another directory where the QEMU\n" | ||
| 363 | + "temporary RAM file will be opened.\n"); | ||
| 364 | + } | ||
| 365 | + exit(1); | ||
| 366 | + } | ||
| 367 | + } | ||
| 341 | snprintf(phys_ram_file, sizeof(phys_ram_file), "%s/qemuXXXXXX", | 368 | snprintf(phys_ram_file, sizeof(phys_ram_file), "%s/qemuXXXXXX", |
| 342 | tmpdir); | 369 | tmpdir); |
| 343 | if (mkstemp(phys_ram_file) < 0) { | 370 | if (mkstemp(phys_ram_file) < 0) { |