blob: 007cb7b3f4e1768cbc33f5b0d01e17b5a52a2c1d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
/* Copyright (c) 2019, Nokia
* Copyright (c) 2013-2018, Linaro Limited
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
/**
* @file
*
* ODP buffer pool - internal header
*/
#ifndef ODP_POOL_INTERNAL_H_
#define ODP_POOL_INTERNAL_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <odp/api/shared_memory.h>
#include <odp/api/ticketlock.h>
#include <odp_buffer_internal.h>
#include <odp_config_internal.h>
#include <odp_ring_ptr_internal.h>
#include <odp/api/plat/strong_types.h>
typedef struct ODP_ALIGNED_CACHE pool_cache_t {
/* Number of buffers in cache */
uint32_t cache_num;
/* Cached buffers */
odp_buffer_hdr_t *buf_hdr[CONFIG_POOL_CACHE_MAX_SIZE];
} pool_cache_t;
/* Buffer header ring */
typedef struct ODP_ALIGNED_CACHE {
/* Ring header */
ring_ptr_t hdr;
/* Ring data: buffer handles */
odp_buffer_hdr_t *buf_hdr[CONFIG_POOL_MAX_NUM + 1];
} pool_ring_t;
/* Callback function for pool destroy */
typedef void (*pool_destroy_cb_fn)(void *pool);
typedef struct pool_t {
odp_ticketlock_t lock ODP_ALIGNED_CACHE;
char name[ODP_POOL_NAME_LEN];
odp_pool_param_t params;
odp_pool_t pool_hdl;
uint32_t pool_idx;
uint32_t ring_mask;
uint32_t cache_size;
uint32_t burst_size;
odp_shm_t shm;
odp_shm_t uarea_shm;
uint64_t shm_size;
uint64_t uarea_shm_size;
int reserved;
uint32_t num;
uint32_t align;
uint32_t headroom;
uint32_t tailroom;
uint32_t seg_len;
uint32_t max_seg_len;
uint32_t max_len;
uint32_t uarea_size;
uint32_t block_size;
uint32_t block_offset;
uint8_t *base_addr;
uint8_t *uarea_base_addr;
/* Used by DPDK zero-copy pktio */
uint32_t dpdk_elt_size;
uint32_t skipped_blocks;
uint8_t pool_in_use;
uint8_t mem_from_huge_pages;
pool_destroy_cb_fn ext_destroy;
void *ext_desc;
pool_cache_t local_cache[ODP_THREAD_COUNT_MAX];
odp_shm_t ring_shm;
pool_ring_t *ring;
} pool_t;
typedef struct pool_global_t {
pool_t pool[ODP_CONFIG_POOLS];
odp_shm_t shm;
struct {
uint32_t pkt_max_num;
uint32_t local_cache_size;
uint32_t burst_size;
uint32_t pkt_base_align;
uint32_t buf_min_align;
} config;
} pool_global_t;
extern pool_global_t *_odp_pool_glb;
static inline pool_t *pool_entry(uint32_t pool_idx)
{
return &_odp_pool_glb->pool[pool_idx];
}
static inline pool_t *pool_entry_from_hdl(odp_pool_t pool_hdl)
{
return &_odp_pool_glb->pool[_odp_typeval(pool_hdl) - 1];
}
static inline odp_buffer_hdr_t *buf_hdl_to_hdr(odp_buffer_t buf)
{
return (odp_buffer_hdr_t *)(uintptr_t)buf;
}
static inline odp_buffer_hdr_t *buf_hdr_from_index(pool_t *pool,
uint32_t buffer_idx)
{
uint64_t block_offset;
odp_buffer_hdr_t *buf_hdr;
block_offset = (buffer_idx * (uint64_t)pool->block_size) +
pool->block_offset;
/* clang requires cast to uintptr_t */
buf_hdr = (odp_buffer_hdr_t *)(uintptr_t)&pool->base_addr[block_offset];
return buf_hdr;
}
static inline odp_buffer_hdr_t *buf_hdr_from_index_u32(uint32_t u32)
{
buffer_index_t index;
uint32_t pool_idx, buffer_idx;
pool_t *pool;
index.u32 = u32;
pool_idx = index.pool;
buffer_idx = index.buffer;
pool = pool_entry(pool_idx);
return buf_hdr_from_index(pool, buffer_idx);
}
int buffer_alloc_multi(pool_t *pool, odp_buffer_hdr_t *buf_hdr[], int num);
void buffer_free_multi(odp_buffer_hdr_t *buf_hdr[], int num_free);
#ifdef __cplusplus
}
#endif
#endif
|