2019-06-24 21:56:21

by Gary R Hook

[permalink] [raw]
Subject: [PATCH 04/11] crypto: ccp - module parameter to limit the number of enabled CCPs

Provide the ability to constrain the total number of enabled devices in
the system. Once maxdev devices have been configured, additional
devices are ignored.

Signed-off-by: Gary R Hook <[email protected]>
---
drivers/crypto/ccp/sp-pci.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)

diff --git a/drivers/crypto/ccp/sp-pci.c b/drivers/crypto/ccp/sp-pci.c
index c167c4671f45..b81493810689 100644
--- a/drivers/crypto/ccp/sp-pci.c
+++ b/drivers/crypto/ccp/sp-pci.c
@@ -36,6 +36,13 @@
/*
* Limit CCP use to a specifed number of queues per device.
*/
+
+static struct mutex devcount_mutex ____cacheline_aligned;
+static unsigned int devcount = 0;
+static unsigned int maxdev = 0;
+module_param(maxdev, uint, 0444);
+MODULE_PARM_DESC(maxdev, "Total number of devices to register");
+
static unsigned int nqueues = MAX_HW_QUEUES;
module_param(nqueues, uint, 0444);
MODULE_PARM_DESC(nqueues, "Number of queues per CCP (default: 5)");
@@ -193,6 +200,9 @@ static int sp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
int bar_mask;
int ret;

+ if (maxdev && (devcount >= maxdev)) /* Too many devices? */
+ return 0;
+
ret = -ENOMEM;
sp = sp_alloc_struct(dev);
if (!sp)
@@ -261,6 +271,11 @@ static int sp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
if (ret)
goto e_err;

+ /* Increase count of devices */
+ mutex_lock(&devcount_mutex);
+ devcount++;
+ mutex_unlock(&devcount_mutex);
+
return 0;

e_err:
@@ -374,6 +389,7 @@ static struct pci_driver sp_pci_driver = {

int sp_pci_init(void)
{
+ mutex_init(&devcount_mutex);
return pci_register_driver(&sp_pci_driver);
}



2019-06-24 22:17:02

by Tom Lendacky

[permalink] [raw]
Subject: Re: [PATCH 04/11] crypto: ccp - module parameter to limit the number of enabled CCPs

On 6/24/19 2:28 PM, Hook, Gary wrote:
> Provide the ability to constrain the total number of enabled devices in
> the system. Once maxdev devices have been configured, additional
> devices are ignored.
>
> Signed-off-by: Gary R Hook <[email protected]>
> ---
> drivers/crypto/ccp/sp-pci.c | 16 ++++++++++++++++
> 1 file changed, 16 insertions(+)
>
> diff --git a/drivers/crypto/ccp/sp-pci.c b/drivers/crypto/ccp/sp-pci.c
> index c167c4671f45..b81493810689 100644
> --- a/drivers/crypto/ccp/sp-pci.c
> +++ b/drivers/crypto/ccp/sp-pci.c
> @@ -36,6 +36,13 @@
> /*
> * Limit CCP use to a specifed number of queues per device.
> */
> +
> +static struct mutex devcount_mutex ____cacheline_aligned;

I don't think I'd worry about the cache alignment since this is only
used at module load.

> +static unsigned int devcount = 0;
> +static unsigned int maxdev = 0;
> +module_param(maxdev, uint, 0444);
> +MODULE_PARM_DESC(maxdev, "Total number of devices to register");
> +
> static unsigned int nqueues = MAX_HW_QUEUES;
> module_param(nqueues, uint, 0444);
> MODULE_PARM_DESC(nqueues, "Number of queues per CCP (default: 5)");
> @@ -193,6 +200,9 @@ static int sp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
> int bar_mask;
> int ret;
>
> + if (maxdev && (devcount >= maxdev)) /* Too many devices? */
> + return 0;
> +

You need the mutex to protect the use of devcount. You could use an
atomic instead of the int/mutex combination.

And this will mess with the PSP support. It should be in the CCP
specific files, not here.

> ret = -ENOMEM;
> sp = sp_alloc_struct(dev);
> if (!sp)
> @@ -261,6 +271,11 @@ static int sp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
> if (ret)
> goto e_err;
>
> + /* Increase count of devices */
> + mutex_lock(&devcount_mutex);
> + devcount++;
> + mutex_unlock(&devcount_mutex);
> +
> return 0;
>
> e_err:
> @@ -374,6 +389,7 @@ static struct pci_driver sp_pci_driver = {
>
> int sp_pci_init(void)
> {
> + mutex_init(&devcount_mutex);

Tab instead of spaces.

Thanks,
Tom

> return pci_register_driver(&sp_pci_driver);
> }
>
>