Acked-by: Kai Ji <kai.ji@intel.com>

From: Power, Ciara <ciara.power@intel.com>
Sent: 30 June 2023 09:34
To: dev@dpdk.org <dev@dpdk.org>
Cc: Ji, Kai <kai.ji@intel.com>; Power, Ciara <ciara.power@intel.com>; De Lara Guarch, Pablo <pablo.de.lara.guarch@intel.com>
Subject: [PATCH] drivers/ipsec_mb: fix aesni_mb set session ID
 
In the case of multiprocess, when the same session is being used for both
primary and secondary processes, the session ID will be the same.
However the pointers are not available to the secondary process, so in this
case when the session was created by a different process ID, then copy
the template session to the job again.

Fixes: 0fb4834e00af ("crypto/ipsec_mb: set and use session ID")
Cc: pablo.de.lara.guarch@intel.com

Signed-off-by: Ciara Power <ciara.power@intel.com>
---
 drivers/crypto/ipsec_mb/pmd_aesni_mb.c      | 8 +++++++-
 drivers/crypto/ipsec_mb/pmd_aesni_mb_priv.h | 2 ++
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/crypto/ipsec_mb/pmd_aesni_mb.c b/drivers/crypto/ipsec_mb/pmd_aesni_mb.c
index f4322d9af4..555b59621d 100644
--- a/drivers/crypto/ipsec_mb/pmd_aesni_mb.c
+++ b/drivers/crypto/ipsec_mb/pmd_aesni_mb.c
@@ -2,6 +2,8 @@
  * Copyright(c) 2015-2021 Intel Corporation
  */
 
+#include <unistd.h>
+
 #include "pmd_aesni_mb_priv.h"
 
 struct aesni_mb_op_buf_data {
@@ -847,6 +849,7 @@ aesni_mb_session_configure(IMB_MGR *mb_mgr,
 
 #if IMB_VERSION(1, 3, 0) < IMB_VERSION_NUM
         sess->session_id = imb_set_session(mb_mgr, &sess->template_job);
+       sess->pid = getpid();
 #endif
 
         return 0;
@@ -1482,7 +1485,10 @@ set_mb_job_params(IMB_JOB *job, struct ipsec_mb_qp *qp,
                         session->template_job.cipher_mode;
 
 #if IMB_VERSION(1, 3, 0) < IMB_VERSION_NUM
-       if (job->session_id != session->session_id)
+       if (session->pid != getpid()) {
+               memcpy(job, &session->template_job, sizeof(IMB_JOB));
+               imb_set_session(mb_mgr, job);
+       } else if (job->session_id != session->session_id)
 #endif
                 memcpy(job, &session->template_job, sizeof(IMB_JOB));
 
diff --git a/drivers/crypto/ipsec_mb/pmd_aesni_mb_priv.h b/drivers/crypto/ipsec_mb/pmd_aesni_mb_priv.h
index 4ffbe4b282..3f6cf30c39 100644
--- a/drivers/crypto/ipsec_mb/pmd_aesni_mb_priv.h
+++ b/drivers/crypto/ipsec_mb/pmd_aesni_mb_priv.h
@@ -854,6 +854,8 @@ struct aesni_mb_session {
         /*< Template job structure */
         uint32_t session_id;
         /*< IPSec MB session ID */
+       pid_t pid;
+       /*< Process ID that created session */
         struct {
                 uint16_t offset;
         } iv;
--
2.25.1