env: add malloc variants with DMA/shareable flags
This will allow environment abstraction layers to provide different types of memory depending on whether it needs to be DMA-able and/or shared across multi-process boundaries. For the DPDK environment, the flags can be ignored, since rte_malloc() supports both DMA-able and shared memory. Change-Id: I5ee894337dd9d6e24418848c0a35f131184383c8 Signed-off-by: zkhatami88 <z.khatami88@gmail.com> Reviewed-on: https://review.gerrithub.io/402334 Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com> Reviewed-by: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com> Tested-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
parent
f9d52c9ebd
commit
a77cd3f75c
@ -13,6 +13,12 @@ for additional information on the DPDK vulnerability.
|
||||
|
||||
Add wrapper for DPDK rte_mempool_get_bulk() via spdk_mempool_get_bulk().
|
||||
|
||||
New memory management functions spdk_malloc(), spdk_zmalloc(), and spdk_free() have been added.
|
||||
These new functions have a `flags` parameter that allows the user to specify whether the allocated
|
||||
memory needs to be suitable for DMA and whether it should be shared across processes with the same
|
||||
shm_id. The new functions are intended to replace spdk_dma_malloc() and related functions, which will
|
||||
eventually be deprecated and removed.
|
||||
|
||||
### Bdev
|
||||
|
||||
Add new optional bdev module interface function, init_complete, to notify bdev modules
|
||||
|
@ -48,6 +48,16 @@ extern "C" {
|
||||
#define SPDK_ENV_SOCKET_ID_ANY (-1)
|
||||
#define SPDK_ENV_LCORE_ID_ANY (UINT32_MAX)
|
||||
|
||||
/**
|
||||
* Memory is dma-safe.
|
||||
*/
|
||||
#define SPDK_MALLOC_DMA 0x01
|
||||
|
||||
/**
|
||||
* Memory is sharable across process boundries.
|
||||
*/
|
||||
#define SPDK_MALLOC_SHARE 0x02
|
||||
|
||||
struct spdk_pci_device;
|
||||
|
||||
/**
|
||||
@ -67,6 +77,52 @@ struct spdk_env_opts {
|
||||
void *env_context;
|
||||
};
|
||||
|
||||
/**
|
||||
* Allocate dma/sharable memory based on a given dma_flg. It is a physically
|
||||
* contiguous memory buffer with the given size, alignment and socket id.
|
||||
*
|
||||
* \param size Size in bytes.
|
||||
* \param align Alignment value for the allocated memory. If '0', the allocated
|
||||
* buffer is suitably aligned (in the same manner as malloc()). Otherwise, the
|
||||
* allocated buffer is aligned to the multiple of align. In this case, it must
|
||||
* be a power of two.
|
||||
* \param phys_addr A pointer to the variable to hold the physical address of
|
||||
* the allocated buffer is passed. If NULL, the physical address is not returned.
|
||||
* \param socket_id Socket ID to allocate memory on, or SPDK_ENV_SOCKET_ID_ANY
|
||||
* for any socket.
|
||||
* \param flags Combination of SPDK_MALLOC flags (\ref SPDK_MALLOC_DMA, \ref SPDK_MALLOC_SHARE).
|
||||
*
|
||||
* \return a pointer to the allocated memory buffer.
|
||||
*/
|
||||
void *spdk_malloc(size_t size, size_t align, uint64_t *phys_addr, int socket_id, uint32_t flags);
|
||||
|
||||
/**
|
||||
* Allocate dma/sharable memory based on a given dma_flg. It is a physically
|
||||
* contiguous memory buffer with the given size, alignment and socket id.
|
||||
* Also, the buffer will be zeroed.
|
||||
*
|
||||
* \param size Size in bytes.
|
||||
* \param align Alignment value for the allocated memory. If '0', the allocated
|
||||
* buffer is suitably aligned (in the same manner as malloc()). Otherwise, the
|
||||
* allocated buffer is aligned to the multiple of align. In this case, it must
|
||||
* be a power of two.
|
||||
* \param phys_addr A pointer to the variable to hold the physical address of
|
||||
* the allocated buffer is passed. If NULL, the physical address is not returned.
|
||||
* \param socket_id Socket ID to allocate memory on, or SPDK_ENV_SOCKET_ID_ANY
|
||||
* for any socket.
|
||||
* \param flags Combination of SPDK_MALLOC flags (\ref SPDK_MALLOC_DMA, \ref SPDK_MALLOC_SHARE).
|
||||
*
|
||||
* \return a pointer to the allocated memory buffer.
|
||||
*/
|
||||
void *spdk_zmalloc(size_t size, size_t align, uint64_t *phys_addr, int socket_id, uint32_t flags);
|
||||
|
||||
/**
|
||||
* Free buffer memory that was previously allocated with spdk_malloc() or spdk_zmalloc().
|
||||
*
|
||||
* \param buf Buffer to free.
|
||||
*/
|
||||
void spdk_free(void *buf);
|
||||
|
||||
/**
|
||||
* Initialize the default value of opts.
|
||||
*
|
||||
|
@ -63,7 +63,7 @@ virt_to_phys(void *vaddr)
|
||||
}
|
||||
|
||||
void *
|
||||
spdk_dma_malloc_socket(size_t size, size_t align, uint64_t *phys_addr, int socket_id)
|
||||
spdk_malloc(size_t size, size_t align, uint64_t *phys_addr, int socket_id, uint32_t flags)
|
||||
{
|
||||
void *buf = rte_malloc_socket(NULL, size, align, socket_id);
|
||||
if (buf && phys_addr) {
|
||||
@ -73,15 +73,33 @@ spdk_dma_malloc_socket(size_t size, size_t align, uint64_t *phys_addr, int socke
|
||||
}
|
||||
|
||||
void *
|
||||
spdk_dma_zmalloc_socket(size_t size, size_t align, uint64_t *phys_addr, int socket_id)
|
||||
spdk_zmalloc(size_t size, size_t align, uint64_t *phys_addr, int socket_id, uint32_t flags)
|
||||
{
|
||||
void *buf = spdk_dma_malloc_socket(size, align, phys_addr, socket_id);
|
||||
void *buf = spdk_malloc(size, align, phys_addr, socket_id, flags);
|
||||
if (buf) {
|
||||
memset(buf, 0, size);
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
void
|
||||
spdk_free(void *buf)
|
||||
{
|
||||
rte_free(buf);
|
||||
}
|
||||
|
||||
void *
|
||||
spdk_dma_malloc_socket(size_t size, size_t align, uint64_t *phys_addr, int socket_id)
|
||||
{
|
||||
return spdk_malloc(size, align, phys_addr, socket_id, (SPDK_MALLOC_DMA | SPDK_MALLOC_SHARE));
|
||||
}
|
||||
|
||||
void *
|
||||
spdk_dma_zmalloc_socket(size_t size, size_t align, uint64_t *phys_addr, int socket_id)
|
||||
{
|
||||
return spdk_zmalloc(size, align, phys_addr, socket_id, (SPDK_MALLOC_DMA | SPDK_MALLOC_SHARE));
|
||||
}
|
||||
|
||||
void *
|
||||
spdk_dma_malloc(size_t size, size_t align, uint64_t *phys_addr)
|
||||
{
|
||||
@ -107,7 +125,7 @@ spdk_dma_realloc(void *buf, size_t size, size_t align, uint64_t *phys_addr)
|
||||
void
|
||||
spdk_dma_free(void *buf)
|
||||
{
|
||||
rte_free(buf);
|
||||
spdk_free(buf);
|
||||
}
|
||||
|
||||
void *
|
||||
|
Loading…
Reference in New Issue
Block a user