lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <52d9cee3.2gRBl3ylFAjEYpPT%tadeusz.struk@intel.com>
Date:	Sat, 18 Jan 2014 00:46:27 +0000
From:	Tadeusz Struk <tadeusz.struk@...el.com>
To:	herbert@...dor.apana.org.au
Cc:	linux-kernel@...r.kernel.org, linux-crypto@...r.kernel.org,
	davem@...emloft.net, tadeusz.struk@...el.com
Subject: [PATCH RFC 2/2] crypto: Simple load balancer test module

Test module for the simple algorithm load balancer

Signed-off-by: Tadeusz Struk <tadeusz.struk@...el.com>
---
 crypto/Kconfig                |    6 ++
 crypto/Makefile               |    1 +
 crypto/test_alg_loadbalance.c |  231 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 247 insertions(+)
 create mode 100644 crypto/test_alg_loadbalance.c

diff --git a/crypto/Kconfig b/crypto/Kconfig
index 7bcb70d..85e1bc2 100644
--- a/crypto/Kconfig
+++ b/crypto/Kconfig
@@ -1404,6 +1404,12 @@ config CRYPTO_USER_API_SKCIPHER
 config CRYPTO_HASH_INFO
 	bool
 
+config CRYPTO_ALG_LOAD_BALANCE_TEST
+	tristate "Crypto Algorithm load balancer test module"
+	default n
+	help
+	  This option enables the crypto algorithm load balancer test module.
+
 source "drivers/crypto/Kconfig"
 source crypto/asymmetric_keys/Kconfig
 
diff --git a/crypto/Makefile b/crypto/Makefile
index b29402a..5a49e2a 100644
--- a/crypto/Makefile
+++ b/crypto/Makefile
@@ -97,6 +97,7 @@ obj-$(CONFIG_CRYPTO_GHASH) += ghash-generic.o
 obj-$(CONFIG_CRYPTO_USER_API) += af_alg.o
 obj-$(CONFIG_CRYPTO_USER_API_HASH) += algif_hash.o
 obj-$(CONFIG_CRYPTO_USER_API_SKCIPHER) += algif_skcipher.o
+obj-$(CONFIG_CRYPTO_ALG_LOAD_BALANCE_TEST) += test_alg_loadbalance.o
 
 #
 # generic algorithms and the async_tx api
