Skip to content

Commit 79dd709

Browse files
committed
Add lock for updating file size in OS memory provider
Add lock for updating file size in OS memory provider, because umfMemoryProviderAlloc() has to be MT-safe. Signed-off-by: Lukasz Dorau <[email protected]>
1 parent 246f051 commit 79dd709

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)