fix huge OS page count when a timeout happens (issue #711)

This commit is contained in:
Daan Leijen 2023-03-21 19:42:25 -07:00
parent 1ded6e2dec
commit 70fefec837

View File

@ -526,14 +526,15 @@ void* _mi_os_alloc_huge_os_pages(size_t pages, int numa_node, mi_msecs_t max_mse
// We allocate one page at the time to be able to abort if it takes too long // We allocate one page at the time to be able to abort if it takes too long
// or to at least allocate as many as available on the system. // or to at least allocate as many as available on the system.
mi_msecs_t start_t = _mi_clock_start(); mi_msecs_t start_t = _mi_clock_start();
size_t page; size_t page = 0;
for (page = 0; page < pages; page++) { while (page < pages) {
// allocate a page // allocate a page
void* addr = start + (page * MI_HUGE_OS_PAGE_SIZE); void* addr = start + (page * MI_HUGE_OS_PAGE_SIZE);
void* p = NULL; void* p = NULL;
int err = _mi_prim_alloc_huge_os_pages(addr, MI_HUGE_OS_PAGE_SIZE, numa_node, &p); int err = _mi_prim_alloc_huge_os_pages(addr, MI_HUGE_OS_PAGE_SIZE, numa_node, &p);
if (err != 0) { if (err != 0) {
_mi_warning_message("unable to allocate huge OS page (error: %d (0x%d), address: %p, size: %zx bytes)", err, err, addr, MI_HUGE_OS_PAGE_SIZE); _mi_warning_message("unable to allocate huge OS page (error: %d (0x%d), address: %p, size: %zx bytes)\n", err, err, addr, MI_HUGE_OS_PAGE_SIZE);
break;
} }
// Did we succeed at a contiguous address? // Did we succeed at a contiguous address?
@ -547,6 +548,7 @@ void* _mi_os_alloc_huge_os_pages(size_t pages, int numa_node, mi_msecs_t max_mse
} }
// success, record it // success, record it
page++; // increase before timeout check (see issue #711)
_mi_stat_increase(&_mi_stats_main.committed, MI_HUGE_OS_PAGE_SIZE); _mi_stat_increase(&_mi_stats_main.committed, MI_HUGE_OS_PAGE_SIZE);
_mi_stat_increase(&_mi_stats_main.reserved, MI_HUGE_OS_PAGE_SIZE); _mi_stat_increase(&_mi_stats_main.reserved, MI_HUGE_OS_PAGE_SIZE);
@ -560,7 +562,7 @@ void* _mi_os_alloc_huge_os_pages(size_t pages, int numa_node, mi_msecs_t max_mse
} }
} }
if (elapsed > max_msecs) { if (elapsed > max_msecs) {
_mi_warning_message("huge page allocation timed out\n"); _mi_warning_message("huge OS page allocation timed out (after allocating %zu page(s))\n", page);
break; break;
} }
} }