These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / crypto / qat / qat_common / qat_crypto.c
index 3bd705c..9cab154 100644 (file)
@@ -60,8 +60,8 @@ static struct service_hndl qat_crypto;
 
 void qat_crypto_put_instance(struct qat_crypto_instance *inst)
 {
-       if (atomic_sub_return(1, &inst->refctr) == 0)
-               adf_dev_put(inst->accel_dev);
+       atomic_dec(&inst->refctr);
+       adf_dev_put(inst->accel_dev);
 }
 
 static int qat_crypto_free_instances(struct adf_accel_dev *accel_dev)
@@ -88,12 +88,6 @@ static int qat_crypto_free_instances(struct adf_accel_dev *accel_dev)
                if (inst->pke_rx)
                        adf_remove_ring(inst->pke_rx);
 
-               if (inst->rnd_tx)
-                       adf_remove_ring(inst->rnd_tx);
-
-               if (inst->rnd_rx)
-                       adf_remove_ring(inst->rnd_rx);
-
                list_del(list_ptr);
                kfree(inst);
        }
@@ -103,47 +97,66 @@ static int qat_crypto_free_instances(struct adf_accel_dev *accel_dev)
 struct qat_crypto_instance *qat_crypto_get_instance_node(int node)
 {
        struct adf_accel_dev *accel_dev = NULL;
-       struct qat_crypto_instance *inst_best = NULL;
+       struct qat_crypto_instance *inst = NULL;
        struct list_head *itr;
        unsigned long best = ~0;
 
        list_for_each(itr, adf_devmgr_get_head()) {
-               accel_dev = list_entry(itr, struct adf_accel_dev, list);
-               if ((node == dev_to_node(&GET_DEV(accel_dev)) ||
-                    dev_to_node(&GET_DEV(accel_dev)) < 0) &&
-                   adf_dev_started(accel_dev))
-                       break;
-               accel_dev = NULL;
+               struct adf_accel_dev *tmp_dev;
+               unsigned long ctr;
+
+               tmp_dev = list_entry(itr, struct adf_accel_dev, list);
+
+               if ((node == dev_to_node(&GET_DEV(tmp_dev)) ||
+                    dev_to_node(&GET_DEV(tmp_dev)) < 0) &&
+                   adf_dev_started(tmp_dev) &&
+                   !list_empty(&tmp_dev->crypto_list)) {
+                       ctr = atomic_read(&tmp_dev->ref_count);
+                       if (best > ctr) {
+                               accel_dev = tmp_dev;
+                               best = ctr;
+                       }
+               }
        }
-       if (!accel_dev) {
-               pr_err("QAT: Could not find a device on node %d\n", node);
-               accel_dev = adf_devmgr_get_first();
+       if (!accel_dev)
+               pr_info("QAT: Could not find a device on node %d\n", node);
+
+       /* Get any started device */
+       list_for_each(itr, adf_devmgr_get_head()) {
+               struct adf_accel_dev *tmp_dev;
+
+               tmp_dev = list_entry(itr, struct adf_accel_dev, list);
+
+               if (adf_dev_started(tmp_dev) &&
+                   !list_empty(&tmp_dev->crypto_list)) {
+                       accel_dev = tmp_dev;
+                       break;
+               }
        }
-       if (!accel_dev || !adf_dev_started(accel_dev))
+
+       if (!accel_dev)
                return NULL;
 
+       best = ~0;
        list_for_each(itr, &accel_dev->crypto_list) {
-               struct qat_crypto_instance *inst;
-               unsigned long cur;
-
-               inst = list_entry(itr, struct qat_crypto_instance, list);
-               cur = atomic_read(&inst->refctr);
-               if (best > cur) {
-                       inst_best = inst;
-                       best = cur;
+               struct qat_crypto_instance *tmp_inst;
+               unsigned long ctr;
+
+               tmp_inst = list_entry(itr, struct qat_crypto_instance, list);
+               ctr = atomic_read(&tmp_inst->refctr);
+               if (best > ctr) {
+                       inst = tmp_inst;
+                       best = ctr;
                }
        }
-       if (inst_best) {
-               if (atomic_add_return(1, &inst_best->refctr) == 1) {
-                       if (adf_dev_get(accel_dev)) {
-                               atomic_dec(&inst_best->refctr);
-                               dev_err(&GET_DEV(accel_dev),
-                                       "Could not increment dev refctr\n");
-                               return NULL;
-                       }
+       if (inst) {
+               if (adf_dev_get(accel_dev)) {
+                       dev_err(&GET_DEV(accel_dev), "Could not increment dev refctr\n");
+                       return NULL;
                }
+               atomic_inc(&inst->refctr);
        }
-       return inst_best;
+       return inst;
 }
 
 static int qat_crypto_create_instances(struct adf_accel_dev *accel_dev)
@@ -158,7 +171,6 @@ static int qat_crypto_create_instances(struct adf_accel_dev *accel_dev)
 
        INIT_LIST_HEAD(&accel_dev->crypto_list);
        strlcpy(key, ADF_NUM_CY, sizeof(key));
-
        if (adf_cfg_get_param_value(accel_dev, SEC, key, val))
                return -EFAULT;
 
@@ -187,7 +199,9 @@ static int qat_crypto_create_instances(struct adf_accel_dev *accel_dev)
 
                if (kstrtoul(val, 10, &num_msg_sym))
                        goto err;
+
                num_msg_sym = num_msg_sym >> 1;
+
                snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_SIZE, i);
                if (adf_cfg_get_param_value(accel_dev, SEC, key, val))
                        goto err;
@@ -202,11 +216,6 @@ static int qat_crypto_create_instances(struct adf_accel_dev *accel_dev)
                                    msg_size, key, NULL, 0, &inst->sym_tx))
                        goto err;
 
-               snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_RND_TX, i);
-               if (adf_create_ring(accel_dev, SEC, bank, num_msg_asym,
-                                   msg_size, key, NULL, 0, &inst->rnd_tx))
-                       goto err;
-
                msg_size = msg_size >> 1;
                snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_TX, i);
                if (adf_create_ring(accel_dev, SEC, bank, num_msg_asym,
@@ -220,15 +229,9 @@ static int qat_crypto_create_instances(struct adf_accel_dev *accel_dev)
                                    &inst->sym_rx))
                        goto err;
 
-               snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_RND_RX, i);
-               if (adf_create_ring(accel_dev, SEC, bank, num_msg_asym,
-                                   msg_size, key, qat_alg_callback, 0,
-                                   &inst->rnd_rx))
-                       goto err;
-
                snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_RX, i);
                if (adf_create_ring(accel_dev, SEC, bank, num_msg_asym,
-                                   msg_size, key, qat_alg_callback, 0,
+                                   msg_size, key, qat_alg_asym_callback, 0,
                                    &inst->pke_rx))
                        goto err;
        }