+ if (!(dev_idx < vec_len (dcm->dev)))
+ return clib_error_return (0, "invalid device index");
+
+ dev = vec_elt_at_index (dcm->dev, dev_idx);
+
+ /* Clear all resources placements */
+ if (free_all)
+ {
+ /* *INDENT-OFF* */
+ vec_foreach (res_idx, dev->used_resources)
+ dpdk_crypto_clear_resource (res_idx[0]);
+ /* *INDENT-ON* */
+
+ return 0;
+ }
+
+ if (!(thread_idx < vec_len (dcm->workers_main)))
+ return clib_error_return (0, "invalid thread index");
+
+ /* Clear placement of device for given thread index */
+ /* *INDENT-OFF* */
+ vec_foreach (res_idx, dev->used_resources)
+ if (dcm->resource[res_idx[0]].thread_idx == thread_idx)
+ break;
+ /* *INDENT-ON* */
+
+ if (!(res_idx < vec_end (dev->used_resources)))
+ return clib_error_return (0, "thread %u is not using device %u",
+ thread_idx, dev_idx);
+
+ dpdk_crypto_clear_resource (res_idx[0]);
+
+ return 0;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (clear_dpdk_crypto_placement, static) = {
+ .path = "clear dpdk crypto placement",
+ .short_help = "clear dpdk crypto placement <device> [<thread>]",
+ .function = clear_dpdk_crypto_placement_fn,
+};
+/* *INDENT-ON* */
+
+u8 *
+format_dpdk_mempool (u8 * s, va_list * args)
+{
+ struct rte_mempool *mp = va_arg (*args, struct rte_mempool *);
+ uword indent = format_get_indent (s);
+ u32 count = rte_mempool_avail_count (mp);
+
+ s = format (s, "%s\n%Uavailable %7d, allocated %7d total %7d\n",
+ mp->name, format_white_space, indent + 2,
+ count, mp->size - count, mp->size);
+ s = format (s, "%Uphys_addr %p, flags %08x, nb_mem_chunks %u\n",
+ format_white_space, indent + 2,
+ mp->mz->phys_addr, mp->flags, mp->nb_mem_chunks);
+ s = format (s, "%Uelt_size %4u, header_size %3u, trailer_size %u\n",
+ format_white_space, indent + 2,
+ mp->elt_size, mp->header_size, mp->trailer_size);
+ s = format (s, "%Uprivate_data_size %3u, total_elt_size %u\n",
+ format_white_space, indent + 2,
+ mp->private_data_size,
+ mp->elt_size + mp->header_size + mp->trailer_size);
+ return s;
+}
+
+static clib_error_t *
+show_dpdk_crypto_pools_fn (vlib_main_t * vm,
+ unformat_input_t * input, vlib_cli_command_t * cmd)
+{
+ dpdk_crypto_main_t *dcm = &dpdk_crypto_main;
+ crypto_data_t *data;
+
+ /* *INDENT-OFF* */
+ vec_foreach (data, dcm->data)
+ {
+ if (data->crypto_op)
+ vlib_cli_output (vm, "%U\n", format_dpdk_mempool, data->crypto_op);
+#if ! DPDK_NO_AEAD
+ if (data->session_h)
+ vlib_cli_output (vm, "%U\n", format_dpdk_mempool, data->session_h);
+
+ struct rte_mempool **mp;
+ vec_foreach (mp, data->session_drv)
+ if (mp[0])
+ vlib_cli_output (vm, "%U\n", format_dpdk_mempool, mp[0]);
+#endif
+ }
+ /* *INDENT-ON* */
+
+#if DPDK_NO_AEAD
+ crypto_dev_t *dev;
+ /* *INDENT-OFF* */
+ vec_foreach (dev, dcm->dev) if (rte_cryptodevs[dev->id].data->session_pool)
+ vlib_cli_output (vm, "%U\n", format_dpdk_mempool,
+ rte_cryptodevs[dev->id].data->session_pool);
+ /* *INDENT-ON* */
+#endif
+
+ return NULL;