-
Notifications
You must be signed in to change notification settings - Fork 28
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add Coarse provider - a memory provider that can manage a memory (i.e. handle the alloc() and free() ops) of a given pre-allocated buffer or of an additional upstream provider (e.g. OS Memory Provider or providers that do not support the free() operation, like the file memory provider and the DevDax memory provider). Developed-by: Rafał Rudnicki <[email protected]> Co-developed-by: Lukasz Dorau <[email protected]> Signed-off-by: Lukasz Dorau <[email protected]>
- Loading branch information
Showing
12 changed files
with
2,296 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
/* | ||
* Copyright (C) 2023-2024 Intel Corporation | ||
* | ||
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT. | ||
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
*/ | ||
|
||
#ifndef UMF_COARSE_PROVIDER_H | ||
#define UMF_COARSE_PROVIDER_H | ||
|
||
#include <stdbool.h> | ||
#include <umf/memory_provider.h> | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
typedef enum coarse_memory_provider_strategy_t { | ||
/// Always allocate a free block of the (size + alignment) size | ||
/// and cut out the properly aligned part leaving two remaining parts. | ||
/// It is the fastest strategy but causes memory fragmentation | ||
/// when alignment is greater than 0. | ||
/// It is the best strategy when alignment always equals 0. | ||
UMF_COARSE_MEMORY_STRATEGY_FASTEST = 0, | ||
|
||
/// First check if the first free block of the 'size' size has the correct alignment. | ||
/// If not, use the `UMF_COARSE_MEMORY_STRATEGY_FASTEST` strategy. | ||
UMF_COARSE_MEMORY_STRATEGY_FASTEST_BUT_ONE, | ||
|
||
/// First look through all free blocks of the 'size' size | ||
/// and choose the first one with the correct alignment. | ||
/// If none of them had the correct alignment, | ||
/// use the `UMF_COARSE_MEMORY_STRATEGY_FASTEST` strategy. | ||
UMF_COARSE_MEMORY_STRATEGY_CHECK_ALL_SIZE, | ||
|
||
/// The maximum value (it has to be the last one). | ||
UMF_COARSE_MEMORY_STRATEGY_MAX | ||
} coarse_memory_provider_strategy_t; | ||
|
||
/// @brief Coarse Memory Provider settings struct. | ||
typedef struct coarse_memory_provider_params_t { | ||
/// Handle to the upstream memory provider. | ||
/// It has to be NULL if init_buffer is set. | ||
/// Exactly one of them has to be non-NULL. | ||
umf_memory_provider_handle_t upstream_memory_provider; | ||
|
||
/// Memory allocation strategy. | ||
/// See coarse_memory_provider_strategy_t for details. | ||
coarse_memory_provider_strategy_t memory_strategy; | ||
|
||
/// Init buffer used to pre-allocate memory at the creation time. | ||
/// It has to be NULL if upstream_memory_provider is set. | ||
/// Exactly one of them has to be non-NULL. | ||
void *init_buffer; | ||
|
||
/// Size of the pre-allocated buffer. If the `init_buffer` is set, | ||
/// the `init_buffer_size` should be the size of this buffer. | ||
size_t init_buffer_size; | ||
|
||
/// When it is true and the upstream_memory_provider is given, | ||
/// the init buffer (of `init_buffer_size` bytes) would be pre-allocated | ||
/// during creation time using the `upstream_memory_provider`. | ||
/// If upstream_memory_provider is not given, | ||
/// the init_buffer is always used instead | ||
/// (regardless of the value of this parameter). | ||
bool immediate_init_from_upstream; | ||
} coarse_memory_provider_params_t; | ||
|
||
/// @brief Coarse Memory Provider stats (TODO move to CTL) | ||
typedef struct coarse_memory_provider_stats_t { | ||
/// Total allocation size. | ||
size_t alloc_size; | ||
|
||
/// Size of used memory. | ||
size_t used_size; | ||
|
||
/// Number of memory blocks allocated from the upstream provider. | ||
size_t num_upstream_blocks; | ||
|
||
/// Total number of allocated memory blocks. | ||
size_t num_all_blocks; | ||
|
||
/// Number of free memory blocks. | ||
size_t num_free_blocks; | ||
} coarse_memory_provider_stats_t; | ||
|
||
umf_memory_provider_ops_t *umfCoarseMemoryProviderOps(void); | ||
|
||
// TODO use CTL | ||
coarse_memory_provider_stats_t | ||
umfCoarseMemoryProviderGetStats(umf_memory_provider_handle_t provider); | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif // UMF_COARSE_PROVIDER_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.