Message ID | 20211126020307.2168767-3-libaokun1@huawei.com |
---|---|
State | New |
Headers | show |
Series | fix two bugs when trying rmmod sata_fsl | expand |
On 11/26/21 5:03 AM, Baokun Li wrote: > Trying to remove the fsl-sata module in the PPC64 GNU/Linux > leads to the following warning: > ------------[ cut here ]------------ > remove_proc_entry: removing non-empty directory 'irq/69', > leaking at least 'fsl-sata[ff0221000.sata]' > WARNING: CPU: 3 PID: 1048 at fs/proc/generic.c:722 > .remove_proc_entry+0x20c/0x220 > IRQMASK: 0 > NIP [c00000000033826c] .remove_proc_entry+0x20c/0x220 > LR [c000000000338268] .remove_proc_entry+0x208/0x220 > Call Trace: > .remove_proc_entry+0x208/0x220 (unreliable) > .unregister_irq_proc+0x104/0x140 > .free_desc+0x44/0xb0 > .irq_free_descs+0x9c/0xf0 > .irq_dispose_mapping+0x64/0xa0 > .sata_fsl_remove+0x58/0xa0 [sata_fsl] > .platform_drv_remove+0x40/0x90 > .device_release_driver_internal+0x160/0x2c0 > .driver_detach+0x64/0xd0 > .bus_remove_driver+0x70/0xf0 > .driver_unregister+0x38/0x80 > .platform_driver_unregister+0x14/0x30 > .fsl_sata_driver_exit+0x18/0xa20 [sata_fsl] > ---[ end trace 0ea876d4076908f5 ]--- > > The driver creates the mapping by calling irq_of_parse_and_map(), > so it also has to dispose the mapping. But the easy way out is to > simply use platform_get_irq() instead of irq_of_parse_map(). Also > we should adapt return value checking and propagate error values. > > In this case the mapping is not managed by the device but by > the of core, so the device has not to dispose the mapping. > > Fixes: faf0b2e5afe7 ("drivers/ata: add support to Freescale 3.0Gbps SATA Controller") > Cc: stable@vger.kernel.org > Reported-by: Hulk Robot <hulkci@huawei.com> > Signed-off-by: Baokun Li <libaokun1@huawei.com> Reviewed-by: Sergei Shtylyov <sergei.shtylyov@gmail.com> MBR, Sergei
在 2021/11/27 3:44, Sergei Shtylyov 写道: > On 11/26/21 5:03 AM, Baokun Li wrote: > >> Trying to remove the fsl-sata module in the PPC64 GNU/Linux >> leads to the following warning: >> ------------[ cut here ]------------ >> remove_proc_entry: removing non-empty directory 'irq/69', >> leaking at least 'fsl-sata[ff0221000.sata]' >> WARNING: CPU: 3 PID: 1048 at fs/proc/generic.c:722 >> .remove_proc_entry+0x20c/0x220 >> IRQMASK: 0 >> NIP [c00000000033826c] .remove_proc_entry+0x20c/0x220 >> LR [c000000000338268] .remove_proc_entry+0x208/0x220 >> Call Trace: >> .remove_proc_entry+0x208/0x220 (unreliable) >> .unregister_irq_proc+0x104/0x140 >> .free_desc+0x44/0xb0 >> .irq_free_descs+0x9c/0xf0 >> .irq_dispose_mapping+0x64/0xa0 >> .sata_fsl_remove+0x58/0xa0 [sata_fsl] >> .platform_drv_remove+0x40/0x90 >> .device_release_driver_internal+0x160/0x2c0 >> .driver_detach+0x64/0xd0 >> .bus_remove_driver+0x70/0xf0 >> .driver_unregister+0x38/0x80 >> .platform_driver_unregister+0x14/0x30 >> .fsl_sata_driver_exit+0x18/0xa20 [sata_fsl] >> ---[ end trace 0ea876d4076908f5 ]--- >> >> The driver creates the mapping by calling irq_of_parse_and_map(), >> so it also has to dispose the mapping. But the easy way out is to >> simply use platform_get_irq() instead of irq_of_parse_map(). Also >> we should adapt return value checking and propagate error values. >> >> In this case the mapping is not managed by the device but by >> the of core, so the device has not to dispose the mapping. >> >> Fixes: faf0b2e5afe7 ("drivers/ata: add support to Freescale 3.0Gbps SATA Controller") >> Cc: stable@vger.kernel.org >> Reported-by: Hulk Robot <hulkci@huawei.com> >> Signed-off-by: Baokun Li <libaokun1@huawei.com> > Reviewed-by: Sergei Shtylyov <sergei.shtylyov@gmail.com> > > MBR, Sergei > . Thank you for your review.
diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c index 2eb216792695..3b31a4f596d8 100644 --- a/drivers/ata/sata_fsl.c +++ b/drivers/ata/sata_fsl.c @@ -1490,9 +1490,9 @@ static int sata_fsl_probe(struct platform_device *ofdev) host_priv->ssr_base = ssr_base; host_priv->csr_base = csr_base; - irq = irq_of_parse_and_map(ofdev->dev.of_node, 0); - if (!irq) { - dev_err(&ofdev->dev, "invalid irq from platform\n"); + irq = platform_get_irq(ofdev, 0); + if (irq < 0) { + retval = irq; goto error_exit_with_cleanup; } host_priv->irq = irq; @@ -1567,8 +1567,6 @@ static int sata_fsl_remove(struct platform_device *ofdev) ata_host_detach(host); - irq_dispose_mapping(host_priv->irq); - return 0; }
Trying to remove the fsl-sata module in the PPC64 GNU/Linux leads to the following warning: ------------[ cut here ]------------ remove_proc_entry: removing non-empty directory 'irq/69', leaking at least 'fsl-sata[ff0221000.sata]' WARNING: CPU: 3 PID: 1048 at fs/proc/generic.c:722 .remove_proc_entry+0x20c/0x220 IRQMASK: 0 NIP [c00000000033826c] .remove_proc_entry+0x20c/0x220 LR [c000000000338268] .remove_proc_entry+0x208/0x220 Call Trace: .remove_proc_entry+0x208/0x220 (unreliable) .unregister_irq_proc+0x104/0x140 .free_desc+0x44/0xb0 .irq_free_descs+0x9c/0xf0 .irq_dispose_mapping+0x64/0xa0 .sata_fsl_remove+0x58/0xa0 [sata_fsl] .platform_drv_remove+0x40/0x90 .device_release_driver_internal+0x160/0x2c0 .driver_detach+0x64/0xd0 .bus_remove_driver+0x70/0xf0 .driver_unregister+0x38/0x80 .platform_driver_unregister+0x14/0x30 .fsl_sata_driver_exit+0x18/0xa20 [sata_fsl] ---[ end trace 0ea876d4076908f5 ]--- The driver creates the mapping by calling irq_of_parse_and_map(), so it also has to dispose the mapping. But the easy way out is to simply use platform_get_irq() instead of irq_of_parse_map(). Also we should adapt return value checking and propagate error values. In this case the mapping is not managed by the device but by the of core, so the device has not to dispose the mapping. Fixes: faf0b2e5afe7 ("drivers/ata: add support to Freescale 3.0Gbps SATA Controller") Cc: stable@vger.kernel.org Reported-by: Hulk Robot <hulkci@huawei.com> Signed-off-by: Baokun Li <libaokun1@huawei.com> --- V1->V2: Adapt return value checking and propagate error values. V2->V3: Add fixed and CC stable. V4->V5: Delete duplicate dev_err() message. drivers/ata/sata_fsl.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)