mimalloc icon indicating copy to clipboard operation
mimalloc copied to clipboard

Can hit assertion failure related to segment_slices with a relatively specific allocation size

Open timo opened this issue 8 months ago • 0 comments

While trying to find differences in behaviour for very large allocation requests - larger than my RAM FWIW - I found a range of sizes where instead of getting NULL returned from mi_malloc, I get a SIGABORT from a failed assertion:

The code I run is using rakudo or nqp, I just ask for an array of pointers and set a value at a very high index:

nqp -e 'my @foo; @foo[2 ** 45 - 2 ** 19] := 1'

This results in a request to allocate a buffer for the array of size 0xFFFFFFC01000.

That then ends up triggering the following assertion:

mi_segment_alloc (required=281474976710656, page_alignment=0, req_arena_id=0, tld=0x7f0662b9bf20 <tld_main+32>, 
    huge_page=0x7ffcac7591c0) at 3rdparty/mimalloc/src/segment.c:901
901       mi_assert_internal(segment_slices > 0 && segment_slices <= UINT32_MAX);
(rr) 
_mi_assert_fail (assertion=0x7f0662a05288 "segment_slices > 0 && segment_slices <= UINT32_MAX", 
    fname=0x7f0662a04788 "3rdparty/mimalloc/src/segment.c", line=901, 
    func=0x7f0662a07790 <__func__.28> "mi_segment_alloc") at 3rdparty/mimalloc/src/options.c:529
529       _mi_fprintf(NULL, NULL, "mimalloc: assertion failed: at \"%s\":%u, %s\n  assertion: \"%s\"\n", fname, line, (func==NULL?"":func), assertion);
(rr) reverse-finish
Run back to call of #0  _mi_assert_fail (
    assertion=0x7f0662a05288 "segment_slices > 0 && segment_slices <= UINT32_MAX", 
    fname=0x7f0662a04788 "3rdparty/mimalloc/src/segment.c", line=901, 
    func=0x7f0662a07790 <__func__.28> "mi_segment_alloc") at 3rdparty/mimalloc/src/options.c:529
0x00007f06623ef31d in mi_segment_alloc (required=281474976710656, page_alignment=0, req_arena_id=0, 
    tld=0x7f0662b9bf20 <tld_main+32>, huge_page=0x7ffcac7591c0) at 3rdparty/mimalloc/src/segment.c:901
901       mi_assert_internal(segment_slices > 0 && segment_slices <= UINT32_MAX);
(rr) print segment_slices 
$25 = 4294967297
(rr) print UINT32_MAX
$26 = 4294967295
(rr)

This is a 64bit Fedora Linux 41 on an AMD Ryzen processor with 64 gigabytes of RAM installed.

Trying just mi_malloc(0xFFFFFFC01000) at the top of moarvm's int main without before doing anything else (shared libraries would still be initialised) also reproduces this assertion failure, so if you need to repro this, that should really be all you need.

Quick GDB session stepping from mi_malloc to the abort with some random debug output in the middle

