2019-06-24 21:56:22

by Gary R Hook

[permalink] [raw]
Subject: [PATCH 02/11] crypto: ccp - Add a module parameter to specify a queue count

Add a module parameter to limit the number of queues per CCP. The default
(nqueues=0) is to set up every available queue on each device.

The count of queues starts from the first one found on the device (which
is based on the device ID).

Signed-off-by: Gary R Hook <[email protected]>
---
drivers/crypto/ccp/ccp-dev-v5.c | 9 ++++++++-
drivers/crypto/ccp/ccp-dev.h | 15 +++++++++++++++
drivers/crypto/ccp/sp-pci.c | 15 ++++++++++++++-
3 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/drivers/crypto/ccp/ccp-dev-v5.c b/drivers/crypto/ccp/ccp-dev-v5.c
index a5bd11831b80..ffd546b951b6 100644
--- a/drivers/crypto/ccp/ccp-dev-v5.c
+++ b/drivers/crypto/ccp/ccp-dev-v5.c
@@ -14,12 +14,15 @@
#include <linux/kernel.h>
#include <linux/pci.h>
#include <linux/kthread.h>
-#include <linux/debugfs.h>
#include <linux/dma-mapping.h>
#include <linux/interrupt.h>
#include <linux/compiler.h>
#include <linux/ccp.h>

+#ifdef CONFIG_CRYPTO_DEV_CCP_DEBUGFS
+#include <linux/debugfs.h>
+#endif
+
#include "ccp-dev.h"

/* Allocate the requested number of contiguous LSB slots
@@ -784,6 +787,7 @@ static irqreturn_t ccp5_irq_handler(int irq, void *data)

static int ccp5_init(struct ccp_device *ccp)
{
+ unsigned int nqueues = ccp_get_nqueues_param();
struct device *dev = ccp->dev;
struct ccp_cmd_queue *cmd_q;
struct dma_pool *dma_pool;
@@ -856,6 +860,9 @@ static int ccp5_init(struct ccp_device *ccp)
init_waitqueue_head(&cmd_q->int_queue);

dev_dbg(dev, "queue #%u available\n", i);
+
+ if (ccp->cmd_q_count >= nqueues)
+ break;
}

if (ccp->cmd_q_count == 0) {
diff --git a/drivers/crypto/ccp/ccp-dev.h b/drivers/crypto/ccp/ccp-dev.h
index 6810b65c1939..d812446213ee 100644
--- a/drivers/crypto/ccp/ccp-dev.h
+++ b/drivers/crypto/ccp/ccp-dev.h
@@ -632,6 +632,8 @@ struct ccp5_desc {
void ccp_add_device(struct ccp_device *ccp);
void ccp_del_device(struct ccp_device *ccp);

+unsigned int ccp_get_nqueues_param(void);
+
extern void ccp_log_error(struct ccp_device *, int);

struct ccp_device *ccp_alloc_struct(struct sp_device *sp);
@@ -671,4 +673,17 @@ extern const struct ccp_vdata ccpv3;
extern const struct ccp_vdata ccpv5a;
extern const struct ccp_vdata ccpv5b;

+
+#ifdef CONFIG_CRYPTO_DEV_CCP_DEBUGFS
+
+/* DebugFS stuff */
+typedef struct _modparam {
+ char *paramname;
+ void *param;
+ umode_t parammode;
+ } modparam_t;
+extern void ccp_debugfs_register_modparams(struct dentry *parentdir);
+
+#endif
+
#endif
diff --git a/drivers/crypto/ccp/sp-pci.c b/drivers/crypto/ccp/sp-pci.c
index 41bce0a3f4bb..3fab79585f72 100644
--- a/drivers/crypto/ccp/sp-pci.c
+++ b/drivers/crypto/ccp/sp-pci.c
@@ -1,7 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
+
/*
* AMD Secure Processor device driver
*
- * Copyright (C) 2013,2018 Advanced Micro Devices, Inc.
+ * Copyright (C) 2013,2019 Advanced Micro Devices, Inc.
*
* Author: Tom Lendacky <[email protected]>
* Author: Gary R Hook <[email protected]>
@@ -27,6 +29,17 @@
#include "ccp-dev.h"
#include "psp-dev.h"

+/*
+ * Limit CCP use to a specifed number of queues per device.
+ */
+static unsigned int nqueues = MAX_HW_QUEUES;
+module_param(nqueues, uint, 0444);
+MODULE_PARM_DESC(nqueues, "Number of queues per CCP (default: 5)");
+
+unsigned int ccp_get_nqueues_param(void) {
+ return nqueues;
+}
+
#define MSIX_VECTORS 2

