mempool: add flag for removing phys contiguous constraint
Add a new flag to remove the constraint of having physically contiguous objects inside a mempool. Add this flag to the log history mempool to start, but we could add it in most cases where objects are not mbufs. Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
This commit is contained in:
parent
85cf00791c
commit
ce94a51ff0
@ -311,7 +311,7 @@ rte_eal_common_log_init(FILE *default_log)
|
||||
LOG_ELT_SIZE, 0, 0,
|
||||
NULL, NULL,
|
||||
NULL, NULL,
|
||||
SOCKET_ID_ANY, 0);
|
||||
SOCKET_ID_ANY, MEMPOOL_F_NO_PHYS_CONTIG);
|
||||
|
||||
if ((log_history_mp == NULL) &&
|
||||
((log_history_mp = rte_mempool_lookup(LOG_HISTORY_MP_NAME)) == NULL)){
|
||||
|
@ -413,6 +413,10 @@ rte_mempool_populate_phys(struct rte_mempool *mp, char *vaddr,
|
||||
|
||||
while (off + total_elt_sz <= len && mp->populated_size < mp->size) {
|
||||
off += mp->header_size;
|
||||
if (paddr == RTE_BAD_PHYS_ADDR)
|
||||
mempool_add_elem(mp, (char *)vaddr + off,
|
||||
RTE_BAD_PHYS_ADDR);
|
||||
else
|
||||
mempool_add_elem(mp, (char *)vaddr + off, paddr + off);
|
||||
off += mp->elt_size + mp->trailer_size;
|
||||
i++;
|
||||
@ -443,6 +447,10 @@ rte_mempool_populate_phys_tab(struct rte_mempool *mp, char *vaddr,
|
||||
if (mp->nb_mem_chunks != 0)
|
||||
return -EEXIST;
|
||||
|
||||
if (mp->flags & MEMPOOL_F_NO_PHYS_CONTIG)
|
||||
return rte_mempool_populate_phys(mp, vaddr, RTE_BAD_PHYS_ADDR,
|
||||
pg_num * pg_sz, free_cb, opaque);
|
||||
|
||||
for (i = 0; i < pg_num && mp->populated_size < mp->size; i += n) {
|
||||
|
||||
/* populate with the largest group of contiguous pages */
|
||||
@ -484,6 +492,10 @@ rte_mempool_populate_virt(struct rte_mempool *mp, char *addr,
|
||||
if (RTE_ALIGN_CEIL(len, pg_sz) != len)
|
||||
return -EINVAL;
|
||||
|
||||
if (mp->flags & MEMPOOL_F_NO_PHYS_CONTIG)
|
||||
return rte_mempool_populate_phys(mp, addr, RTE_BAD_PHYS_ADDR,
|
||||
len, free_cb, opaque);
|
||||
|
||||
for (off = 0; off + pg_sz <= len &&
|
||||
mp->populated_size < mp->size; off += phys_len) {
|
||||
|
||||
@ -534,6 +546,7 @@ rte_mempool_populate_default(struct rte_mempool *mp)
|
||||
char mz_name[RTE_MEMZONE_NAMESIZE];
|
||||
const struct rte_memzone *mz;
|
||||
size_t size, total_elt_sz, align, pg_sz, pg_shift;
|
||||
phys_addr_t paddr;
|
||||
unsigned mz_id, n;
|
||||
int ret;
|
||||
|
||||
@ -573,10 +586,14 @@ rte_mempool_populate_default(struct rte_mempool *mp)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* use memzone physical address if it is valid */
|
||||
if (mp->flags & MEMPOOL_F_NO_PHYS_CONTIG)
|
||||
paddr = RTE_BAD_PHYS_ADDR;
|
||||
else
|
||||
paddr = mz->phys_addr;
|
||||
|
||||
if (rte_eal_has_hugepages() && !rte_xen_dom0_supported())
|
||||
ret = rte_mempool_populate_phys(mp, mz->addr,
|
||||
mz->phys_addr, mz->len,
|
||||
paddr, mz->len,
|
||||
rte_mempool_memchunk_mz_free,
|
||||
(void *)(uintptr_t)mz);
|
||||
else
|
||||
|
@ -236,6 +236,7 @@ struct rte_mempool {
|
||||
#define MEMPOOL_F_SP_PUT 0x0004 /**< Default put is "single-producer".*/
|
||||
#define MEMPOOL_F_SC_GET 0x0008 /**< Default get is "single-consumer".*/
|
||||
#define MEMPOOL_F_RING_CREATED 0x0010 /**< Internal: ring is created */
|
||||
#define MEMPOOL_F_NO_PHYS_CONTIG 0x0020 /**< Don't need physically contiguous objs. */
|
||||
|
||||
/**
|
||||
* @internal When debug is enabled, store some statistics.
|
||||
@ -421,6 +422,8 @@ typedef void (rte_mempool_ctor_t)(struct rte_mempool *, void *);
|
||||
* - MEMPOOL_F_SC_GET: If this flag is set, the default behavior
|
||||
* when using rte_mempool_get() or rte_mempool_get_bulk() is
|
||||
* "single-consumer". Otherwise, it is "multi-consumers".
|
||||
* - MEMPOOL_F_NO_PHYS_CONTIG: If set, allocated objects won't
|
||||
* necessarilly be contiguous in physical memory.
|
||||
* @return
|
||||
* The pointer to the new allocated mempool, on success. NULL on error
|
||||
* with rte_errno set appropriately. Possible rte_errno values include:
|
||||
@ -1226,6 +1229,8 @@ rte_mempool_empty(const struct rte_mempool *mp)
|
||||
* A pointer (virtual address) to the element of the pool.
|
||||
* @return
|
||||
* The physical address of the elt element.
|
||||
* If the mempool was created with MEMPOOL_F_NO_PHYS_CONTIG, the
|
||||
* returned value is RTE_BAD_PHYS_ADDR.
|
||||
*/
|
||||
static inline phys_addr_t
|
||||
rte_mempool_virt2phy(__rte_unused const struct rte_mempool *mp, const void *elt)
|
||||
|
Loading…
Reference in New Issue
Block a user