(rr) call mi_debug_show_arenas()
mimalloc: arena 0: 32 blocks of size 32MiB (in 1 fields) 
mimalloc:   inuse blocks:
mimalloc:     xx..............................                                
mimalloc:     total ('x'): 2
mimalloc:   committed blocks:
mimalloc:     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx                                
mimalloc:     total ('x'): 32
mimalloc: total inuse blocks    : 2
(rr) call mi_debug_show_arenas(1,1,1)
mimalloc: arena 0: 32 blocks of size 32MiB (in 1 fields) 
mimalloc:   inuse blocks:
mimalloc:     xx..............................                                
mimalloc:     total ('x'): 2
mimalloc:   committed blocks:
mimalloc:     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx                                
mimalloc:     total ('x'): 32
mimalloc: total inuse blocks    : 2
(rr) call mi_stats_print(NULL)
heap stats:     peak       total     current       block      total#   
   bin   1:   118.8 KiB   133.2 KiB   118.8 KiB     8   B      16.9 K    not all freed
   bin   4:   983.3 KiB     1.1 MiB   983.3 KiB    32   B      37.0 K    not all freed
   bin   6:   195.0 KiB   204.4 KiB   195.0 KiB    48   B       4.3 K    not all freed
   bin   8:   457.1 KiB   565.1 KiB   457.0 KiB    64   B       9.0 K    not all freed
   bin   9:    44.8 KiB     2.7 MiB    44.7 KiB    80   B      35.9 K    not all freed
   bin  10:   128.0 KiB   147.8 KiB   128.0 KiB    96   B       1.5 K    not all freed
   bin  11:    35.3 KiB   768.6 KiB    34.9 KiB   112   B       7.0 K    not all freed
   bin  12:    40.6 KiB    58.4 KiB    40.4 KiB   128   B     466        not all freed
   bin  13:   522.8 KiB   610.8 KiB   522.8 KiB   160   B       3.8 K    not all freed
   bin  14:    27.1 KiB    44.9 KiB    26.7 KiB   192   B     239        not all freed
   bin  15:    34.0 KiB   372.4 KiB    33.6 KiB   224   B       1.6 K    not all freed
   bin  16:   163.8 KiB   199.2 KiB   163.6 KiB   256   B     794        not all freed
   bin  17:    50.1 KiB    80.9 KiB    49.8 KiB   320   B     258        not all freed
   bin  18:    28.2 KiB    49.6 KiB    27.4 KiB   384   B     132        not all freed
   bin  19:    19.3 KiB     1.3 MiB    18.4 KiB   448   B       3.1 K    not all freed
   bin  20:    95.8 KiB   144.5 KiB    95.3 KiB   512   B     288        not all freed
   bin  21:    51.4 KiB    94.1 KiB    50.8 KiB   640   B     150        not all freed
   bin  22:    28.6 KiB    64.7 KiB    27.8 KiB   768   B      86        not all freed
   bin  23:    34.2 KiB    57.0 KiB    32.5 KiB   896   B      65        not all freed
   bin  24:   112.4 KiB   152.5 KiB   111.4 KiB     1.0 KiB   152        not all freed
   bin  25:    31.3 KiB     3.8 MiB    27.6 KiB     1.2 KiB     3.1 K    not all freed
   bin  26:    28.6 KiB    84.3 KiB    28.6 KiB     1.5 KiB    56        not all freed
   bin  27:    29.8 KiB    66.7 KiB    29.8 KiB     1.7 KiB    38        not all freed
   bin  28:   104.4 KiB   162.6 KiB   104.4 KiB     2.0 KiB    81        not all freed
   bin  29:    40.1 KiB   105.4 KiB    37.6 KiB     2.5 KiB    42        not all freed
   bin  30:    42.1 KiB    90.3 KiB    39.1 KiB     3.0 KiB    30        not all freed
   bin  31:    35.1 KiB    63.2 KiB    35.1 KiB     3.5 KiB    18        not all freed
   bin  32:   136.5 KiB   196.7 KiB   136.5 KiB     4.0 KiB    49        not all freed
   bin  33:    50.1 KiB   100.3 KiB    45.1 KiB     5.0 KiB    20        not all freed
   bin  34:    30.1 KiB    54.2 KiB    30.1 KiB     6.0 KiB     9        not all freed
   bin  35:    49.1 KiB    84.3 KiB    49.1 KiB     7.0 KiB    12        not all freed
   bin  36:   144.5 KiB   200.7 KiB   144.5 KiB     8.0 KiB    25        not all freed
   bin  37:   331.2 KiB   401.5 KiB   331.2 KiB    10.0 KiB    40        not all freed
   bin  38:    24.0 KiB    36.1 KiB    24.0 KiB    12.0 KiB     3        not all freed
   bin  39:   716.8 KiB   758.9 KiB   716.8 KiB    14.0 KiB    54        not all freed
   bin  40:   449.7 KiB   465.8 KiB   449.7 KiB    16.0 KiB    29        not all freed
   bin  41:   602.3 KiB   662.5 KiB   602.3 KiB    20.0 KiB    33        not all freed
   bin  42:   361.4 KiB   385.5 KiB   361.4 KiB    24.0 KiB    16        not all freed
   bin  43:    56.2 KiB    56.2 KiB    56.2 KiB    28.1 KiB     2        not all freed
   bin  44:    32.1 KiB    32.1 KiB    32.1 KiB    32.1 KiB     1        not all freed
   bin  45:   200.7 KiB   240.9 KiB   200.7 KiB    40.1 KiB     6        not all freed
   bin  46:    96.3 KiB    96.3 KiB    96.3 KiB    48.1 KiB     2        not all freed
   bin  47:   112.4 KiB   112.4 KiB   112.4 KiB    56.2 KiB     2        not all freed

