Initial support for softare AESNI_MB DPDK driver only. Have tested (both aesni and QAT seprately and concurrrently) on underlying NVMe devices with bdevio and a bdevperf script that runs IOs from 512B to 128K each with Q depths from 1 to 512 in powers of 2 for 30 seconds each run. QAT can be included in the code (but not makefile) and marked as experimental until we are ready to test in CI. It works well on 2 systems but is a big PITA to get the hardware setup and configured for use with DPDK (IMHO). Change-Id: If518c3df8e74e00efa18afdf194824c5e69778fc Signed-off-by: Paul Luse <paul.e.luse@intel.com> Reviewed-on: https://review.gerrithub.io/403107 Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com>
146 lines
5.5 KiB
C
146 lines
5.5 KiB
C
/*-
|
|
*
|
|
* Copyright(c) 2015-2017 Intel Corporation. All rights reserved.
|
|
* Copyright 2014 6WIND S.A.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in
|
|
* the documentation and/or other materials provided with the
|
|
* distribution.
|
|
* * Neither the name of Intel Corporation nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef _RTE_MEMPOOL_H_
|
|
#define _RTE_MEMPOOL_H_
|
|
|
|
/**
|
|
* @file
|
|
* RTE Mempool.
|
|
*
|
|
* A memory pool is an allocator of fixed-size object. It is
|
|
* identified by its name, and uses a ring to store free objects. It
|
|
* provides some other optional services, like a per-core object
|
|
* cache, and an alignment helper to ensure that objects are padded
|
|
* to spread them equally on all RAM channels, ranks, and so on.
|
|
*
|
|
* Objects owned by a mempool should never be added in another
|
|
* mempool. When an object is freed using rte_mempool_put() or
|
|
* equivalent, the object data is not modified; the user can save some
|
|
* meta-data in the object data and retrieve them when allocating a
|
|
* new object.
|
|
*
|
|
* Note: the mempool implementation is not preemptible. An lcore must not be
|
|
* interrupted by another task that uses the same mempool (because it uses a
|
|
* ring which is not preemptible). Also, usual mempool functions like
|
|
* rte_mempool_get() or rte_mempool_put() are designed to be called from an EAL
|
|
* thread due to the internal per-lcore cache. Due to the lack of caching,
|
|
* rte_mempool_get() or rte_mempool_put() performance will suffer when called
|
|
* by non-EAL threads. Instead, non-EAL threads should call
|
|
* rte_mempool_generic_get() or rte_mempool_generic_put() with a user cache
|
|
* created with rte_mempool_cache_create().
|
|
*/
|
|
|
|
#include <rte_config.h>
|
|
#include <rte_spinlock.h>
|
|
#include <rte_debug.h>
|
|
#include <rte_ring.h>
|
|
#include <rte_memcpy.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* In order to mock some DPDK functions, we place headers here with the name name as the DPDK headers
|
|
* so these definitions wil be picked up. Only what's mocked is included.
|
|
*/
|
|
|
|
STAILQ_HEAD(rte_mempool_objhdr_list, rte_mempool_objhdr);
|
|
STAILQ_HEAD(rte_mempool_memhdr_list, rte_mempool_memhdr);
|
|
struct rte_mempool {
|
|
char name[RTE_MEMZONE_NAMESIZE];
|
|
RTE_STD_C11
|
|
union {
|
|
void *pool_data;
|
|
uint64_t pool_id;
|
|
};
|
|
void *pool_config;
|
|
const struct rte_memzone *mz;
|
|
unsigned int flags;
|
|
int socket_id;
|
|
uint32_t size;
|
|
uint32_t cache_size;
|
|
uint32_t elt_size;
|
|
uint32_t header_size;
|
|
uint32_t trailer_size;
|
|
unsigned private_data_size;
|
|
int32_t ops_index;
|
|
struct rte_mempool_cache *local_cache;
|
|
uint32_t populated_size;
|
|
struct rte_mempool_objhdr_list elt_list;
|
|
uint32_t nb_mem_chunks;
|
|
struct rte_mempool_memhdr_list mem_list;
|
|
#ifdef RTE_LIBRTE_MEMPOOL_DEBUG
|
|
struct rte_mempool_debug_stats stats[RTE_MAX_LCORE];
|
|
#endif
|
|
} __rte_cache_aligned;
|
|
#define RTE_MEMPOOL_OPS_NAMESIZE 32
|
|
typedef int (*rte_mempool_alloc_t)(struct rte_mempool *mp);
|
|
typedef void (*rte_mempool_free_t)(struct rte_mempool *mp);
|
|
typedef int (*rte_mempool_enqueue_t)(struct rte_mempool *mp,
|
|
void *const *obj_table, unsigned int n);
|
|
typedef int (*rte_mempool_dequeue_t)(struct rte_mempool *mp,
|
|
void **obj_table, unsigned int n);
|
|
typedef unsigned(*rte_mempool_get_count)(const struct rte_mempool *mp);
|
|
typedef int (*rte_mempool_get_capabilities_t)(const struct rte_mempool *mp,
|
|
unsigned int *flags);
|
|
typedef int (*rte_mempool_ops_register_memory_area_t)
|
|
(const struct rte_mempool *mp, char *vaddr, rte_iova_t iova, size_t len);
|
|
struct rte_mempool_ops {
|
|
char name[RTE_MEMPOOL_OPS_NAMESIZE];
|
|
rte_mempool_alloc_t alloc;
|
|
rte_mempool_free_t free;
|
|
rte_mempool_enqueue_t enqueue;
|
|
rte_mempool_dequeue_t dequeue;
|
|
rte_mempool_get_count get_count;
|
|
rte_mempool_get_capabilities_t get_capabilities;
|
|
rte_mempool_ops_register_memory_area_t register_memory_area;
|
|
} __rte_cache_aligned;
|
|
#define RTE_MEMPOOL_MAX_OPS_IDX 16
|
|
struct rte_mempool_ops_table {
|
|
rte_spinlock_t sl;
|
|
uint32_t num_ops;
|
|
struct rte_mempool_ops ops[RTE_MEMPOOL_MAX_OPS_IDX];
|
|
} __rte_cache_aligned;
|
|
extern struct rte_mempool_ops_table rte_mempool_ops_table;
|
|
void
|
|
rte_mempool_free(struct rte_mempool *mp);
|
|
static __rte_always_inline void
|
|
rte_mempool_put_bulk(struct rte_mempool *mp, void *const *obj_table,
|
|
unsigned int n);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _RTE_MEMPOOL_H_ */
|