struct sp_pci {


2019-06-24 22:08:08

by Tom Lendacky

[permalink] [raw]
Subject: Re: [PATCH 02/11] crypto: ccp - Add a module parameter to specify a queue count

On 6/24/19 2:28 PM, Hook, Gary wrote:
> Add a module parameter to limit the number of queues per CCP. The default
> (nqueues=0) is to set up every available queue on each device.

This doesn't match the code... nqueues defaults to MAX_HW_QUEUES below.
The way it is coded nqueues=0 and nqueues=1 are exactly the same.

>
> The count of queues starts from the first one found on the device (which
> is based on the device ID).
>
> Signed-off-by: Gary R Hook <[email protected]>
> ---
> drivers/crypto/ccp/ccp-dev-v5.c | 9 ++++++++-
> drivers/crypto/ccp/ccp-dev.h | 15 +++++++++++++++
> drivers/crypto/ccp/sp-pci.c | 15 ++++++++++++++-
> 3 files changed, 37 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/crypto/ccp/ccp-dev-v5.c b/drivers/crypto/ccp/ccp-dev-v5.c
> index a5bd11831b80..ffd546b951b6 100644
> --- a/drivers/crypto/ccp/ccp-dev-v5.c
> +++ b/drivers/crypto/ccp/ccp-dev-v5.c
> @@ -14,12 +14,15 @@
> #include <linux/kernel.h>
> #include <linux/pci.h>
> #include <linux/kthread.h>
> -#include <linux/debugfs.h>
> #include <linux/dma-mapping.h>
> #include <linux/interrupt.h>
> #include <linux/compiler.h>
> #include <linux/ccp.h>
>
> +#ifdef CONFIG_CRYPTO_DEV_CCP_DEBUGFS
> +#include <linux/debugfs.h>
> +#endif
> +

This belongs in the first patch.

> #include "ccp-dev.h"
>
> /* Allocate the requested number of contiguous LSB slots
> @@ -784,6 +787,7 @@ static irqreturn_t ccp5_irq_handler(int irq, void *data)
>
> static int ccp5_init(struct ccp_device *ccp)
> {
> + unsigned int nqueues = ccp_get_nqueues_param();
> struct device *dev = ccp->dev;
> struct ccp_cmd_queue *cmd_q;
> struct dma_pool *dma_pool;
> @@ -856,6 +860,9 @@ static int ccp5_init(struct ccp_device *ccp)
> init_waitqueue_head(&cmd_q->int_queue);
>
> dev_dbg(dev, "queue #%u available\n", i);
> +
> + if (ccp->cmd_q_count >= nqueues)
> + break;

In reference to my comment above, this is where nqueues=0 or 1 results
in the same thing happening.

> }
>
> if (ccp->cmd_q_count == 0) {
> diff --git a/drivers/crypto/ccp/ccp-dev.h b/drivers/crypto/ccp/ccp-dev.h
> index 6810b65c1939..d812446213ee 100644
> --- a/drivers/crypto/ccp/ccp-dev.h
> +++ b/drivers/crypto/ccp/ccp-dev.h
> @@ -632,6 +632,8 @@ struct ccp5_desc {
> void ccp_add_device(struct ccp_device *ccp);
> void ccp_del_device(struct ccp_device *ccp);
>
> +unsigned int ccp_get_nqueues_param(void);
> +
> extern void ccp_log_error(struct ccp_device *, int);
>
> struct ccp_device *ccp_alloc_struct(struct sp_device *sp);
> @@ -671,4 +673,17 @@ extern const struct ccp_vdata ccpv3;
> extern const struct ccp_vdata ccpv5a;
> extern const struct ccp_vdata ccpv5b;
>
> +
> +#ifdef CONFIG_CRYPTO_DEV_CCP_DEBUGFS
> +
> +/* DebugFS stuff */
> +typedef struct _modparam {
> + char *paramname;
> + void *param;
> + umode_t parammode;
> + } modparam_t;
> +extern void ccp_debugfs_register_modparams(struct dentry *parentdir);
> +
> +#endif
> +

You've created this typedef/struct (which should be just a struct, not
a typedef) which isn't used and reference to a function that doesn't exist
yet.

> #endif
> diff --git a/drivers/crypto/ccp/sp-pci.c b/drivers/crypto/ccp/sp-pci.c
> index 41bce0a3f4bb..3fab79585f72 100644
> --- a/drivers/crypto/ccp/sp-pci.c
> +++ b/drivers/crypto/ccp/sp-pci.c
> @@ -1,7 +1,9 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> /*
> * AMD Secure Processor device driver
> *
> - * Copyright (C) 2013,2018 Advanced Micro Devices, Inc.
> + * Copyright (C) 2013,2019 Advanced Micro Devices, Inc.
> *
> * Author: Tom Lendacky <[email protected]>
> * Author: Gary R Hook <[email protected]>
> @@ -27,6 +29,17 @@
> #include "ccp-dev.h"
> #include "psp-dev.h"
>
> +/*
> + * Limit CCP use to a specifed number of queues per device.
> + */
> +static unsigned int nqueues = MAX_HW_QUEUES;
> +module_param(nqueues, uint, 0444);
> +MODULE_PARM_DESC(nqueues, "Number of queues per CCP (default: 5)");
> +
> +unsigned int ccp_get_nqueues_param(void) {
> + return nqueues;
> +}
> +

You should define this module parameter in the file where it is used and
then you won't need the function.

Thanks,
Tom

> #define MSIX_VECTORS 2
>
> struct sp_pci {
>