* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
+/**
+ * @cond DPDK
+ * @file
+ *
+ * Allocate/free network buffers with DPDK.
+ */
+
#include <rte_config.h>
#include <rte_common.h>
#include <rte_ring.h>
#include <rte_mempool.h>
#include <rte_mbuf.h>
+#include <rte_version.h>
#include <vlib/vlib.h>
vlib_buffer_main_t *bm = vm->buffer_main;
vlib_physmem_main_t *vpm = &vm->physmem_main;
struct rte_mempool *rmp;
- uword new_start, new_size;
int i;
if (!rte_pktmbuf_pool_create)
VLIB_BUFFER_PRE_DATA_SIZE + VLIB_BUFFER_DATA_SIZE, /* dataroom size */
socket_id); /* cpu socket */
- vec_free (pool_name);
-
if (rmp)
{
- new_start = pointer_to_uword (rmp);
- new_size = rmp->elt_va_end - new_start;
+ {
+ uword this_pool_end;
+ uword this_pool_start;
+ uword this_pool_size;
+ uword save_vpm_start, save_vpm_end, save_vpm_size;
+ struct rte_mempool_memhdr *memhdr;
- if (vpm->virtual.size > 0)
- {
- ASSERT (new_start != vpm->virtual.start);
- if (new_start < vpm->virtual.start)
- {
- new_size = vpm->virtual.size + vpm->virtual.start - new_start;
- }
- else
- {
- new_size += new_start - vpm->virtual.start;
- new_start = vpm->virtual.start;
- }
+ this_pool_start = ~0ULL;
+ this_pool_end = 0LL;
- /* check if fits into buffer index range */
- if ((u64) new_size > ((u64) 1 << (32 + CLIB_LOG2_CACHE_LINE_BYTES)))
+ STAILQ_FOREACH (memhdr, &rmp->mem_list, next)
+ {
+ if (((uword) (memhdr->addr + memhdr->len)) > this_pool_end)
+ this_pool_end = (uword) (memhdr->addr + memhdr->len);
+ if (((uword) memhdr->addr) < this_pool_start)
+ this_pool_start = (uword) (memhdr->addr);
+ }
+ ASSERT (this_pool_start < ~0ULL && this_pool_end > 0);
+ this_pool_size = this_pool_end - this_pool_start;
+
+ if (CLIB_DEBUG > 1)
+ {
+ clib_warning ("%s: pool start %llx pool end %llx pool size %lld",
+ pool_name, this_pool_start, this_pool_end,
+ this_pool_size);
+ clib_warning
+ ("before: virtual.start %llx virtual.end %llx virtual.size %lld",
+ vpm->virtual.start, vpm->virtual.end, vpm->virtual.size);
+ }
+
+ save_vpm_start = vpm->virtual.start;
+ save_vpm_end = vpm->virtual.end;
+ save_vpm_size = vpm->virtual.size;
+
+ if ((this_pool_start < vpm->virtual.start) || vpm->virtual.start == 0)
+ vpm->virtual.start = this_pool_start;
+ if (this_pool_end > vpm->virtual.end)
+ vpm->virtual.end = this_pool_end;
+
+ vpm->virtual.size = vpm->virtual.end - vpm->virtual.start;
+
+ if (CLIB_DEBUG > 1)
+ {
+ clib_warning
+ ("after: virtual.start %llx virtual.end %llx virtual.size %lld",
+ vpm->virtual.start, vpm->virtual.end, vpm->virtual.size);
+ }
+
+ /* check if fits into buffer index range */
+ if ((u64) vpm->virtual.size >
+ ((u64) 1 << (32 + CLIB_LOG2_CACHE_LINE_BYTES)))
+ {
+ clib_warning ("physmem: virtual size out of range!");
+ vpm->virtual.start = save_vpm_start;
+ vpm->virtual.end = save_vpm_end;
+ vpm->virtual.size = save_vpm_size;
rmp = 0;
+ }
+ }
+ if (rmp)
+ {
+ bm->pktmbuf_pools[socket_id] = rmp;
+ vec_free (pool_name);
+ return 0;
}
}
- if (rmp)
- {
- bm->pktmbuf_pools[socket_id] = rmp;
- vpm->virtual.start = new_start;
- vpm->virtual.size = new_size;
- vpm->virtual.end = new_start + new_size;
- return 0;
- }
+ vec_free (pool_name);
/* no usable pool for this socket, try to use pool from another one */
for (i = 0; i < vec_len (bm->pktmbuf_pools); i++)
VLIB_INIT_FUNCTION (buffer_state_validation_init);
#endif
+/** @endcond */
/*
* fd.io coding-style-patch-verification: ON
*