Skip to content

Commit 6f74530

Browse files
authored
Merge pull request #622 from ldorau/Add_lock_for_updating_file_size_in_OS_memory_provider
Add lock for updating file size in OS memory provider
2 parents ba2cafc + 79dd709 commit 6f74530

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

src/provider/provider_os_memory.c

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,14 @@ static umf_result_t os_initialize(void *params, void **provider) {
525525
goto err_destroy_bitmaps;
526526
}
527527

528+
if (os_provider->fd > 0) {
529+
if (util_mutex_init(&os_provider->lock_fd) == NULL) {
530+
LOG_ERR("initializing the file size lock failed");
531+
ret = UMF_RESULT_ERROR_UNKNOWN;
532+
goto err_destroy_bitmaps;
533+
}
534+
}
535+
528536
os_provider->nodeset_str_buf = umf_ba_global_alloc(NODESET_STR_BUF_LEN);
529537
if (!os_provider->nodeset_str_buf) {
530538
LOG_INFO("allocating memory for printing NUMA nodes failed");
@@ -562,6 +570,10 @@ static void os_finalize(void *provider) {
562570

563571
os_memory_provider_t *os_provider = provider;
564572

573+
if (os_provider->fd > 0) {
574+
util_mutex_destroy_not_free(&os_provider->lock_fd);
575+
}
576+
565577
critnib_delete(os_provider->fd_offset_map);
566578

567579
free_bitmaps(os_provider);
@@ -624,8 +636,8 @@ static inline void assert_is_page_aligned(uintptr_t ptr, size_t page_size) {
624636

625637
static int os_mmap_aligned(void *hint_addr, size_t length, size_t alignment,
626638
size_t page_size, int prot, int flag, int fd,
627-
size_t max_fd_size, void **out_addr,
628-
size_t *fd_size) {
639+
size_t max_fd_size, os_mutex_t *lock_fd,
640+
void **out_addr, size_t *fd_size) {
629641
assert(out_addr);
630642

631643
size_t extended_length = length;
@@ -641,13 +653,20 @@ static int os_mmap_aligned(void *hint_addr, size_t length, size_t alignment,
641653
size_t fd_offset = 0;
642654

643655
if (fd > 0) {
656+
if (util_mutex_lock(lock_fd)) {
657+
LOG_ERR("locking file size failed");
658+
return -1;
659+
}
660+
644661
if (*fd_size + extended_length > max_fd_size) {
662+
util_mutex_unlock(lock_fd);
645663
LOG_ERR("cannot grow a file size beyond %zu", max_fd_size);
646664
return -1;
647665
}
648666

649667
fd_offset = *fd_size;
650668
*fd_size += extended_length;
669+
util_mutex_unlock(lock_fd);
651670
}
652671

653672
void *ptr = os_mmap(hint_addr, extended_length, prot, flag, fd, fd_offset);
@@ -899,11 +918,11 @@ static umf_result_t os_alloc(void *provider, size_t size, size_t alignment,
899918
errno = 0;
900919
ret = os_mmap_aligned(NULL, size, alignment, page_size,
901920
os_provider->protection, os_provider->visibility,
902-
os_provider->fd, os_provider->max_size_fd, &addr,
903-
&os_provider->size_fd);
921+
os_provider->fd, os_provider->max_size_fd,
922+
&os_provider->lock_fd, &addr, &os_provider->size_fd);
904923
if (ret) {
905-
os_store_last_native_error(UMF_OS_RESULT_ERROR_ALLOC_FAILED, errno);
906-
LOG_PERR("memory allocation failed");
924+
os_store_last_native_error(UMF_OS_RESULT_ERROR_ALLOC_FAILED, 0);
925+
LOG_ERR("memory allocation failed");
907926
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC;
908927
}
909928

src/provider/provider_os_memory_internal.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "critnib.h"
1414
#include "umf_hwloc.h"
1515
#include "utils_common.h"
16+
#include "utils_concurrency.h"
1617

1718
#ifdef __cplusplus
1819
extern "C" {
@@ -33,6 +34,8 @@ typedef struct os_memory_provider_t {
3334
int fd; // file descriptor for memory mapping
3435
size_t size_fd; // size of file used for memory mapping
3536
size_t max_size_fd; // maximum size of file used for memory mapping
37+
os_mutex_t lock_fd; // lock for updating file size
38+
3639
// A critnib map storing (ptr, fd_offset + 1) pairs. We add 1 to fd_offset
3740
// in order to be able to store fd_offset equal 0, because
3841
// critnib_get() returns value or NULL, so a value cannot equal 0.

0 commit comments

Comments
 (0)