Parallel crypto/IPsec v7
Steffen Klassert
maintainercover Parallel crypto/IPsec v7
This patchset adds the 'pcrypt' parallel crypto template. With this template it is possible to process the crypto requests of a transform in parallel without getting request reorder. This is in particular interesting for IPsec.
The parallel crypto template is based on the 'padata' generic parallelization/serialization method. With this method data objects can be processed in parallel, starting at some given point.
The parallelized data objects return after serialization in the order as they were before the parallelization. In the case of IPsec, this makes it possible to run the expensive parts in parallel without getting packet reordering.
IPsec forwarding tests with two quad core machines (Intel Core 2 Quad Q6600) and an EXFO FTB-400 packet blazer showed the following results:
On all tests I used smp_affinity to pin the interrupts of the network cards to different cpus.
linux-2.6.33-rc1 (64 bit)
Packetsize: 1420 byte
Test time: 60 sec
Encryption: aes192-sha1
bidirectional throughput without packet loss: 2 x 325 Mbit/s unidirectional throughput without packet loss: 325 Mbit/s
linux-2.6.33-rc1 (64 bit)
Packetsize: 128 byte
Test time: 60 sec
Encryption: aes192-sha1
bidirectional throughput without packet loss: 2 x 100 Mbit/s unidirectional throughput without packet loss: 125 Mbit/s
linux-2.6.33-rc1 with padata/pcrypt (64 bit)
Packetsize: 1420 byte
Test time: 60 sec
Encryption: aes192-sha1
bidirectional throughput without packet loss: 2 x 650 Mbit/s unidirectional throughput without packet loss: 850 Mbit/s
linux-2.6.33-rc1 with padata/pcrypt (64 bit)
Packetsize: 128 byte
Test time: 60 sec
Encryption: aes192-sha1
bidirectional throughput without packet loss: 2 x 100 Mbit/s unidirectional throughput without packet loss: 125 Mbit/s
So the performance win on big packets is quite good. But on small packets the troughput results with and without the workqueue based parallelization are amost the same on my testing environment.
Changes from v6:
- Rework padata to use workqueues instead of softirqs for parallelization/serialization
- Add a cyclic sequence number pattern, makes the reset of the padata serialization logic on sequence number overrun superfluous.
- Adapt pcrypt to the changed padata interface.
- Rebased to linux-2.6.33-rc1
Steffen
Steffen Klassert
maintainerPATCH 1/2 padata: generic parallelization/serialization interface
This patch introduces an interface to process data objects in parallel. The parallelized objects return after serialization in the same order as they were before the parallelization.
--- include/linux/padata.h | 88 ++++++ init/Kconfig | 4 + kernel/Makefile | 1 + kernel/padata.c | 690 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 783 insertions(+), 0 deletions(-) create mode 100644 include/linux/padata.h create mode 100644 kernel/padata.c
include/linux/padata.h new file +88 -0
@@ -0,0 +1,88 @@ +/* +* padata.h - header for the padata parallelization interface +* +* Copyright (C) 2008, 2009 secunet Security Networks AG +* Copyright (C) 2008, 2009 Steffen Klassert <[email protected]> +* +* This program is free software; you can redistribute it and/or modify it +* under the terms and conditions of the GNU General Public License, +* version 2, as published by the Free Software Foundation. +* +* This program is distributed in the hope it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +* You should have received a copy of the GNU General Public License along with +* this program; if not, write to the Free Software Foundation, Inc., +* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef PADATA_H +#define PADATA_H + +#include <linux/workqueue.h> +#include <linux/spinlock.h> +#include <linux/list.h> + +struct padata_priv { +struct list_head list; +struct parallel_data *pd; +int cb_cpu; +int seq_nr; +int info; +void (*parallel)(struct padata_priv *padata); +void (*serial)(struct padata_priv *padata); +}; + +struct padata_list { +struct list_head list; +spinlock_t lock; +}; + +struct padata_queue { +struct padata_list parallel; +struct padata_list reorder; +struct padata_list serial; +struct work_struct pwork; +struct work_struct swork; +struct parallel_data *pd; +atomic_t num_obj; +int cpu_index; +}; + +struct parallel_data { +struct padata_instance *pinst; +struct padata_queue *queue; +atomic_t seq_nr; +atomic_t reorder_objects; +atomic_t refcnt; +unsigned int max_seq_nr; +cpumask_var_t cpumask; +spinlock_t lock; +}; + +struct padata_instance { +struct notifier_block cpu_notifier; +struct workqueue_struct *wq; +struct parallel_data *pd; +cpumask_var_t cpumask; +struct mutex lock; +u8 flags; +#define PADATA_INIT 1 +#define PADATA_RESET 2 +}; + +extern struct padata_instance *padata_alloc (const struct cpumask *cpumask, +struct workqueue_struct *wq); +extern void padata_free (struct padata_instance *pinst); +extern int padata_do_parallel (struct padata_instance *pinst, +struct padata_priv *padata,int cb_cpu); +extern void padata_do_serial (struct padata_priv *padata); +extern int padata_set_cpumask (struct padata_instance *pinst, +cpumask_var_t cpumask); +extern int padata_add_cpu (struct padata_instance *pinst,int cpu); +extern int padata_remove_cpu (struct padata_instance *pinst,int cpu); +extern void padata_start (struct padata_instance *pinst); +extern void padata_stop (struct padata_instance *pinst); +#endif
init/Kconfig +4 -0
@@ -1252,4 +1252,8 @@ source "block/Kconfig" config PREEMPT_NOTIFIERS bool +config PADATA + depends on SMP + bool + source "kernel/Kconfig.locks"
kernel/Makefile +1 -0
@@ -100,6 +100,7 @@ obj-$(CONFIG_SLOW_WORK_DEBUG) += slow-work-debugfs.o obj-$(CONFIG_PERF_EVENTS) += perf_event.o obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o obj-$(CONFIG_USER_RETURN_NOTIFIER) += user-return-notifier.o +obj-$(CONFIG_PADATA) += padata.o ifneq ($(CONFIG_SCHED_OMIT_FRAME_POINTER),y) # According to Alan Modra <[email protected]>, the -fno-omit-frame-pointer is
kernel/padata.c new file +690 -0
690 lines not on this page · raw message
Signature · 1 line
1.5.4.2
Steffen Klassert
maintainerPATCH 2/2 crypto: pcrypt - Add pcrypt crypto parallelization wrapper
In reply to Steffen KlassertThis patch adds a parallel crypto template that takes a crypto algorithm and converts it to process the crypto transforms in parallel. For the moment only aead algorithms are supported.
--- crypto/Kconfig | 10 + crypto/Makefile | 1 + crypto/pcrypt.c | 445 +++++++++++++++++++++++++++++++++++++++++++++++ include/crypto/pcrypt.h | 51 ++++++ 4 files changed, 507 insertions(+), 0 deletions(-) create mode 100644 crypto/pcrypt.c create mode 100644 include/crypto/pcrypt.h
crypto/Kconfig +10 -0
@@ -114,6 +114,16 @@ config CRYPTO_NULL help These are 'Null' algorithms, used by IPsec, which do nothing. +config CRYPTO_PCRYPT + tristate "Parallel crypto engine (EXPERIMENTAL)" + depends on SMP && EXPERIMENTAL + select PADATA + select CRYPTO_MANAGER + select CRYPTO_AEAD + help + This converts an arbitrary crypto algorithm into a parallel + algorithm that executes in kernel threads. + config CRYPTO_WORKQUEUE tristate
crypto/Makefile +1 -0
@@ -56,6 +56,7 @@ obj-$(CONFIG_CRYPTO_XTS) += xts.o obj-$(CONFIG_CRYPTO_CTR) += ctr.o obj-$(CONFIG_CRYPTO_GCM) += gcm.o obj-$(CONFIG_CRYPTO_CCM) += ccm.o +obj-$(CONFIG_CRYPTO_PCRYPT) += pcrypt.o obj-$(CONFIG_CRYPTO_CRYPTD) += cryptd.o obj-$(CONFIG_CRYPTO_DES) += des_generic.o obj-$(CONFIG_CRYPTO_FCRYPT) += fcrypt.o
crypto/pcrypt.c new file +445 -0
445 lines not on this page · raw message
include/crypto/pcrypt.h new file +51 -0
51 lines not on this page · raw message
Signature · 1 line
1.5.4.2