heap stats:     peak       total     current       block      total#   
    binned:     6.2 Mi     16.2 Mi      6.2 Mi                           not all freed
      huge:     8.1 Mi      8.1 Mi      8.1 Mi                           not all freed
     total:    14.4 MiB    24.4 MiB    14.4 MiB                          
malloc req:                14.0 MiB

  reserved:     1.0 GiB     1.0 GiB     1.0 GiB                          
 committed:     1.0 GiB     1.0 GiB     1.0 GiB                          
     reset:     0      
    purged:   899.5 KiB
   touched:    14.6 MiB    15.9 MiB    14.6 MiB                          
  segments:     1           1           1                                not all freed
-abandoned:     0           0           0                                ok
   -cached:     0           0           0                                ok
     pages:   117         121         117                                not all freed
-abandoned:     0           0           0                                ok
 -extended:   987      
   -retire:   184      
    arenas:     1      
 -rollback:     0      
     mmaps:     2      
   commits:     8      
    resets:     0      
    purges:     2      
   guarded:     0      
   threads:     1           1           1                                not all freed
  searches:     1.0 avg
numa nodes:     1
   elapsed:   193.944 s
   process: user: 0.000 s, system: 0.000 s, faults: 0, rss: 35.1 MiB, commit: 1.0 GiB
(rr) step
mi_malloc (size=281474972520448) at 3rdparty/mimalloc/src/alloc.c:205
205       return mi_heap_malloc(mi_prim_get_default_heap(), size);
(rr) 
mi_prim_get_default_heap () at 3rdparty/mimalloc/include/mimalloc/prim.h:413
413       return _mi_heap_default;
(rr) 
414     }
(rr) 
mi_heap_malloc (heap=0x7f0662b9d340 <_mi_heap_main>, size=281474972520448) at 3rdparty/mimalloc/src/alloc.c:201
201       return _mi_heap_malloc_zero(heap, size, false);
(rr) 
_mi_heap_malloc_zero (heap=0x7f0662b9d340 <_mi_heap_main>, size=281474972520448, zero=false)
    at 3rdparty/mimalloc/src/alloc.c:197
197       return _mi_heap_malloc_zero_ex(heap, size, zero, 0);
(rr) 
_mi_heap_malloc_zero_ex (heap=0x7f0662b9d340 <_mi_heap_main>, size=281474972520448, zero=false, huge_alignment=0)
    at 3rdparty/mimalloc/src/alloc.c:171
171       if mi_likely(size thread_id == 0 || heap->thread_id == _mi_thread_id());   // heaps are thread local
(rr) 
_mi_thread_id () at 3rdparty/mimalloc/src/init.c:145
145       return _mi_prim_thread_id();
(rr) 
_mi_prim_thread_id () at 3rdparty/mimalloc/include/mimalloc/prim.h:295
295       return (uintptr_t)__builtin_thread_pointer();
(rr) 
296     }
(rr) 
_mi_thread_id () at 3rdparty/mimalloc/src/init.c:146
146     }
(rr) 
_mi_heap_malloc_zero_ex (heap=0x7f0662b9d340 <_mi_heap_main>, size=281474972520448, zero=false, huge_alignment=0)
    at 3rdparty/mimalloc/src/alloc.c:184
184         void* const p = _mi_malloc_generic(heap, size + MI_PADDING_SIZE, zero, huge_alignment);  // note: size can overflow but it is detected in malloc_generic
(rr) print MI_PADDING_SIZE 
$2 = 8
(rr) print size + MI_PADDING_SIZE 
$3 = 281474972520456
(rr) step
_mi_malloc_generic (heap=0x7f0662b9d340 <_mi_heap_main>, size=281474972520456, zero=false, huge_alignment=0)
    at 3rdparty/mimalloc/src/page.c:983
983       mi_assert_internal(heap != NULL);
(rr) 
986       if mi_unlikely(!mi_heap_is_initialized(heap)) {
(rr) 
mi_heap_is_initialized (heap=0x7f0662b9d340 <_mi_heap_main>) at 3rdparty/mimalloc/include/mimalloc/internal.h:452
452       mi_assert_internal(heap != NULL);
(rr) 
453       return (heap != NULL && heap != &_mi_heap_empty);
(rr) 
454     }
(rr) 
_mi_malloc_generic (heap=0x7f0662b9d340 <_mi_heap_main>, size=281474972520456, zero=false, huge_alignment=0)
    at 3rdparty/mimalloc/src/page.c:990
990       mi_assert_internal(mi_heap_is_initialized(heap));
(rr) 
mi_heap_is_initialized (heap=0x7f0662b9d340 <_mi_heap_main>) at 3rdparty/mimalloc/include/mimalloc/internal.h:452
452       mi_assert_internal(heap != NULL);
(rr) 
453       return (heap != NULL && heap != &_mi_heap_empty);
(rr) 
454     }
(rr) 
_mi_malloc_generic (heap=0x7f0662b9d340 <_mi_heap_main>, size=281474972520456, zero=false, huge_alignment=0)
    at 3rdparty/mimalloc/src/page.c:993
993       if mi_unlikely(++heap->generic_count >= 100) {
(rr) 
1011      mi_page_t* page = mi_find_page(heap, size, huge_alignment);
(rr) 
mi_find_page (heap=0x7f0662b9d340 <_mi_heap_main>, size=281474972520456, huge_alignment=0)
    at 3rdparty/mimalloc/src/page.c:958
958       const size_t req_size = size - MI_PADDING_SIZE;  // correct for padding_size in case of an overflow on `size`
(rr) 
959       if mi_unlikely(req_size > (MI_MEDIUM_OBJ_SIZE_MAX - MI_PADDING_SIZE) || huge_alignment > 0) {
(rr) print req_size
$4 = 281474972520448
(rr) step
960         if mi_unlikely(req_size > MI_MAX_ALLOC_SIZE) {
(rr) 
965           return mi_large_huge_page_alloc(heap,size,huge_alignment);
(rr) 
mi_large_huge_page_alloc (heap=0x7f0662b9d340 <_mi_heap_main>, size=281474972520456, page_alignment=0)
    at 3rdparty/mimalloc/src/page.c:913
913       size_t block_size = _mi_os_good_alloc_size(size);
(rr) 
_mi_os_good_alloc_size (size=281474972520456) at 3rdparty/mimalloc/src/os.c:74
74        if (size = (SIZE_MAX - align_size)) return size; // possible overflow?
(rr) print SIZE_MAX
$5 = 18446744073709551615
(rr) print SIZE_MAX - align_size
$6 = 18446744073705357311
(rr) print (size >= (SIZE_MAX - align_size))
$7 = 0
(rr) step
80        return _mi_align_up(size, align_size);
(rr) 
_mi_align_up (sz=281474972520456, alignment=4194304) at 3rdparty/mimalloc/include/mimalloc/internal.h:337
337       mi_assert_internal(alignment != 0);
(rr) 
338       uintptr_t mask = alignment - 1;
(rr) 
339       if ((alignment & mask) == 0) {  // power of two?
(rr) 
340         return ((sz + mask) & ~mask);
(rr) print sz
$8 = 281474972520456
(rr) print sz + mask
$9 = 281474976714759
(rr) print (sz + mask) & ~mask
$10 = 281474976710656
(rr) step
345     }
(rr) 
_mi_os_good_alloc_size (size=281474972520456) at 3rdparty/mimalloc/src/os.c:81
81      }
(rr) 
mi_large_huge_page_alloc (heap=0x7f0662b9d340 <_mi_heap_main>, size=281474972520456, page_alignment=0)
    at 3rdparty/mimalloc/src/page.c:914
914       mi_assert_internal(mi_bin(block_size) == MI_BIN_HUGE || page_alignment > 0);
(rr) 
mi_bin (size=281474976710656) at 3rdparty/mimalloc/src/page-queue.c:61
61        size_t wsize = _mi_wsize_from_size(size);
(rr) 
_mi_wsize_from_size (size=281474976710656) at 3rdparty/mimalloc/include/mimalloc/internal.h:396
396       mi_assert_internal(size  MI_MEDIUM_OBJ_WSIZE_MAX) {
(rr) print wsize
$13 = 35184372088832
(rr) print MI_MEDIUM_OBJ_WSIZE_MAX 
$14 = 8192
(rr) step
76          return MI_BIN_HUGE;
(rr) 
92      }
(rr) 
mi_large_huge_page_alloc (heap=0x7f0662b9d340 <_mi_heap_main>, size=281474972520456, page_alignment=0)
    at 3rdparty/mimalloc/src/page.c:915
915       bool is_huge = (block_size > MI_LARGE_OBJ_SIZE_MAX || page_alignment > 0);
(rr) 
919       mi_page_queue_t* pq = mi_page_queue(heap, is_huge ? MI_LARGE_OBJ_SIZE_MAX+1 : block_size);
(rr) print MI_LARGE_OBJ_SIZE_MAX
$15 = 16777216
(rr) print MI_LARGE_OBJ_SIZE_MAX+1
$16 = 16777217
(rr) step
mi_page_queue (heap=0x7f0662b9d340 <_mi_heap_main>, size=16777217)
    at 3rdparty/mimalloc/include/mimalloc/internal.h:631
631       return &((mi_heap_t*)heap)->pages[_mi_bin(size)];
(rr) 
_mi_bin (size=16777217) at 3rdparty/mimalloc/src/page-queue.c:101
101       return mi_bin(size);
(rr) 
mi_bin (size=16777217) at 3rdparty/mimalloc/src/page-queue.c:61
61        size_t wsize = _mi_wsize_from_size(size);
(rr) 
_mi_wsize_from_size (size=16777217) at 3rdparty/mimalloc/include/mimalloc/internal.h:396
396       mi_assert_internal(size  MI_MEDIUM_OBJ_WSIZE_MAX) {
(rr) 
76          return MI_BIN_HUGE;
(rr) 
92      }
(rr) 
_mi_bin (size=16777217) at 3rdparty/mimalloc/src/page-queue.c:102
102     }
(rr) 
mi_page_queue (heap=0x7f0662b9d340 <_mi_heap_main>, size=16777217)
    at 3rdparty/mimalloc/include/mimalloc/internal.h:632
632     }
(rr) 
mi_large_huge_page_alloc (heap=0x7f0662b9d340 <_mi_heap_main>, size=281474972520456, page_alignment=0)
    at 3rdparty/mimalloc/src/page.c:920
