Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:11.4:Update
libwebkit
libwebkit-reduce_up_front_allocation.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File libwebkit-reduce_up_front_allocation.patch of Package libwebkit
From b26806bc90a23d5e29f597d710e6b9dbfb4694cb Mon Sep 17 00:00:00 2001 From: Xan Lopez <xan@gnome.org> Date: Wed, 12 Jan 2011 23:25:23 +0100 Subject: [PATCH] 2011-01-12 Xan Lopez <xlopez@igalia.com> Reviewed by NOBODY (OOPS!). JIT requires VM overcommit (particularly on x86-64), Linux does not by default support this without swap? https://bugs.webkit.org/show_bug.cgi?id=42756 The FixedVMPool Allocator does not work well on systems where allocating very large amounts of memory upfront is not reasonable, like Linux without overcommit enabled. As a workaround, on Linux, default to the values used in embedded environments (in the MB range), and only jump to the GB range if we detect at runtime that overcommit is enabled. Should fix crashes on Linux/x86_64 with less than 3 or 4GB of RAM. * jit/ExecutableAllocatorFixedVMPool.cpp: (JSC::FixedVMPoolAllocator::free): use new variables for VM pool size and coalesce limit. (JSC::ExecutableAllocator::isValid): swap the variables from embedded to generic values at runtime, on linux, if overcommit is enabled. (JSC::ExecutableAllocator::underMemoryPressure): use new variables for VM pool size and coalesce limit. --- Source/JavaScriptCore/ChangeLog | 24 ++++++++++ .../jit/ExecutableAllocatorFixedVMPool.cpp | 49 ++++++++++++++++---- 2 files changed, 63 insertions(+), 10 deletions(-) Index: Source/JavaScriptCore/ChangeLog =================================================================== --- Source/JavaScriptCore/ChangeLog.orig 2011-01-11 02:07:11.000000000 +0100 +++ Source/JavaScriptCore/ChangeLog 2011-08-04 13:11:32.020662517 +0200 @@ -1,3 +1,27 @@ +2011-01-12 Xan Lopez <xlopez@igalia.com> + + Reviewed by NOBODY (OOPS!). + + JIT requires VM overcommit (particularly on x86-64), Linux does not by default support this without swap? + https://bugs.webkit.org/show_bug.cgi?id=42756 + + The FixedVMPool Allocator does not work well on systems where + allocating very large amounts of memory upfront is not reasonable, + like Linux without overcommit enabled. As a workaround, on Linux, + default to the values used in embedded environments (in the MB + range), and only jump to the GB range if we detect at runtime that + overcommit is enabled. Should fix crashes on Linux/x86_64 with + less than 3 or 4GB of RAM. + + * jit/ExecutableAllocatorFixedVMPool.cpp: + (JSC::FixedVMPoolAllocator::free): use new variables for VM pool + size and coalesce limit. + (JSC::ExecutableAllocator::isValid): swap the variables from + embedded to generic values at runtime, on linux, if overcommit is + enabled. + (JSC::ExecutableAllocator::underMemoryPressure): use new variables + for VM pool size and coalesce limit. + 2011-01-10 Daniel Bates <dbates@rim.com> Reviewed by Martin Robinson. Index: Source/JavaScriptCore/jit/ExecutableAllocatorFixedVMPool.cpp =================================================================== --- Source/JavaScriptCore/jit/ExecutableAllocatorFixedVMPool.cpp.orig 2011-01-03 23:55:02.000000000 +0100 +++ Source/JavaScriptCore/jit/ExecutableAllocatorFixedVMPool.cpp 2011-08-04 13:08:29.311233800 +0200 @@ -38,14 +38,29 @@ #include <wtf/PageReservation.h> #include <wtf/VMTags.h> -#if CPU(X86_64) - // These limits suitable on 64-bit platforms (particularly x86-64, where we require all jumps to have a 2Gb max range). - #define VM_POOL_SIZE (2u * 1024u * 1024u * 1024u) // 2Gb - #define COALESCE_LIMIT (16u * 1024u * 1024u) // 16Mb +#if OS(LINUX) +#include <stdio.h> +#endif + +static const unsigned vmPoolSizeGeneric = 2u * 1024u * 1024u * 1024u; // 2Gb +static const unsigned coalesceLimitGeneric = 16u * 1024u * 1024u; // 16Mb + +static const unsigned vmPoolSizeEmbedded = 32u * 1024u * 1024u; // 32Mb +static const unsigned coalesceLimitEmbedded = 4u * 1024u * 1024u; // 4Mb + +#if CPU(X86_64) && !OS(LINUX) +// These limits suitable on 64-bit platforms (particularly x86-64, +// where we require all jumps to have a 2Gb max range). We don't +// enable this by default on Linux, since it needs overcommit and +// distros commonly disable that feature. We'll check the value +// for the overcommit feature at runtime and re-assign the Generic +// values if it's enabled. +static unsigned vmPoolSize = vmPoolSizeGeneric; // 2Gb +static unsigned coalesceLimit = coalesceLimitGeneric; // 16Mb #else // These limits are hopefully sensible on embedded platforms. - #define VM_POOL_SIZE (32u * 1024u * 1024u) // 32Mb - #define COALESCE_LIMIT (4u * 1024u * 1024u) // 4Mb +static unsigned vmPoolSize = vmPoolSizeEmbedded; // 32Mb +static unsigned coalesceLimit = coalesceLimitEmbedded; // 4Mb #endif using namespace WTF; @@ -315,7 +330,7 @@ public: // 16MB of allocations have been freed, sweep m_freeList // coalescing any neighboring fragments. m_countFreedSinceLastCoalesce += size; - if (m_countFreedSinceLastCoalesce >= COALESCE_LIMIT) { + if (m_countFreedSinceLastCoalesce >= coalesceLimit) { m_countFreedSinceLastCoalesce = 0; coalesceFreeSpace(); } @@ -436,8 +451,22 @@ static size_t allocatedCount = 0; bool ExecutableAllocator::isValid() const { SpinLockHolder lock_holder(&spinlock); - if (!allocator) - allocator = new FixedVMPoolAllocator(JIT_ALLOCATOR_LARGE_ALLOC_SIZE, VM_POOL_SIZE); + if (!allocator) { +#if OS(LINUX) + FILE* fp = fopen("/proc/sys/vm/overcommit_memory", "r"); + if (fp) { + unsigned overcommit = 0; + fscanf(fp, "%u", &overcommit); + if (overcommit == 1) { + vmPoolSize = vmPoolSizeGeneric; // 2Gb + coalesceLimit = coalesceLimitGeneric; // 16Mb + } + + fclose(fp); + } +#endif + allocator = new FixedVMPoolAllocator(JIT_ALLOCATOR_LARGE_ALLOC_SIZE, vmPoolSize); + } return allocator->isValid(); } @@ -445,7 +474,7 @@ bool ExecutableAllocator::underMemoryPre { // Technically we should take the spin lock here, but we don't care if we get stale data. // This is only really a heuristic anyway. - return allocatedCount > (VM_POOL_SIZE / 2); + return allocatedCount > (vmPoolSize / 2); } ExecutablePool::Allocation ExecutablePool::systemAlloc(size_t size)
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor