From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id D565AA0552; Fri, 21 Oct 2022 01:51:17 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 85FAC42B6D; Fri, 21 Oct 2022 01:51:17 +0200 (CEST) Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by mails.dpdk.org (Postfix) with ESMTP id D0EDA42836 for ; Fri, 21 Oct 2022 01:51:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1666309876; x=1697845876; h=from:to:cc:subject:date:message-id; bh=HhtWQ7vayhRsaYD6zjbAbfgbu4weXqXWclZQsRbBfi8=; b=P13f1kj7UlWxiNqe81RFh96iiUfZH9js8PXx7Gz3oFm3+7Y/vNU24vuI FW1SmCQMWoTft6w4f/Wma5Z0BlCIRagfS5Eg7YAZsWopv7kcsxcTR50Yk b+ki0WOXRkT2Ed19RQ308M71FMZDo7MApUg3PQ6cJ6c8MkY8Y3RCxzFYz smjpgHw9FMbIs89m0quaMtCPNrnB4KH/HG9X9hIxqbxfFFio0pAepSb9v poZgsMwfaBFZrXcf3eQ2l1NWdWcnpTlmfglh2uhLYo79+QAxotcYT7i7b ytwVHOT/IOLodL8gBlmMuOTmWdAW1CYN0aAaKr9KuJ6ZXo4t9nHj/5JYQ w==; X-IronPort-AV: E=McAfee;i="6500,9779,10506"; a="305602270" X-IronPort-AV: E=Sophos;i="5.95,200,1661842800"; d="scan'208";a="305602270" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Oct 2022 16:51:14 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10506"; a="755460013" X-IronPort-AV: E=Sophos;i="5.95,200,1661842800"; d="scan'208";a="755460013" Received: from silpixa00400465.ir.intel.com ([10.55.128.22]) by orsmga004.jf.intel.com with ESMTP; 20 Oct 2022 16:51:12 -0700 From: Kai Ji To: dev@dpdk.org Cc: Kai Ji , Pablo de Lara , Anatoly Burakov Subject: [dpdk-dev v1] crypto/ipsec_mb: multi-process IPC request handler Date: Fri, 21 Oct 2022 07:51:10 +0800 Message-Id: <20221020235110.93834-1-kai.ji@intel.com> X-Mailer: git-send-email 2.17.1 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org As the secondary process needs queue-pair to be configured by the primary process before use. This patch adds an IPC register function to allow secondary process to setup cryptodev queue-pair via IPC messages during the runtime. A new "qp_in_used_pid" param stores the PID to provide the ownership of the queue-pair so that only the PID matched queue-pair can be free'd in the request. Signed-off-by: Kai Ji --- drivers/crypto/ipsec_mb/ipsec_mb_ops.c | 69 ++++++++++++++++++++++ drivers/crypto/ipsec_mb/ipsec_mb_private.c | 22 ++++++- drivers/crypto/ipsec_mb/ipsec_mb_private.h | 33 +++++++++++ 3 files changed, 123 insertions(+), 1 deletion(-) diff --git a/drivers/crypto/ipsec_mb/ipsec_mb_ops.c b/drivers/crypto/ipsec_mb/ipsec_mb_ops.c index cedcaa2742..abeef364d1 100644 --- a/drivers/crypto/ipsec_mb/ipsec_mb_ops.c +++ b/drivers/crypto/ipsec_mb/ipsec_mb_ops.c @@ -296,6 +296,75 @@ ipsec_mb_qp_setup(struct rte_cryptodev *dev, uint16_t qp_id, return ret; } +int +ipsec_mb_ipc_request(const struct rte_mp_msg *mp_msg, const void *peer) +{ + struct rte_mp_msg mp_res; + struct ipsec_mb_mp_param *resp_param = + (struct ipsec_mb_mp_param *)mp_res.param; + const struct ipsec_mb_mp_param *req_param = + (const struct ipsec_mb_mp_param *)mp_msg->param; + + int ret; + struct rte_cryptodev *dev; + struct ipsec_mb_qp *qp; + int dev_id = req_param->dev_id; + int qp_id = req_param->qp_id; + struct rte_cryptodev_qp_conf *queue_conf = + (struct rte_cryptodev_qp_conf *)req_param->queue_conf; + + resp_param->result = -EINVAL; + if (!rte_cryptodev_is_valid_dev(dev_id)) { + CDEV_LOG_ERR("Invalid dev_id=%d", dev_id); + goto out; + } + + dev = rte_cryptodev_pmd_get_dev(dev_id); + switch (req_param->type) { + case RTE_IPSEC_MB_MP_REQ_QP_SET: + qp = dev->data->queue_pairs[qp_id]; + if (qp) { + CDEV_LOG_DEBUG("qp %d on dev %d is initialised", qp_id, dev_id); + goto out; + } + + ret = ipsec_mb_qp_setup(dev, qp_id, queue_conf, req_param->socket_id); + if (!ret) { + qp = dev->data->queue_pairs[qp_id]; + if (!qp) { + CDEV_LOG_DEBUG("qp %d on dev %d is not initialised", + qp_id, dev_id); + goto out; + } + qp->qp_in_used_by_pid = req_param->process_id; + } + resp_param->result = ret; + break; + case RTE_IPSEC_MB_MP_REQ_QP_FREE: + qp = dev->data->queue_pairs[qp_id]; + if (!qp) { + CDEV_LOG_DEBUG("qp %d on dev %d is not initialised", + qp_id, dev_id); + goto out; + } + + if (qp->qp_in_used_by_pid != req_param->process_id) { + CDEV_LOG_ERR("Unable to release qp_id=%d", qp_id); + goto out; + } + + qp->qp_in_used_by_pid = 0; + resp_param->result = ipsec_mb_qp_release(dev, qp_id); + break; + default: + CDEV_LOG_ERR("invalid mp request type\n"); + } + +out: + ret = rte_mp_reply(&mp_res, peer); + return ret; +} + /** Return the size of the specific pmd session structure */ unsigned ipsec_mb_sym_session_get_size(struct rte_cryptodev *dev) diff --git a/drivers/crypto/ipsec_mb/ipsec_mb_private.c b/drivers/crypto/ipsec_mb/ipsec_mb_private.c index e56579596f..3c5cf50673 100644 --- a/drivers/crypto/ipsec_mb/ipsec_mb_private.c +++ b/drivers/crypto/ipsec_mb/ipsec_mb_private.c @@ -42,6 +42,22 @@ ipsec_mb_enqueue_burst(void *__qp, struct rte_crypto_op **ops, return nb_enqueued; } +static int +ipsec_mb_mp_request_register(void) +{ + RTE_ASSERT(rte_eal_process_type() == RTE_PROC_PRIMARY); + IPSEC_MB_LOG(INFO, "Starting register MP IPC request\n"); + return rte_mp_action_register(IPSEC_MB_MP_REQ, + ipsec_mb_ipc_request); +} + +static void +ipsec_mb_mp_request_unregister(void) +{ + RTE_ASSERT(rte_eal_process_type() == RTE_PROC_PRIMARY); + rte_mp_action_unregister(IPSEC_MB_MP_REQ); +} + int ipsec_mb_create(struct rte_vdev_device *vdev, enum ipsec_mb_pmd_types pmd_type) @@ -152,7 +168,9 @@ ipsec_mb_create(struct rte_vdev_device *vdev, IPSEC_MB_LOG(INFO, "IPSec Multi-buffer library version used: %s\n", imb_get_version_str()); - return 0; + retval = ipsec_mb_mp_request_register(); + + return retval; } int @@ -187,5 +205,7 @@ ipsec_mb_remove(struct rte_vdev_device *vdev) for (qp_id = 0; qp_id < cryptodev->data->nb_queue_pairs; qp_id++) ipsec_mb_qp_release(cryptodev, qp_id); + ipsec_mb_mp_request_unregister(); + return rte_cryptodev_pmd_destroy(cryptodev); } diff --git a/drivers/crypto/ipsec_mb/ipsec_mb_private.h b/drivers/crypto/ipsec_mb/ipsec_mb_private.h index b56eaf061e..4c894e6688 100644 --- a/drivers/crypto/ipsec_mb/ipsec_mb_private.h +++ b/drivers/crypto/ipsec_mb/ipsec_mb_private.h @@ -10,6 +10,7 @@ #else #include #endif +#include #include #include @@ -25,6 +26,9 @@ /* Maximum length for memzone name */ #define IPSEC_MB_MAX_MZ_NAME 32 +/* ipsec mbmulti-process queue pair config */ +#define IPSEC_MB_MP_REQ "ipsec_mb_mp_request" + enum ipsec_mb_vector_mode { IPSEC_MB_NOT_SUPPORTED = 0, IPSEC_MB_SSE, @@ -149,11 +153,40 @@ struct ipsec_mb_qp { IMB_MGR *mb_mgr; /* Multi buffer manager */ const struct rte_memzone *mb_mgr_mz; + /** Array of process id used for queue pairs **/ + uint16_t qp_in_used_by_pid; /* Shared memzone for storing mb_mgr */ __extension__ uint8_t additional_data[]; /**< Storing PMD specific additional data */ }; +/** Request types for IPC. */ +enum ipsec_mb_mp_req_type { + RTE_IPSEC_MB_MP_REQ_NONE, /**< unknown event type */ + RTE_IPSEC_MB_MP_REQ_QP_SET, /**< Queue pair setup request */ + RTE_IPSEC_MB_MP_REQ_QP_FREE /**< Queue pair free request */ +}; + +/** Parameters for IPC. */ +struct ipsec_mb_mp_param { + enum ipsec_mb_mp_req_type type; /**< IPC request type */ + int dev_id; + /**< The identifier of the device */ + int qp_id; + /**< The index of the queue pair to be configured */ + int socket_id; + /**< Socket to allocate resources on */ + uint16_t process_id; + /**< The pid who send out the requested */ + void *queue_conf; + /**< A pointer of Crypto device queue pair configuration structure */ + int result; + /**< The request result for response message */ +}; + +int +ipsec_mb_ipc_request(const struct rte_mp_msg *mp_msg, const void *peer); + static __rte_always_inline void * ipsec_mb_get_qp_private_data(struct ipsec_mb_qp *qp) { -- 2.17.1