Patch "hwrng: amd - Revert managed API changes" has been added to the 4.10-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
hwrng: amd - Revert managed API changes
to the 4.10-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
hwrng-amd-revert-managed-api-changes.patch
and it can be found in the queue-4.10 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
69db7009318758769d625b023402161c750f7876Mon Sep 17 00:00:00 2001
From: Prarit Bhargava <[email protected]>
Date: Tue, 14 Mar 2017 07:36:01 -0400
Subject: hwrng: amd - Revert managed API changes
From: Prarit Bhargava <[email protected]>
commit 69db7009318758769d625b023402161c750f7876 upstream.
After commit 31b2a73c9c5f ("hwrng: amd - Migrate to managed API"), the amd-rng driver uses devres with pci_dev->dev to keep track of resources, but does not actually register a PCI driver. This results in the following issues:
1. The message
WARNING: CPU: 2 PID: 621 at drivers/base/dd.c:349 driver_probe_device+0x38c
is output when the i2c_amd756 driver loads and attempts to register a PCI driver. The PCI & device subsystems assume that no resources have been registered for the device, and the WARN_ON() triggers since amd-rng has already do so.
2. The driver leaks memory because the driver does not attach to a
device. The driver only uses the PCI device as a reference. devm_*()
functions will release resources on driver detach, which the amd-rng driver will never do. As a result,
3. The driver cannot be reloaded because there is always a use of the ioport and region after the first load of the driver.
Revert the changes made by 31b2a73c9c5f ("hwrng: amd - Migrate to managed API").
--- drivers/char/hw_random/amd-rng.c | 42 +++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-)
drivers/char/hw_random/amd-rng.c +34 -8
@@ -55,6 +55,7 @@ MODULE_DEVICE_TABLE(pci, pci_tbl);struct amd768_priv {void __iomem *iobase;struct pci_dev *pcidev; +u32 pmbase; };static int amd_rng_read (struct hwrng *rng,void *buf,size_t max,bool wait)
@@ -148,33 +149,58 @@ found:if (pmbase ==0 )return -EIO ; - priv =devm_kzalloc (&pdev->dev,sizeof (*priv),GFP_KERNEL ); + priv =kzalloc (sizeof (*priv),GFP_KERNEL );if (!priv)return -ENOMEM ; -if (!devm_request_region (&pdev->dev, pmbase +PMBASE_OFFSET , -PMBASE_SIZE ,DRV_NAME )) { +if (!request_region (pmbase +PMBASE_OFFSET ,PMBASE_SIZE ,DRV_NAME )) {dev_err (&pdev->dev,DRV_NAME " region 0x%x already in use!\n" , pmbase +0xF0 ); -return -EBUSY ; + err = -EBUSY ; + goto out; } - priv->iobase =devm_ioport_map (&pdev->dev, pmbase +PMBASE_OFFSET , -PMBASE_SIZE ); + priv->iobase =ioport_map (pmbase +PMBASE_OFFSET ,PMBASE_SIZE );if (!priv->iobase) {pr_err (DRV_NAME "Cannot map ioport\n" ); -return -ENOMEM ; + err = -EINVAL ; + goto err_iomap; } amd_rng.priv = (unsigned long )priv; + priv->pmbase = pmbase; priv->pcidev = pdev;pr_info (DRV_NAME " detected\n" ); -return devm_hwrng_register (&pdev->dev, &amd_rng); + err =hwrng_register (&amd_rng); +if (err) { +pr_err (DRV_NAME " registering failed (%d)\n" , err); + goto err_hwrng; + } +return 0 ; + +err_hwrng: +ioport_unmap (priv->iobase); +err_iomap: +release_region (pmbase +PMBASE_OFFSET ,PMBASE_SIZE ); +out: +kfree (priv); +return err; } static void __exit mod_exit(void) { +struct amd768_priv *priv; + + priv = (struct amd768_priv *)amd_rng.priv; + +hwrng_unregister (&amd_rng); + +ioport_unmap (priv->iobase); + +release_region (priv->pmbase +PMBASE_OFFSET ,PMBASE_SIZE ); + +kfree (priv); }module_init (mod_init);
Patches currently in stable-queue which might be from [email protected] are
queue-4.10/hwrng-amd-revert-managed-api-changes.patch queue-4.10/hwrng-geode-revert-managed-api-changes.patch