2022-06-13 18:32:20

by Yoan Picchi

[permalink] [raw]
Subject: [PATCH 0/2] Crypto: Remove x86 dependency on QAT drivers

The QAT acceleration card can be very helpfull for some tasks like dealing
with IPSEC but it is currently restricted to be used only on x86 machine.
Looking at the code we didn't see any reasons why those drivers might not
work on other architectures. We've successfully built all of them on x86,
arm64, arm32, mips64, powerpc64, riscv64 and sparc64.

We also have tested the driver with an Intel Corporation C62x Chipset
QuickAssist Technology (rev 04) PCIe card on an arm64 server. After the numa
patch, it works with the AF_ALG crypto userland interface, allowing us to
encrypt some data with cbc for instance. We've also successfully created some
VF, bound them to DPDK, and used the card this way, thus showing some real
life usecases of x86 do work on arm64 too.

Changelog v1 ... v2:
- add COMPILE_TEST to Kconfig

Andre Przywara (1):
crypto: qat: replace get_current_node() with numa_node_id()

Yoan Picchi (1):
Removes the x86 dependency on the QAT drivers

drivers/crypto/qat/Kconfig | 14 +++++++-------
drivers/crypto/qat/qat_common/adf_common_drv.h | 5 -----
drivers/crypto/qat/qat_common/qat_algs.c | 4 ++--
drivers/crypto/qat/qat_common/qat_asym_algs.c | 4 ++--
4 files changed, 11 insertions(+), 16 deletions(-)

--
2.25.1


2022-06-13 18:37:24

by Yoan Picchi

[permalink] [raw]
Subject: [PATCH 1/2] crypto: qat: replace get_current_node() with numa_node_id()

From: Andre Przywara <[email protected]>

Currently the QAT driver code uses a self-defined wrapper function
called get_current_node() when it wants to learn the current NUMA node.
This implementation references the topology_physical_package_id[] array,
which more or less coincidentally contains the NUMA node id, at least
on x86.

Because this is not universal, and Linux offers a direct function to
learn the NUMA node ID, replace that function with a call to
numa_node_id(), which would work everywhere.

This fixes the QAT driver operation on arm64 machines.

Reported-by: Yoan Picchi <[email protected]>
Signed-off-by: Andre Przywara <[email protected]>
Signed-off-by: Yoan Picchi <[email protected]>
---
drivers/crypto/qat/qat_common/adf_common_drv.h | 5 -----
drivers/crypto/qat/qat_common/qat_algs.c | 4 ++--
drivers/crypto/qat/qat_common/qat_asym_algs.c | 4 ++--
3 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/drivers/crypto/qat/qat_common/adf_common_drv.h b/drivers/crypto/qat/qat_common/adf_common_drv.h
index e8c9b77c0d66..b582107db67b 100644
--- a/drivers/crypto/qat/qat_common/adf_common_drv.h
+++ b/drivers/crypto/qat/qat_common/adf_common_drv.h
@@ -49,11 +49,6 @@ struct service_hndl {
struct list_head list;
};

-static inline int get_current_node(void)
-{
- return topology_physical_package_id(raw_smp_processor_id());
-}
-
int adf_service_register(struct service_hndl *service);
int adf_service_unregister(struct service_hndl *service);

diff --git a/drivers/crypto/qat/qat_common/qat_algs.c b/drivers/crypto/qat/qat_common/qat_algs.c
index f998ed58457c..c0ffaebcc8b8 100644
--- a/drivers/crypto/qat/qat_common/qat_algs.c
+++ b/drivers/crypto/qat/qat_common/qat_algs.c
@@ -618,7 +618,7 @@ static int qat_alg_aead_newkey(struct crypto_aead *tfm, const u8 *key,
{
struct qat_alg_aead_ctx *ctx = crypto_aead_ctx(tfm);
struct qat_crypto_instance *inst = NULL;
- int node = get_current_node();
+ int node = numa_node_id();
struct device *dev;
int ret;

@@ -1042,7 +1042,7 @@ static int qat_alg_skcipher_newkey(struct qat_alg_skcipher_ctx *ctx,
{
struct qat_crypto_instance *inst = NULL;
struct device *dev;
- int node = get_current_node();
+ int node = numa_node_id();
int ret;

inst = qat_crypto_get_instance_node(node);
diff --git a/drivers/crypto/qat/qat_common/qat_asym_algs.c b/drivers/crypto/qat/qat_common/qat_asym_algs.c
index b0b78445418b..3701eac10bce 100644
--- a/drivers/crypto/qat/qat_common/qat_asym_algs.c
+++ b/drivers/crypto/qat/qat_common/qat_asym_algs.c
@@ -480,7 +480,7 @@ static int qat_dh_init_tfm(struct crypto_kpp *tfm)
{
struct qat_dh_ctx *ctx = kpp_tfm_ctx(tfm);
struct qat_crypto_instance *inst =
- qat_crypto_get_instance_node(get_current_node());
+ qat_crypto_get_instance_node(numa_node_id());

if (!inst)
return -EINVAL;
@@ -1218,7 +1218,7 @@ static int qat_rsa_init_tfm(struct crypto_akcipher *tfm)
{
struct qat_rsa_ctx *ctx = akcipher_tfm_ctx(tfm);
struct qat_crypto_instance *inst =
- qat_crypto_get_instance_node(get_current_node());
+ qat_crypto_get_instance_node(numa_node_id());

if (!inst)
return -EINVAL;
--
2.25.1

2022-06-17 08:50:05

by Cabiddu, Giovanni

[permalink] [raw]
Subject: Re: [PATCH 0/2] Crypto: Remove x86 dependency on QAT drivers

Hi Yoan,

On Mon, Jun 13, 2022 at 02:25:33PM +0000, Yoan Picchi wrote:
> The QAT acceleration card can be very helpfull for some tasks like dealing
> with IPSEC but it is currently restricted to be used only on x86 machine.
> Looking at the code we didn't see any reasons why those drivers might not
> work on other architectures. We've successfully built all of them on x86,
> arm64, arm32, mips64, powerpc64, riscv64 and sparc64.
>
> We also have tested the driver with an Intel Corporation C62x Chipset
> QuickAssist Technology (rev 04) PCIe card on an arm64 server. After the numa
> patch, it works with the AF_ALG crypto userland interface, allowing us to
> encrypt some data with cbc for instance. We've also successfully created some
> VF, bound them to DPDK, and used the card this way, thus showing some real
> life usecases of x86 do work on arm64 too.
>
> Changelog v1 ... v2:
> - add COMPILE_TEST to Kconfig
>
> Andre Przywara (1):
> crypto: qat: replace get_current_node() with numa_node_id()
>
> Yoan Picchi (1):
> Removes the x86 dependency on the QAT drivers
Would you mind re-sending the set changing the headline of the commit
messages as reported in the previous email?
https://www.spinics.net/lists/linux-crypto/msg64584.html

Thanks,

--
Giovanni