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.hook@xxxxxxx> --- 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); }