diff --git a/crypto/test_alg_loadbalance.c b/crypto/test_alg_loadbalance.c
new file mode 100644
index 0000000..2637247
--- /dev/null
+++ b/crypto/test_alg_loadbalance.c
@@ -0,0 +1,231 @@
+/*
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ */
+
+#include <linux/err.h>
+#include <linux/module.h>
+#include <linux/crypto.h>
+#include <linux/string.h>
+#include <crypto/algapi.h>
+
+static int encrypt(struct blkcipher_desc *desc, struct scatterlist *dst,
+		struct scatterlist *src, unsigned int nbytes)
+{
+	return 0;
+}
+static int setkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen)
+{
+	return 0;
+}
+
+
+#define loops 3000000
+static struct crypto_ablkcipher *tfms[loops];
+
+static struct crypto_alg tmp = {
+		.cra_name		= "test",
+		.cra_driver_name	= "test_driver",
+		.cra_priority		= 1,
+		.cra_flags		= CRYPTO_ALG_TYPE_ABLKCIPHER,
+		.cra_module		= THIS_MODULE,
+		.cra_ctxsize		= 0,
+		.cra_type		= &crypto_blkcipher_type,
+		.cra_u = {
+			.blkcipher = {
+				.min_keysize	= 64,
+				.max_keysize	= 64,
+				.ivsize		= 64,
+				.setkey		= setkey,
+				.encrypt	= encrypt,
+				.decrypt	= encrypt,
+			},
+		},
+	};
+static struct crypto_alg algs[10] = {
+	{ { 0 } },
+	{ { 0 } },
+	{ { 0 } },
+	{ { 0 } },
+	{ { 0 } },
+	{ { 0 } },
+	{ { 0 } },
+	{ { 0 } },
+	{ { 0 } },
+	{ { 0 } },
+};
+
+static int __init cra_lbtest_init(void)
+{
+	int i;
+
+	for (i = 0; i < 10; i++) {
+		algs[i] = tmp;
+		algs[i].cra_priority += i;
+	}
+
+	if (crypto_register_algs(algs, 10))
+		return -1;
+
+	for (i = 0; i < loops; i++) {
+		tfms[i] = crypto_alloc_ablkcipher("test", 0, 0);
+		if (IS_ERR(tfms[i]))
+			return PTR_ERR(tfms[i]);
+	}
+	pr_info("Algorithm load balancig test results for %d allocatoins\n",
+									loops);
+	pr_info("All different alg priorities:\n");
+	for (i = 0; i < 10; i++) {
+		unsigned long times = atomic_read(&algs[i].cra_refcnt);
+		unsigned long percent = (times * 100) / loops;
+
+		pr_info("Alg with cra_pri %d allocated %lu times. That's ~%lu%%\n",
+			algs[i].cra_priority, times, percent);
+
+	}
+	for (i = 0; i < loops; i++)
+		crypto_free_ablkcipher(tfms[i]);
+
+	crypto_unregister_algs(algs, 10);
+
+	for (i = 0; i < 10; i++) {
+		algs[i] = tmp;
+		algs[i].cra_priority = 10;
+	}
+	if (crypto_register_algs(algs, 10))
+		return -1;
+
+	for (i = 0; i < loops; i++) {
+		tfms[i] = crypto_alloc_ablkcipher("test", 0, 0);
+		if (IS_ERR(tfms[i]))
+			return PTR_ERR(tfms[i]);
+	}
+	pr_info("All same alg priorities:\n");
+	for (i = 0; i < 10; i++) {
+		unsigned long times = atomic_read(&algs[i].cra_refcnt);
+		unsigned long percent = (times * 100) / loops;
+
+		pr_info("Alg with cra_pri %d allocated %lu times. That's ~%lu%%\n",
+			algs[i].cra_priority, times, percent);
+	}
+	for (i = 0; i < loops; i++)
+		crypto_free_ablkcipher(tfms[i]);
+
+	crypto_unregister_algs(algs, 10);
+
+	for (i = 0; i < 10; i++)
+		algs[i] = tmp;
+
+	algs[0].cra_priority = 9;
+	algs[1].cra_priority = 4;
+	algs[2].cra_priority = 1;
+	algs[3].cra_priority = 4;
+	algs[4].cra_priority = 5;
+	algs[5].cra_priority = 20;
+	algs[6].cra_priority = 21;
+	algs[7].cra_priority = 10;
+	algs[8].cra_priority = 21;
+	algs[9].cra_priority = 7;
+
+	if (crypto_register_algs(algs, 10))
+		return -1;
+
+	for (i = 0; i < loops; i++) {
+		tfms[i] = crypto_alloc_ablkcipher("test", 0, 0);
+		if (IS_ERR(tfms[i]))
+			return PTR_ERR(tfms[i]);
+	}
+	pr_info("A mix alg priorities:\n");
+	for (i = 0; i < 10; i++) {
+		unsigned long times = atomic_read(&algs[i].cra_refcnt);
+		unsigned long percent = (times * 100) / loops;
+
+		pr_info("Alg with cra_pri %d allocated %lu times. That's ~%lu%%\n",
+			algs[i].cra_priority, times, percent);
+	}
+	for (i = 0; i < loops; i++)
+		crypto_free_ablkcipher(tfms[i]);
+	crypto_unregister_algs(algs, 10);
+
+	for (i = 0; i < 10; i++)
+		algs[i] = tmp;
+
+	algs[0].cra_priority = 9;
+	algs[1].cra_priority = 4;
+	algs[2].cra_priority = 1;
+	algs[3].cra_priority = 4;
+	algs[4].cra_priority = 500;
+	algs[5].cra_priority = 20;
+	algs[6].cra_priority = 21;
+	algs[7].cra_priority = 10;
+	algs[8].cra_priority = 21;
+	algs[9].cra_priority = 7;
+
+	if (crypto_register_algs(algs, 10))
+		return -1;
+
+	for (i = 0; i < loops; i++) {
+		tfms[i] = crypto_alloc_ablkcipher("test", 0, 0);
+		if (IS_ERR(tfms[i]))
+			return PTR_ERR(tfms[i]);
+	}
+	pr_info("A mix alg priorities with one very big:\n");
+	for (i = 0; i < 10; i++) {
+		unsigned long times = atomic_read(&algs[i].cra_refcnt);
+		unsigned long percent = (times * 100) / loops;
+
+		pr_info("Alg with cra_pri %d allocated %lu times. That's ~%lu%%\n",
+			algs[i].cra_priority, times, percent);
+	}
+
+	for (i = 0; i < loops; i++)
+		crypto_free_ablkcipher(tfms[i]);
+
+	crypto_unregister_algs(algs, 10);
+
+	pr_info("And lastly only one of a given alg:\n");
+	strcpy(tmp.cra_name, "TEST");
+
+	for (i = 0; i < 10; i++)
+		algs[i] = tmp;
+
+	strcpy(algs[0].cra_name, "test");
+
+	if (crypto_register_algs(algs, 10))
+		return -1;
+
+	for (i = 0; i < loops; i++) {
+		tfms[i] = crypto_alloc_ablkcipher("test", 0, 0);
+		if (IS_ERR(tfms[i]))
+			return PTR_ERR(tfms[i]);
+	}
+
+	for (i = 0; i < 10; i++) {
+
+		unsigned long times = atomic_read(&algs[i].cra_refcnt);
+		unsigned long percent = (times * 100) / loops;
+
+		pr_info("Alg with cra_pri %d allocated %lu times. That's ~%lu%%\n",
+			algs[i].cra_priority, times, percent);
+	}
+
+	for (i = 0; i < loops; i++)
+		crypto_free_ablkcipher(tfms[i]);
+
+	crypto_unregister_algs(algs, 10);
+	return 0;
+
+}
+
+static void __exit cra_lbtest_exit(void)
+{
+	crypto_unregister_algs(algs, 10);
+}
+
+module_init(cra_lbtest_init);
+module_exit(cra_lbtest_exit);
+MODULE_DESCRIPTION("Crypto Algorithm load balancer test module");
+MODULE_LICENSE("GPL");
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