Skip to content

Commit d425888

Browse files
authored
Merge pull request #91 from ldorau/Fix_checking_alignment_in_os_alloc
Fix checking alignment in os_alloc()
2 parents d8ff2cd + 8b78824 commit d425888

File tree

3 files changed

+20
-22
lines changed

3 files changed

+20
-22
lines changed

include/umf/providers/provider_os_memory.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ typedef struct umf_os_memory_provider_params_t {
7878

7979
typedef enum umf_os_memory_provider_native_error {
8080
UMF_OS_RESULT_SUCCESS = UMF_OS_RESULTS_START_FROM,
81-
UMF_OS_RESULT_ERROR_WRONG_ALIGNMENT,
8281
UMF_OS_RESULT_ERROR_ALLOC_FAILED,
8382
UMF_OS_RESULT_ERROR_ADDRESS_NOT_ALIGNED,
8483
UMF_OS_RESULT_ERROR_BIND_FAILED,

src/provider/provider_os_memory.c

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ static __TLS os_last_native_error_t TLS_last_native_error;
4848

4949
// helper values used only in the Native_error_str array
5050
#define _UMF_OS_RESULT_SUCCESS (UMF_OS_RESULT_SUCCESS - UMF_OS_RESULT_SUCCESS)
51-
#define _UMF_OS_RESULT_ERROR_WRONG_ALIGNMENT \
52-
(UMF_OS_RESULT_ERROR_WRONG_ALIGNMENT - UMF_OS_RESULT_SUCCESS)
5351
#define _UMF_OS_RESULT_ERROR_ALLOC_FAILED \
5452
(UMF_OS_RESULT_ERROR_ALLOC_FAILED - UMF_OS_RESULT_SUCCESS)
5553
#define _UMF_OS_RESULT_ERROR_ADDRESS_NOT_ALIGNED \
@@ -65,8 +63,6 @@ static __TLS os_last_native_error_t TLS_last_native_error;
6563

6664
static const char *Native_error_str[] = {
6765
[_UMF_OS_RESULT_SUCCESS] = "success",
68-
[_UMF_OS_RESULT_ERROR_WRONG_ALIGNMENT] =
69-
"wrong alignment (not a power of 2)",
7066
[_UMF_OS_RESULT_ERROR_ALLOC_FAILED] = "memory allocation failed",
7167
[_UMF_OS_RESULT_ERROR_ADDRESS_NOT_ALIGNED] =
7268
"allocated address is not aligned",
@@ -237,6 +233,9 @@ static void os_finalize(void *provider) {
237233
free(os_provider);
238234
}
239235

236+
static umf_result_t os_get_min_page_size(void *provider, void *ptr,
237+
size_t *page_size);
238+
240239
static umf_result_t os_alloc(void *provider, size_t size, size_t alignment,
241240
void **resultPtr) {
242241
int ret;
@@ -248,13 +247,20 @@ static umf_result_t os_alloc(void *provider, size_t size, size_t alignment,
248247
os_memory_provider_t *os_provider = (os_memory_provider_t *)provider;
249248
umf_os_memory_provider_config_t *os_config = &os_provider->config;
250249

251-
if (alignment && (alignment & (alignment - 1))) {
252-
os_store_last_native_error(UMF_OS_RESULT_ERROR_WRONG_ALIGNMENT, 0);
250+
size_t page_size;
251+
umf_result_t result = os_get_min_page_size(provider, NULL, &page_size);
252+
if (result != UMF_RESULT_SUCCESS) {
253+
return result;
254+
}
255+
256+
if (alignment && (alignment % page_size) && (page_size % alignment)) {
253257
if (os_config->traces) {
254-
fprintf(stderr, "wrong alignment (not a power of 2): %zu\n",
255-
alignment);
258+
fprintf(stderr,
259+
"wrong alignment: %zu (not a multiple or a divider of the "
260+
"minimum page size (%zu))\n",
261+
alignment, page_size);
256262
}
257-
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC;
263+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
258264
}
259265

260266
int flags = os_config->visibility;
@@ -272,8 +278,8 @@ static umf_result_t os_alloc(void *provider, size_t size, size_t alignment,
272278
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC;
273279
}
274280

275-
// sanity check - the address should be aligned here
276-
if ((alignment > 0) && ((uintptr_t)addr & (alignment - 1))) {
281+
// verify the alignment
282+
if ((alignment > 0) && ((uintptr_t)addr % alignment)) {
277283
if (os_config->traces) {
278284
os_store_last_native_error(UMF_OS_RESULT_ERROR_ADDRESS_NOT_ALIGNED,
279285
0);

test/provider_os_memory.cpp

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,8 @@ static umf_os_memory_provider_params_t UMF_OS_MEMORY_PROVIDER_PARAMS_TEST = {
2727
};
2828

2929
static const char *Native_error_str[] = {
30-
"success", // UMF_OS_RESULT_SUCCESS
31-
"wrong alignment (not a power of 2)", // UMF_OS_RESULT_ERROR_WRONG_ALIGNMENT
32-
"memory allocation failed", // UMF_OS_RESULT_ERROR_ALLOC_FAILED
30+
"success", // UMF_OS_RESULT_SUCCESS
31+
"memory allocation failed", // UMF_OS_RESULT_ERROR_ALLOC_FAILED
3332
"allocated address is not aligned", // UMF_OS_RESULT_ERROR_ADDRESS_NOT_ALIGNED
3433
"binding memory to NUMA node failed", // UMF_OS_RESULT_ERROR_BIND_FAILED
3534
"memory deallocation failed", // UMF_OS_RESULT_ERROR_FREE_FAILED
@@ -192,15 +191,9 @@ TEST_F(test, provider_os_memory_alloc_WRONG_ALIGNMENT) {
192191
size_t alignment = SIZE_4K - 1; // wrong alignment
193192
umf_result =
194193
umfMemoryProviderAlloc(os_memory_provider, size, alignment, &ptr);
195-
ASSERT_EQ(umf_result, UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC);
194+
ASSERT_EQ(umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT);
196195
ASSERT_EQ(ptr, nullptr);
197196

198-
const char *message;
199-
int32_t error;
200-
umfMemoryProviderGetLastNativeError(os_memory_provider, &message, &error);
201-
ASSERT_EQ(error, UMF_OS_RESULT_ERROR_WRONG_ALIGNMENT);
202-
ASSERT_EQ(compare_native_error_str(message, error), 0);
203-
204197
umfMemoryProviderDestroy(os_memory_provider);
205198
}
206199

0 commit comments

Comments
 (0)