crypto/dpaa_sec: fix session queue attach/detach
authorAkhil Goyal <akhil.goyal@nxp.com>
Wed, 27 Mar 2019 11:53:36 +0000 (11:53 +0000)
committerAkhil Goyal <akhil.goyal@nxp.com>
Tue, 2 Apr 2019 14:50:24 +0000 (16:50 +0200)
session inq and qp are assigned for each core from which the
packets arrive. This was not correctly handled while supporting
multiple sessions per queue pair.
This patch fixes the attach and detach of queues for each core.

Fixes: e79416d10fa3 ("crypto/dpaa_sec: support multiple sessions per queue pair")
Cc: stable@dpdk.org
Signed-off-by: Akhil Goyal <akhil.goyal@nxp.com>
drivers/crypto/dpaa_sec/dpaa_sec.c

index cb99be4..8305f19 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  *
  *   Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved.
- *   Copyright 2017-2018 NXP
+ *   Copyright 2017-2019 NXP
  *
  */
 
@@ -1940,13 +1940,13 @@ dpaa_sec_attach_rxq(struct dpaa_sec_dev_private *qi)
 {
        unsigned int i;
 
-       for (i = 0; i < qi->max_nb_sessions; i++) {
+       for (i = 0; i < qi->max_nb_sessions * MAX_DPAA_CORES; i++) {
                if (qi->inq_attach[i] == 0) {
                        qi->inq_attach[i] = 1;
                        return &qi->inq[i];
                }
        }
-       DPAA_SEC_WARN("All ses session in use %x", qi->max_nb_sessions);
+       DPAA_SEC_WARN("All session in use %u", qi->max_nb_sessions);
 
        return NULL;
 }
@@ -2115,7 +2115,7 @@ dpaa_sec_sym_session_clear(struct rte_cryptodev *dev,
                struct rte_cryptodev_sym_session *sess)
 {
        struct dpaa_sec_dev_private *qi = dev->data->dev_private;
-       uint8_t index = dev->driver_id;
+       uint8_t index = dev->driver_id, i;
        void *sess_priv = get_sym_session_private_data(sess, index);
 
        PMD_INIT_FUNC_TRACE();
@@ -2125,9 +2125,12 @@ dpaa_sec_sym_session_clear(struct rte_cryptodev *dev,
        if (sess_priv) {
                struct rte_mempool *sess_mp = rte_mempool_from_obj(sess_priv);
 
-               if (s->inq[rte_lcore_id() % MAX_DPAA_CORES])
-                       dpaa_sec_detach_rxq(qi,
-                               s->inq[rte_lcore_id() % MAX_DPAA_CORES]);
+               for (i = 0; i < MAX_DPAA_CORES; i++) {
+                       if (s->inq[i])
+                               dpaa_sec_detach_rxq(qi, s->inq[i]);
+                       s->inq[i] = NULL;
+                       s->qp[i] = NULL;
+               }
                rte_free(s->cipher_key.data);
                rte_free(s->auth_key.data);
                memset(s, 0, sizeof(dpaa_sec_session));