Torsten Duwe 614781
From 92bf269fbfe94018f15405e1644049de7c7b46dd Mon Sep 17 00:00:00 2001
Torsten Duwe 614781
From: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe 614781
Date: Mon, 27 Jun 2022 09:36:50 +0100
Torsten Duwe 614781
Subject: [PATCH] crypto: qat - change behaviour of
Torsten Duwe 614781
 adf_cfg_add_key_value_param()
Torsten Duwe 614781
Git-commit: 92bf269fbfe94018f15405e1644049de7c7b46dd
Torsten Duwe 614781
Patch-mainline: v6.0-rc1
Torsten Duwe 614781
References: jsc#PED-1073
Torsten Duwe 614781
Torsten Duwe 614781
The function adf_cfg_add_key_value_param() allows to insert duplicates
Torsten Duwe 614781
entries in the key value store of the driver.
Torsten Duwe 614781
Torsten Duwe 614781
Change the behaviour of that function to the following policy:
Torsten Duwe 614781
- if the key doesn't exist, add it;
Torsten Duwe 614781
- if the key already exists with a different value, then delete it and
Torsten Duwe 614781
  replace it with a new one containing the new value;
Torsten Duwe 614781
- if the key exists with the same value, then return without doing
Torsten Duwe 614781
  anything.
Torsten Duwe 614781
Torsten Duwe 614781
The behaviour of this function has been changed in order to easily
Torsten Duwe 614781
update key-values in the driver database. In particular this is required
Torsten Duwe 614781
to update the value of the ServiceEnables key used to change the service
Torsten Duwe 614781
loaded on a device.
Torsten Duwe 614781
Torsten Duwe 614781
Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe 614781
Reviewed-by: Adam Guerin <adam.guerin@intel.com>
Torsten Duwe 614781
Reviewed-by: Fiona Trahe <fiona.trahe@intel.com>
Torsten Duwe 614781
Reviewed-by: Wojciech Ziemba <wojciech.ziemba@intel.com>
Torsten Duwe 614781
Reviewed-by: Vladis Dronov <vdronov@redhat.com>
Torsten Duwe 614781
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Torsten Duwe 614781
Signed-off-by: Torsten Duwe <duwe@suse.de>
Torsten Duwe 614781
Torsten Duwe 614781
---
Torsten Duwe 614781
 drivers/crypto/qat/qat_common/adf_cfg.c | 41 ++++++++++++++++++++++++-
Torsten Duwe 614781
 1 file changed, 40 insertions(+), 1 deletion(-)
Torsten Duwe 614781
Torsten Duwe 614781
diff --git a/drivers/crypto/qat/qat_common/adf_cfg.c b/drivers/crypto/qat/qat_common/adf_cfg.c
Torsten Duwe 614781
index b5b208cbe5a12..e61b3e13db3bd 100644
Torsten Duwe 614781
--- a/drivers/crypto/qat/qat_common/adf_cfg.c
Torsten Duwe 614781
+++ b/drivers/crypto/qat/qat_common/adf_cfg.c
Torsten Duwe 614781
@@ -128,6 +128,24 @@ static void adf_cfg_keyval_add(struct adf_cfg_key_val *new,
Torsten Duwe 614781
 	list_add_tail(&new->list, &sec->param_head);
Torsten Duwe 614781
 }
Torsten Duwe 614781
 
Torsten Duwe 614781
+static void adf_cfg_keyval_remove(const char *key, struct adf_cfg_section *sec)
Torsten Duwe 614781
+{
Torsten Duwe 614781
+	struct list_head *head = &sec->param_head;
Torsten Duwe 614781
+	struct list_head *list_ptr, *tmp;
Torsten Duwe 614781
+
Torsten Duwe 614781
+	list_for_each_prev_safe(list_ptr, tmp, head) {
Torsten Duwe 614781
+		struct adf_cfg_key_val *ptr =
Torsten Duwe 614781
+			list_entry(list_ptr, struct adf_cfg_key_val, list);
Torsten Duwe 614781
+
Torsten Duwe 614781
+		if (strncmp(ptr->key, key, sizeof(ptr->key)))
Torsten Duwe 614781
+			continue;
Torsten Duwe 614781
+
Torsten Duwe 614781
+		list_del(list_ptr);
Torsten Duwe 614781
+		kfree(ptr);
Torsten Duwe 614781
+		break;
Torsten Duwe 614781
+	}
Torsten Duwe 614781
+}
Torsten Duwe 614781
+
Torsten Duwe 614781
 static void adf_cfg_keyval_del_all(struct list_head *head)
