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 <gary.h...@amd.com>
---
 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);
 }
 

Reply via email to