@@ -263,22 +263,38 @@ static umf_result_t file_mmap_aligned(file_memory_provider_t *file_provider,
263
263
return UMF_RESULT_ERROR_INVALID_ARGUMENT ; // arithmetic overflow
264
264
}
265
265
266
- if (offset_fd + extended_size > size_fd ) {
267
- if (utils_fallocate (fd , offset_fd , extended_size )) {
266
+ // offset_fd has to be also page-aligned since it is the offset of mmap()
267
+ size_t aligned_offset_fd = offset_fd ;
268
+ rest = aligned_offset_fd & (page_size - 1 );
269
+ if (rest ) {
270
+ aligned_offset_fd += page_size - rest ;
271
+ }
272
+ if (aligned_offset_fd < offset_fd ) {
273
+ LOG_ERR ("arithmetic overflow of file offset" );
274
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ; // arithmetic overflow
275
+ }
276
+
277
+ if (aligned_offset_fd + extended_size > size_fd ) {
278
+ size_t new_size_fd = aligned_offset_fd + extended_size ;
279
+ if (utils_fallocate (fd , size_fd , new_size_fd - size_fd )) {
268
280
LOG_ERR ("cannot grow the file size from %zu to %zu" , size_fd ,
269
- offset_fd + extended_size );
281
+ new_size_fd );
270
282
return UMF_RESULT_ERROR_UNKNOWN ;
271
283
}
272
284
273
- LOG_DEBUG ("file size grown from %zu to %zu" , size_fd ,
274
- offset_fd + extended_size );
275
- file_provider -> size_fd = size_fd = offset_fd + extended_size ;
285
+ LOG_DEBUG ("file size grown from %zu to %zu" , size_fd , new_size_fd );
286
+ file_provider -> size_fd = new_size_fd ;
287
+ }
288
+
289
+ if (aligned_offset_fd > offset_fd ) {
290
+ file_provider -> offset_fd = aligned_offset_fd ;
276
291
}
277
292
278
293
ASSERT_IS_ALIGNED (extended_size , page_size );
279
- ASSERT_IS_ALIGNED (offset_fd , page_size );
294
+ ASSERT_IS_ALIGNED (aligned_offset_fd , page_size );
280
295
281
- void * ptr = utils_mmap_file (NULL , extended_size , prot , flag , fd , offset_fd );
296
+ void * ptr =
297
+ utils_mmap_file (NULL , extended_size , prot , flag , fd , aligned_offset_fd );
282
298
if (ptr == NULL ) {
283
299
LOG_PERR ("memory mapping failed" );
284
300
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
@@ -292,6 +308,10 @@ static umf_result_t file_mmap_aligned(file_memory_provider_t *file_provider,
292
308
ptr , extended_size );
293
309
}
294
310
311
+ LOG_DEBUG (
312
+ "inserted a value to the map of memory mapping (addr=%p, size=%zu)" ,
313
+ ptr , extended_size );
314
+
295
315
file_provider -> base_mmap = ptr ;
296
316
file_provider -> size_mmap = extended_size ;
297
317
file_provider -> offset_mmap = 0 ;
@@ -335,19 +355,31 @@ static umf_result_t file_alloc_aligned(file_memory_provider_t *file_provider,
335
355
}
336
356
337
357
size_t new_offset_mmap = new_aligned_ptr - (uintptr_t )base_mmap ;
358
+ size_t new_offset_fd =
359
+ file_provider -> offset_fd + new_offset_mmap - file_provider -> offset_mmap ;
360
+
338
361
if (file_provider -> size_mmap - new_offset_mmap < size ) {
339
362
umf_result = file_mmap_aligned (file_provider , size , alignment );
340
363
if (umf_result != UMF_RESULT_SUCCESS ) {
341
364
utils_mutex_unlock (& file_provider -> lock );
342
365
return umf_result ;
343
366
}
367
+
368
+ assert (file_provider -> base_mmap );
369
+
370
+ // file_provider-> base_mmap, offset_mmap, offset_fd
371
+ // were updated by file_mmap_aligned():
372
+ new_aligned_ptr = (uintptr_t )file_provider -> base_mmap ;
373
+ new_offset_mmap = 0 ; // == file_provider->offset_mmap
374
+ new_offset_fd = file_provider -> offset_fd ;
375
+
376
+ ASSERT_IS_ALIGNED (new_aligned_ptr , alignment );
344
377
}
345
378
346
- size_t old_offset_mmap = file_provider -> offset_mmap ;
347
- file_provider -> offset_mmap = new_offset_mmap ;
348
- * alloc_offset_fd =
349
- file_provider -> offset_fd + new_offset_mmap - old_offset_mmap ;
350
- file_provider -> offset_fd = * alloc_offset_fd + size ;
379
+ * alloc_offset_fd = new_offset_fd ;
380
+
381
+ file_provider -> offset_fd = new_offset_fd + size ;
382
+ file_provider -> offset_mmap = new_offset_mmap + size ;
351
383
352
384
* out_addr = (void * )new_aligned_ptr ;
353
385
0 commit comments