diff options
author | Lasse Collin <lasse.collin@tukaani.org> | 2010-03-07 13:29:28 +0200 |
---|---|---|
committer | Lasse Collin <lasse.collin@tukaani.org> | 2010-03-07 13:29:28 +0200 |
commit | 2672bcc9f85ba28ff648e092e9eb4cd9e69ce418 (patch) | |
tree | 1f3c218b5b20f5d2ec7fb364fd1c7f5f9c1a04c3 /src/xz/hardware.c | |
parent | Updated THANKS. (diff) | |
download | xz-2672bcc9f85ba28ff648e092e9eb4cd9e69ce418.tar.xz |
Increase the default memory usage limit on "low-memory" systems.
Previously the default limit was always 40 % of RAM. The
new limit is a little bit more complex:
- If 40 % of RAM is at least 80 MiB, 40 % of RAM is used
as the limit.
- If 80 % of RAM is over 80 MiB, 80 MiB is used as the limit.
- Otherwise 80 % of RAM is used as the limit.
This should make it possible to decompress files created with
"xz -9" on more systems. Swapping is generally more expected
on systems with less RAM, so higher default limit on them
shouldn't cause too bad surprises in terms of heavy swapping.
Instead, the higher default limit should reduce the number of
bad surprises when it used to prevent decompression of files
created with "xz -9". The DoS prevention system shouldn't be
a DoS itself.
Note that even with the new default limit, a system with 64 MiB
RAM cannot decompress files created with "xz -9" without user
overriding the limit. This should be OK, because if xz is going
to need more memory than the system has RAM, it will run very
very slowly and thus it's good that user has to override the limit
in that case.
Diffstat (limited to 'src/xz/hardware.c')
-rw-r--r-- | src/xz/hardware.c | 43 |
1 files changed, 31 insertions, 12 deletions
diff --git a/src/xz/hardware.c b/src/xz/hardware.c index d91b4cee..74742fce 100644 --- a/src/xz/hardware.c +++ b/src/xz/hardware.c @@ -21,6 +21,9 @@ static uint32_t threadlimit; /// Memory usage limit static uint64_t memlimit; +/// Total amount of physical RAM +static uint64_t total_ram; + extern void hardware_threadlimit_set(uint32_t new_threadlimit) @@ -48,11 +51,27 @@ hardware_threadlimit_get(void) extern void hardware_memlimit_set(uint64_t new_memlimit) { - if (new_memlimit == 0) { - // The default is 40 % of total installed physical RAM. - hardware_memlimit_set_percentage(40); - } else { + if (new_memlimit != 0) { memlimit = new_memlimit; + } else { + // The default depends on the amount of RAM but so that + // on "low-memory" systems the relative limit is higher + // to make it more likely that files created with "xz -9" + // will still decompress without overriding the limit + // manually. + // + // If 40 % of RAM is 80 MiB or more, use 40 % of RAM as + // the limit. + memlimit = 40 * total_ram / 100; + if (memlimit < UINT64_C(80) * 1024 * 1024) { + // If 80 % of RAM is less than 80 MiB, + // use 80 % of RAM as the limit. + memlimit = 80 * total_ram / 100; + if (memlimit > UINT64_C(80) * 1024 * 1024) { + // Otherwise use 80 MiB as the limit. + memlimit = UINT64_C(80) * 1024 * 1024; + } + } } return; @@ -65,14 +84,7 @@ hardware_memlimit_set_percentage(uint32_t percentage) assert(percentage > 0); assert(percentage <= 100); - uint64_t mem = lzma_physmem(); - - // If we cannot determine the amount of RAM, use the assumption - // defined by the configure script. - if (mem == 0) - mem = (uint64_t)(ASSUME_RAM) * 1024 * 1024; - - memlimit = percentage * mem / 100; + memlimit = percentage * total_ram / 100; return; } @@ -87,6 +99,13 @@ hardware_memlimit_get(void) extern void hardware_init(void) { + // Get the amount of RAM. If we cannot determine it, + // use the assumption defined by the configure script. + total_ram = lzma_physmem(); + if (total_ram == 0) + total_ram = (uint64_t)(ASSUME_RAM) * 1024 * 1024; + + // Set the defaults. hardware_memlimit_set(0); hardware_threadlimit_set(0); return; |