Torsten Duwe 614781
 {
Torsten Duwe 614781
 	struct list_head *list_ptr, *tmp;
Torsten Duwe 614781
@@ -208,7 +226,8 @@ static int adf_cfg_key_val_get(struct adf_accel_dev *accel_dev,
Torsten Duwe 614781
  * @type: Type - string, int or address
Torsten Duwe 614781
  *
Torsten Duwe 614781
  * Function adds configuration key - value entry in the appropriate section
Torsten Duwe 614781
- * in the given acceleration device
Torsten Duwe 614781
+ * in the given acceleration device. If the key exists already, the value
Torsten Duwe 614781
+ * is updated.
Torsten Duwe 614781
  * To be used by QAT device specific drivers.
Torsten Duwe 614781
  *
Torsten Duwe 614781
  * Return: 0 on success, error code otherwise.
Torsten Duwe 614781
@@ -222,6 +241,8 @@ int adf_cfg_add_key_value_param(struct adf_accel_dev *accel_dev,
Torsten Duwe 614781
 	struct adf_cfg_key_val *key_val;
Torsten Duwe 614781
 	struct adf_cfg_section *section = adf_cfg_sec_find(accel_dev,
Torsten Duwe 614781
 							   section_name);
Torsten Duwe 614781
+	char temp_val[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
Torsten Duwe 614781
+
Torsten Duwe 614781
 	if (!section)
Torsten Duwe 614781
 		return -EFAULT;
Torsten Duwe 614781
 
Torsten Duwe 614781
@@ -246,6 +267,24 @@ int adf_cfg_add_key_value_param(struct adf_accel_dev *accel_dev,
Torsten Duwe 614781
 		return -EINVAL;
Torsten Duwe 614781
 	}
Torsten Duwe 614781
 	key_val->type = type;
Torsten Duwe 614781
+
Torsten Duwe 614781
+	/* Add the key-value pair as below policy:
Torsten Duwe 614781
+	 * 1. if the key doesn't exist, add it;
Torsten Duwe 614781
+	 * 2. if the key already exists with a different value then update it
Torsten Duwe 614781
+	 *    to the new value (the key is deleted and the newly created
Torsten Duwe 614781
+	 *    key_val containing the new value is added to the database);
Torsten Duwe 614781
+	 * 3. if the key exists with the same value, then return without doing
Torsten Duwe 614781
+	 *    anything (the newly created key_val is freed).
Torsten Duwe 614781
+	 */
Torsten Duwe 614781
+	if (!adf_cfg_key_val_get(accel_dev, section_name, key, temp_val)) {
Torsten Duwe 614781
+		if (strncmp(temp_val, key_val->val, sizeof(temp_val))) {
Torsten Duwe 614781
+			adf_cfg_keyval_remove(key, section);
Torsten Duwe 614781
+		} else {
Torsten Duwe 614781
+			kfree(key_val);
Torsten Duwe 614781
+			return 0;
Torsten Duwe 614781
+		}
Torsten Duwe 614781
+	}
Torsten Duwe 614781
+
Torsten Duwe 614781
 	down_write(&cfg->lock);
Torsten Duwe 614781
 	adf_cfg_keyval_add(key_val, section);
Torsten Duwe 614781
 	up_write(&cfg->lock);
Torsten Duwe 614781
-- 
Torsten Duwe 614781
2.35.3
Torsten Duwe 614781