| 2591 | |
| 2592 | |
| 2593 | struct rte_mempool * |
| 2594 | rte_crypto_op_pool_create(const char *name, enum rte_crypto_op_type type, |
| 2595 | unsigned nb_elts, unsigned cache_size, uint16_t priv_size, |
| 2596 | int socket_id) |
| 2597 | { |
| 2598 | struct rte_crypto_op_pool_private *priv; |
| 2599 | |
| 2600 | unsigned elt_size = sizeof(struct rte_crypto_op) + |
| 2601 | priv_size; |
| 2602 | |
| 2603 | if (type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) { |
| 2604 | elt_size += sizeof(struct rte_crypto_sym_op); |
| 2605 | } else if (type == RTE_CRYPTO_OP_TYPE_ASYMMETRIC) { |
| 2606 | elt_size += sizeof(struct rte_crypto_asym_op); |
| 2607 | } else if (type == RTE_CRYPTO_OP_TYPE_UNDEFINED) { |
| 2608 | elt_size += RTE_MAX(sizeof(struct rte_crypto_sym_op), |
| 2609 | sizeof(struct rte_crypto_asym_op)); |
| 2610 | } else { |
| 2611 | CDEV_LOG_ERR("Invalid op_type"); |
| 2612 | return NULL; |
| 2613 | } |
| 2614 | |
| 2615 | /* lookup mempool in case already allocated */ |
| 2616 | struct rte_mempool *mp = rte_mempool_lookup(name); |
| 2617 | |
| 2618 | if (mp != NULL) { |
| 2619 | priv = (struct rte_crypto_op_pool_private *) |
| 2620 | rte_mempool_get_priv(mp); |
| 2621 | |
| 2622 | if (mp->elt_size != elt_size || |
| 2623 | mp->cache_size < cache_size || |
| 2624 | mp->size < nb_elts || |
| 2625 | priv->priv_size < priv_size) { |
| 2626 | mp = NULL; |
| 2627 | CDEV_LOG_ERR("Mempool %s already exists but with " |
| 2628 | "incompatible parameters", name); |
| 2629 | return NULL; |
| 2630 | } |
| 2631 | return mp; |
| 2632 | } |
| 2633 | |
| 2634 | mp = rte_mempool_create( |
| 2635 | name, |
| 2636 | nb_elts, |
| 2637 | elt_size, |
| 2638 | cache_size, |
| 2639 | sizeof(struct rte_crypto_op_pool_private), |
| 2640 | NULL, |
| 2641 | NULL, |
| 2642 | rte_crypto_op_init, |
| 2643 | &type, |
| 2644 | socket_id, |
| 2645 | 0); |
| 2646 | |
| 2647 | if (mp == NULL) { |
| 2648 | CDEV_LOG_ERR("Failed to create mempool %s", name); |
| 2649 | return NULL; |
| 2650 | } |