920       mi_assert_internal(!is_huge || mi_page_queue_is_huge(pq));
(rr) 
mi_page_queue_is_huge (pq=0x7f0662b9df20 <_mi_heap_main>) at 3rdparty/mimalloc/src/page-queue.c:41
41        return (pq->block_size == (MI_MEDIUM_OBJ_SIZE_MAX+sizeof(uintptr_t)));
(rr) 
42      }
(rr) 
mi_large_huge_page_alloc (heap=0x7f0662b9d340 <_mi_heap_main>, size=281474972520456, page_alignment=0)
    at 3rdparty/mimalloc/src/page.c:922
922       mi_page_t* page = mi_page_fresh_alloc(heap, pq, block_size, page_alignment);
(rr) 
mi_page_fresh_alloc (heap=0x7f0662b9d340 <_mi_heap_main>, pq=0x7f0662b9df20 <_mi_heap_main>, 
    block_size=281474976710656, page_alignment=0) at 3rdparty/mimalloc/src/page.c:275
275       mi_assert_internal(pq != NULL);
(rr) print/x block_size
$17 = 0x1000000000000
(rr) step
276       mi_assert_internal(mi_heap_contains_queue(heap, pq));
(rr) 
mi_heap_contains_queue (heap=0x7f0662b9d340 <_mi_heap_main>, pq=0x7f0662b9df20 <_mi_heap_main>)
    at 3rdparty/mimalloc/src/page-queue.c:135
135       return (pq >= &heap->pages[0] && pq pages[MI_BIN_FULL]);
(rr) 
136     }
(rr) 
mi_page_fresh_alloc (heap=0x7f0662b9d340 <_mi_heap_main>, pq=0x7f0662b9df20 <_mi_heap_main>, 
    block_size=281474976710656, page_alignment=0) at 3rdparty/mimalloc/src/page.c:277
277       mi_assert_internal(page_alignment > 0 || block_size > MI_MEDIUM_OBJ_SIZE_MAX || block_size == pq->block_size);
(rr) 
279       mi_page_t* page = _mi_segment_page_alloc(heap, block_size, page_alignment, &heap->tld->segments);
(rr) 
_mi_segment_page_alloc (heap=0x7f0662b9d340 <_mi_heap_main>, block_size=281474976710656, page_alignment=0, 
    tld=0x7f0662b9bf20 ) at 3rdparty/mimalloc/src/segment.c:1647
