On 19/03/15 15:14, Greg Kroah-Hartman wrote:
> On Thu, Mar 19, 2015 at 02:49:21PM +0000, Brian Russell wrote:
>> On 19/03/15 14:23, Greg Kroah-Hartman wrote:
>>> On Thu, Mar 19, 2015 at 02:11:19PM +0000, Brian Russell wrote:
>>>>    if (info->irq && (info->irq != UIO_IRQ_CUSTOM)) {
>>>> -          ret = devm_request_irq(idev->dev, info->irq, uio_interrupt,
>>>> +          ret = request_irq(info->irq, uio_interrupt,
>>>>                              info->irq_flags, info->name, idev);
>>>
>>> Why move this away from the device lifecycle?
>>>
>>
>> I ran into a problem here: after device unregister the parent module (in my 
>> case igb_uio in DPDK) can call pci_disable_msi. From the PCI MSI how to:
>>
>> "Before calling this function, a device driver must always call free_irq()
>> on any interrupt for which it previously called request_irq().
>> Failure to do so results in a BUG_ON(), leaving the device with
>> MSI enabled and thus leaking its vector."
>>
>> So I need the free_irq, but the device may still have open fds and therefore 
>> be around a bit longer waiting for them to be released.
> 
> Note, please wrap your email lines...
> 
> Anyway, ok, that makes sense.  But put in a big comment in here about
> this so that someone doesn't try to convert it to devm_* in the future.
> 
> Can you do this in a separate patch first as well?  Burrying it in a
> pointer conversion patch isn't good.
> 

I've separated out the irq bits into a separate patch, which depends
on patching on top of the first patch. I'm a bit unsure how to go about
sending the update now the patches are broken out and only one featured
in the previous versions. Does this seek ok?

3 separate mails:

[PATCH v8 0/2] uio: Fix uio hotplug issues
summary of patches

[PATCH v8 1/2] uio: Fix uio driver to refcount device
original patch minus irq and include version changes

[PATCH v8 2/2] uio: Request/free irq separate from dev lifecycle
broken out irq bits, no other version info


... or should the v8 only go on the first patch?

Thanks,

Brian


>>>>  err_device_create:
>>>>    uio_free_minor(idev);
>>>>    return ret;
>>>> @@ -871,8 +892,10 @@ void uio_unregister_device(struct uio_info *info)
>>>>  
>>>>    uio_dev_del_attributes(idev);
>>>>  
>>>> -  device_destroy(&uio_class, MKDEV(uio_major, idev->minor));
>>>> +  device_unregister(&idev->dev);
>>>> +  free_irq(idev->info->irq, idev);
>>>>  
>>>> +  idev->info = NULL;
>>>
>>> Why?  If this was the last reference count, isn't idev now gone?  You
>>> shouldn't be referencing it anymore.
>>>
>>
>> No, the device can be unregistered here but still have outstanding refcount 
>> because of open fds. The count can get to zero in the release function, so 
>> idev could still be around after this but the calling module could free info.
> 
> Yes, but if it was the last reference, idev is now a stale pointer and
> you just derefrenced it.  Twice.  :(
> 
> Once you do a put, and don't have a reference on the pointer, you can't
> touch that pointer again.
> 
> thanks,
> 
> greg k-h
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to