Skip to content

Commit 5870efb

Browse files
committed
Update alloc patch
1 parent c744531 commit 5870efb

File tree

1 file changed

+27
-6
lines changed

1 file changed

+27
-6
lines changed

Zend/zend_alloc.c

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,11 @@ typedef struct _zend_mm_free_slot zend_mm_free_slot;
195195
typedef struct _zend_mm_chunk zend_mm_chunk;
196196
typedef struct _zend_mm_huge_list zend_mm_huge_list;
197197

198+
/*
199+
* 0 means disabled
200+
* 1 means huge pages
201+
* 2 means transparent huge pages
202+
*/
198203
int zend_mm_use_huge_pages = 0;
199204

200205
/*
@@ -229,6 +234,13 @@ int zend_mm_use_huge_pages = 0;
229234
* 2 for 5-8, 3 for 9-16 etc) see zend_alloc_sizes.h
230235
*/
231236

237+
/*
238+
* For environments where mmap is expensive it can be
239+
* worthwhile to avoid mmap/munmap churn by raising
240+
* the minimum number of chunks in emalloc
241+
*/
242+
int zend_mm_min_chunks = 0;
243+
232244
struct _zend_mm_heap {
233245
#if ZEND_MM_CUSTOM
234246
int use_custom_heap;
@@ -462,7 +474,7 @@ static void *zend_mm_mmap(size_t size)
462474
void *ptr;
463475

464476
#ifdef MAP_HUGETLB
465-
if (zend_mm_use_huge_pages && size == ZEND_MM_CHUNK_SIZE) {
477+
if (zend_mm_use_huge_pages == 1 && size == ZEND_MM_CHUNK_SIZE) {
466478
ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_HUGETLB, -1, 0);
467479
if (ptr != MAP_FAILED) {
468480
return ptr;
@@ -669,7 +681,7 @@ static void *zend_mm_chunk_alloc_int(size_t size, size_t alignment)
669681
return NULL;
670682
} else if (ZEND_MM_ALIGNED_OFFSET(ptr, alignment) == 0) {
671683
#ifdef MADV_HUGEPAGE
672-
if (zend_mm_use_huge_pages) {
684+
if (zend_mm_use_huge_pages == 2) {
673685
madvise(ptr, size, MADV_HUGEPAGE);
674686
}
675687
#endif
@@ -702,7 +714,7 @@ static void *zend_mm_chunk_alloc_int(size_t size, size_t alignment)
702714
zend_mm_munmap((char*)ptr + size, alignment - REAL_PAGE_SIZE);
703715
}
704716
# ifdef MADV_HUGEPAGE
705-
if (zend_mm_use_huge_pages) {
717+
if (zend_mm_use_huge_pages == 2) {
706718
madvise(ptr, size, MADV_HUGEPAGE);
707719
}
708720
# endif
@@ -2270,14 +2282,15 @@ void zend_mm_shutdown(zend_mm_heap *heap, int full, int silent)
22702282
zend_mm_chunk_free(heap, heap->main_chunk, ZEND_MM_CHUNK_SIZE);
22712283
} else {
22722284
/* free some cached chunks to keep average count */
2273-
heap->avg_chunks_count = (heap->avg_chunks_count + (double)heap->peak_chunks_count) / 2.0;
2285+
heap->avg_chunks_count = MAX((heap->avg_chunks_count + (double)heap->peak_chunks_count) / 2.0, zend_mm_min_chunks);
22742286
while ((double)heap->cached_chunks_count + 0.9 > heap->avg_chunks_count &&
22752287
heap->cached_chunks) {
22762288
p = heap->cached_chunks;
22772289
heap->cached_chunks = p->next;
22782290
zend_mm_chunk_free(heap, p, ZEND_MM_CHUNK_SIZE);
22792291
heap->cached_chunks_count--;
22802292
}
2293+
22812294
/* clear cached chunks */
22822295
p = heap->cached_chunks;
22832296
while (p != NULL) {
@@ -2759,8 +2772,16 @@ static void alloc_globals_ctor(zend_alloc_globals *alloc_globals)
27592772
#endif
27602773

27612774
tmp = getenv("USE_ZEND_ALLOC_HUGE_PAGES");
2762-
if (tmp && zend_atoi(tmp, 0)) {
2763-
zend_mm_use_huge_pages = 1;
2775+
if (tmp) {
2776+
zend_mm_use_huge_pages = zend_atoi(tmp, 0);
2777+
if (zend_mm_use_huge_pages > 2) {
2778+
zend_mm_use_huge_pages = 1;
2779+
}
2780+
}
2781+
2782+
tmp = getenv("USE_ZEND_MIN_CHUNKS");
2783+
if (tmp) {
2784+
zend_mm_min_chunks = zend_atoi(tmp, 0);
27642785
}
27652786
alloc_globals->mm_heap = zend_mm_init();
27662787
}

0 commit comments

Comments
 (0)