1647      if mi_unlikely(page_alignment > MI_BLOCK_ALIGNMENT_MAX) {
(rr) 
1653      else if (block_size arena_id,tld);
(rr) 
mi_segment_huge_page_alloc (size=281474976710656, page_alignment=0, req_arena_id=0, 
    tld=0x7f0662b9bf20 ) at 3rdparty/mimalloc/src/segment.c:1566
1566      mi_page_t* page = NULL;
(rr) 
1567      mi_segment_t* segment = mi_segment_alloc(size,page_alignment,req_arena_id,tld,&page);
(rr) print page
$18 = (mi_page_t *) 0x0
(rr) print tld
$19 = (mi_segments_tld_t *) 0x7f0662b9bf20 
(rr) print *$
$20 = {spans = {{first = 0x0, last = 0x0, slice_count = 1}, {first = 0x0, last = 0x0, slice_count = 1}, {
      first = 0x0, last = 0x0, slice_count = 2}, {first = 0x0, last = 0x0, slice_count = 3}, {first = 0x0, 
      last = 0x0, slice_count = 4}, {first = 0x0, last = 0x0, slice_count = 5}, {first = 0x0, last = 0x0, 
      slice_count = 6}, {first = 0x0, last = 0x0, slice_count = 7}, {first = 0x0, last = 0x0, slice_count = 10}, {
      first = 0x0, last = 0x0, slice_count = 12}, {first = 0x0, last = 0x0, slice_count = 14}, {first = 0x0, 
      last = 0x0, slice_count = 16}, {first = 0x0, last = 0x0, slice_count = 20}, {first = 0x0, last = 0x0, 
      slice_count = 24}, {first = 0x0, last = 0x0, slice_count = 28}, {first = 0x0, last = 0x0, slice_count = 32}, 
    {first = 0x0, last = 0x0, slice_count = 40}, {first = 0x0, last = 0x0, slice_count = 48}, {first = 0x0, 
      last = 0x0, slice_count = 56}, {first = 0x0, last = 0x0, slice_count = 64}, {first = 0x0, last = 0x0, 
      slice_count = 80}, {first = 0x0, last = 0x0, slice_count = 96}, {first = 0x0, last = 0x0, 
      slice_count = 112}, {first = 0x0, last = 0x0, slice_count = 128}, {first = 0x0, last = 0x0, 
      slice_count = 160}, {first = 0x20000008e70, last = 0x20000008e70, slice_count = 192}, {first = 0x0, 
      last = 0x0, slice_count = 224}, {first = 0x0, last = 0x0, slice_count = 256}, {first = 0x0, last = 0x0, 
      slice_count = 320}, {first = 0x0, last = 0x0, slice_count = 384}, {first = 0x0, last = 0x0, 
      slice_count = 448}, {first = 0x0, last = 0x0, slice_count = 512}, {first = 0x0, last = 0x0, 
      slice_count = 640}, {first = 0x0, last = 0x0, slice_count = 768}, {first = 0x0, last = 0x0, 
      slice_count = 896}, {first = 0x0, last = 0x0, slice_count = 1024}}, count = 1, peak_count = 1, 
  current_size = 33554432, peak_size = 33554432, reclaim_count = 0, subproc = 0x7f0662cae600 , 
  stats = 0x7f0662b9c2b8 }
(rr) step
mi_segment_alloc (required=281474976710656, page_alignment=0, req_arena_id=0, tld=0x7f0662b9bf20 , 
    huge_page=0x7ffcac7591c0) at 3rdparty/mimalloc/src/segment.c:896
896       mi_assert_internal((required==0 && huge_page==NULL) || (required>0 && huge_page != NULL));
(rr) 
900       size_t segment_slices = mi_segment_calculate_slices(required, &info_slices);
(rr) 
mi_segment_calculate_slices (required=281474976710656, info_slices=0x7ffcac759120)
    at 3rdparty/mimalloc/src/segment.c:371
371       size_t page_size = _mi_os_page_size();
(rr) 
_mi_os_page_size () at 3rdparty/mimalloc/src/os.c:57
57        return mi_os_mem_config.page_size;
(rr) 
58      }
(rr) 
mi_segment_calculate_slices (required=281474976710656, info_slices=0x7ffcac759120)
    at 3rdparty/mimalloc/src/segment.c:372
