@@ -339,20 +339,23 @@ __attribute__((__noinline__))
339339MoveTextRegionToLargePages(const text_region& r) {
340340 void * nmem = nullptr ;
341341 void * tmem = nullptr ;
342- int ret = 0 ;
343-
344- size_t size = r.to - r.from ;
345342 void * start = r.from ;
343+ size_t size = r.to - r.from ;
344+
345+ auto free_mems = OnScopeLeave ([&nmem, &tmem, size]() {
346+ if (nmem != nullptr && nmem != MAP_FAILED && munmap (nmem, size) == -1 )
347+ PrintSystemError (errno);
348+ if (tmem != nullptr && tmem != MAP_FAILED && munmap (tmem, size) == -1 )
349+ PrintSystemError (errno);
350+ });
346351
347- // Allocate temporary region preparing for copy.
352+ #if !defined (__FreeBSD__)
353+ // Allocate temporary region and back up the code we will re-map.
348354 nmem = mmap (nullptr , size,
349355 PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1 , 0 );
350- if (nmem == MAP_FAILED) {
351- PrintSystemError (errno);
352- return -1 ;
353- }
354-
356+ if (nmem == MAP_FAILED) goto fail;
355357 memcpy (nmem, r.from , size);
358+ #endif
356359
357360#if defined(__linux__)
358361// We already know the original page is r-xp
@@ -362,32 +365,15 @@ MoveTextRegionToLargePages(const text_region& r) {
362365 tmem = mmap (start, size,
363366 PROT_READ | PROT_WRITE | PROT_EXEC,
364367 MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1 , 0 );
365- if (tmem == MAP_FAILED) {
366- PrintSystemError (errno);
367- return -1 ;
368- }
369-
370- ret = madvise (tmem, size, 14 /* MADV_HUGEPAGE */ );
371- if (ret == -1 ) {
372- PrintSystemError (errno);
373- ret = munmap (tmem, size);
374- if (ret == -1 ) {
375- PrintSystemError (errno);
376- }
377- if (-1 == munmap (nmem, size)) PrintSystemError (errno);
378- return -1 ;
379- }
368+ if (tmem == MAP_FAILED) goto fail;
369+ if (madvise (tmem, size, 14 /* MADV_HUGEPAGE */ ) == -1 ) goto fail;
380370 memcpy (start, nmem, size);
381371#elif defined(__FreeBSD__)
382372 tmem = mmap (start, size,
383373 PROT_READ | PROT_WRITE | PROT_EXEC,
384374 MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED |
385375 MAP_ALIGNED_SUPER, -1 , 0 );
386- if (tmem == MAP_FAILED) {
387- PrintSystemError (errno);
388- if (-1 == munmap (nmem, size)) PrintSystemError (errno);
389- return -1 ;
390- }
376+ if (tmem == MAP_FAILED) goto fail;
391377#elif defined(__APPLE__)
392378 // There is not enough room to reserve the mapping close
393379 // to the region address so we content to give a hint
@@ -398,37 +384,20 @@ MoveTextRegionToLargePages(const text_region& r) {
398384 PROT_READ | PROT_WRITE | PROT_EXEC,
399385 MAP_PRIVATE | MAP_ANONYMOUS,
400386 VM_FLAGS_SUPERPAGE_SIZE_2MB, 0 );
401- if (tmem == MAP_FAILED) {
402- PrintSystemError (errno);
403- if (-1 == munmap (nmem, size)) PrintSystemError (errno);
404- return -1 ;
405- }
387+ if (tmem == MAP_FAILED) goto fail;
406388 memcpy (tmem, nmem, size);
407- ret = mprotect (start, size, PROT_READ | PROT_WRITE | PROT_EXEC);
408- if (ret == -1 ) {
409- PrintSystemError (errno);
410- ret = munmap (tmem, size);
411- if (ret == -1 ) {
412- PrintSystemError (errno);
413- }
414- if (-1 == munmap (nmem, size)) PrintSystemError (errno);
415- return -1 ;
416- }
389+ if (mprotect (start, size, PROT_READ | PROT_WRITE | PROT_EXEC) == -1 )
390+ goto fail;
417391 memcpy (start, tmem, size);
418392#endif
419393
420- ret = mprotect (start, size, PROT_READ | PROT_EXEC);
421- if (ret == -1 ) {
422- PrintSystemError (errno);
423- ret = munmap (tmem, size);
424- if (ret == -1 ) {
425- PrintSystemError (errno);
426- }
427- if (-1 == munmap (nmem, size)) PrintSystemError (errno);
428- return -1 ;
429- }
430- if (-1 == munmap (nmem, size)) PrintSystemError (errno);
431- return ret;
394+ if (mprotect (start, size, PROT_READ | PROT_EXEC) == -1 ) goto fail;
395+ // We need not `munmap(tmem, size)` in the above `OnScopeLeave` on success.
396+ tmem = nullptr ;
397+ return 0 ;
398+ fail:
399+ PrintSystemError (errno);
400+ return -1 ;
432401}
433402#endif // defined(NODE_ENABLE_LARGE_CODE_PAGES) && NODE_ENABLE_LARGE_CODE_PAGES
434403
0 commit comments