372       size_t isize     = _mi_align_up(sizeof(mi_segment_t), page_size);
(rr) 
_mi_align_up (sz=57744, alignment=4096) at 3rdparty/mimalloc/include/mimalloc/internal.h:337
337       mi_assert_internal(alignment != 0);
(rr) 
338       uintptr_t mask = alignment - 1;
(rr) 
339       if ((alignment & mask) == 0) {  // power of two?
(rr) 
340         return ((sz + mask) & ~mask);
(rr) finish
Run till exit from #0  _mi_align_up (sz=57744, alignment=4096) at 3rdparty/mimalloc/include/mimalloc/internal.h:340
0x00007f06623ed169 in mi_segment_calculate_slices (required=281474976710656, info_slices=0x7ffcac759120)
    at 3rdparty/mimalloc/src/segment.c:372
372       size_t isize     = _mi_align_up(sizeof(mi_segment_t), page_size);
Value returned is $21 = 61440
(rr) step
373       size_t guardsize = 0;
(rr) 
384       isize = _mi_align_up(isize + guardsize, MI_SEGMENT_SLICE_SIZE);
(rr) 
_mi_align_up (sz=61440, alignment=65536) at 3rdparty/mimalloc/include/mimalloc/internal.h:337
337       mi_assert_internal(alignment != 0);
(rr) finish
Run till exit from #0  _mi_align_up (sz=61440, alignment=65536)
    at 3rdparty/mimalloc/include/mimalloc/internal.h:337
0x00007f06623ed18d in mi_segment_calculate_slices (required=281474976710656, info_slices=0x7ffcac759120)
    at 3rdparty/mimalloc/src/segment.c:384
384       isize = _mi_align_up(isize + guardsize, MI_SEGMENT_SLICE_SIZE);
Value returned is $22 = 65536
(rr) step
385       if (info_slices != NULL) *info_slices = isize / MI_SEGMENT_SLICE_SIZE;
(rr) 
386       size_t segment_size = (required==0 ? MI_SEGMENT_SIZE : _mi_align_up( required + isize + guardsize, MI_SEGMENT_SLICE_SIZE) );
(rr) 
_mi_align_up (sz=281474976776192, alignment=65536) at 3rdparty/mimalloc/include/mimalloc/internal.h:337
337       mi_assert_internal(alignment != 0);
(rr) finish
Run till exit from #0  _mi_align_up (sz=281474976776192, alignment=65536)
    at 3rdparty/mimalloc/include/mimalloc/internal.h:337
0x00007f06623ed1d0 in mi_segment_calculate_slices (required=281474976710656, info_slices=0x7ffcac759120)
    at 3rdparty/mimalloc/src/segment.c:386
386       size_t segment_size = (required==0 ? MI_SEGMENT_SIZE : _mi_align_up( required + isize + guardsize, MI_SEGMENT_SLICE_SIZE) );
Value returned is $23 = 281474976776192
(rr) print/x $23
$24 = 0x1000000010000
(rr) step
387       mi_assert_internal(segment_size % MI_SEGMENT_SLICE_SIZE == 0);
(rr) 
388       return (segment_size / MI_SEGMENT_SLICE_SIZE);
(rr) 
389     }
(rr) 
mi_segment_alloc (required=281474976710656, page_alignment=0, req_arena_id=0, tld=0x7f0662b9bf20 , 
    huge_page=0x7ffcac7591c0) at 3rdparty/mimalloc/src/segment.c:901
901       mi_assert_internal(segment_slices > 0 && segment_slices  0 && segment_slices  "mi_segment_alloc") at 3rdparty/mimalloc/src/options.c:529
529       _mi_fprintf(NULL, NULL, "mimalloc: assertion failed: at \"%s\":%u, %s\n  assertion: \"%s\"\n", fname, line, (func==NULL?"":func), assertion);
(rr) reverse-finish
Run back to call of #0  _mi_assert_fail (
    assertion=0x7f0662a05288 "segment_slices > 0 && segment_slices  "mi_segment_alloc") at 3rdparty/mimalloc/src/options.c:529
0x00007f06623ef31d in mi_segment_alloc (required=281474976710656, page_alignment=0, req_arena_id=0, 
    tld=0x7f0662b9bf20 , huge_page=0x7ffcac7591c0) at 3rdparty/mimalloc/src/segment.c:901
901       mi_assert_internal(segment_slices > 0 && segment_slices 

The mimalloc version in question is built from commit 94036de6.

timo avatar Apr 07 '25 17:04 timo