Hi John and Alexandre,

On 7.4.2017 09:12, Michal Simek wrote:
> On 16.3.2017 16:35, Michal Simek wrote:
>> Hi John and Alexandre,
>>
>> On 6.3.2017 15:56, Michal Simek wrote:
>>> On 3.3.2017 21:04, John Stultz wrote:
>>>> On Fri, Mar 3, 2017 at 6:46 AM, Michal Simek <mon...@monstr.eu> wrote:
>>>>> Hi Alexandre,
>>>>>
>>>>> On 3.3.2017 10:41, Michal Simek wrote:
>>>>>> Hi Alexandre,
>>>>>>
>>>>>> On 23.2.2017 13:14, Alexandre Belloni wrote:
>>>>>>> Hi Michal,
>>>>>>>
>>>>>>> I've been thinking about this issue (and meaning to actually test).
>>>>>>>
>>>>>>> On 08/12/2016 at 14:02:36 +0100, Michal Simek wrote:
>>>>>>>> Hi guys,
>>>>>>>>
>>>>>>>> I am trying to find out reason for this behavior. If rtc-zynqmp is used
>>>>>>>> as module for the first time it is correctly probed based on aliases
>>>>>>>> setting. (rtc5 for log below). But then driver is removed and add again
>>>>>>>> rtc5 is still not freed. rtc_device_release() is not called that's why
>>>>>>>> rtc->id can't be used again.
>>>>>>>>
>>>>>>>> sh-4.3# modprobe rtc-zynqmp
>>>>>>>> [   42.468565] rtc_zynqmp ffa60000.rtc: rtc core: registered
>>>>>>>> ffa60000.rtc as rtc5
>>>>>>>> sh-4.3# rmmod rtc-zynqmp
>>>>>>>> sh-4.3# modprobe rtc-zynqmp
>>>>>>>> [   48.648222] rtc_zynqmp ffa60000.rtc: /aliases ID 5 not available
>>>>>>>> [   48.654280] rtc_zynqmp ffa60000.rtc: rtc core: registered
>>>>>>>> ffa60000.rtc as rtc0
>>>>>>>>
>>>>>>>>
>>>>>>>> I didn't try different rtc drivers but it looks like that someone keeps
>>>>>>>> reference that's why release function is not called.
>>>>>>>>
>>>>>>>> Can someone check this with different RTC module?
>>>>>>>
>>>>>>> I'll do that soon.
>>>>>>
>>>>>> Have you tried it?
>>>>>>
>>>>>>>
>>>>>>>> Or is this expected behavior?
>>>>>>>>
>>>>>>>
>>>>>>> I don't think so :)
>>>>>>>
>>>>>>> Can you clarify a few things:
>>>>>>>  - is this the only rtc with a driver on your system ?
>>>>>>
>>>>>> yes only one.
>>>>>>
>>>>>>>  - is it selected as the RTC_SYSTOHC_DEVICE or RTC_HCTOSYS_DEVICE. I've
>>>>>>>    checked the code and I don't think this is the issue but it is worth
>>>>>>> testing.
>>>>>>
>>>>>> This is the setting.
>>>>>>
>>>>>> CONFIG_RTC_HCTOSYS=y
>>>>>> CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
>>>>>> CONFIG_RTC_SYSTOHC=y
>>>>>> CONFIG_RTC_SYSTOHC_DEVICE="rtc0"
>>>>>>
>>>>>> What I see is that rtc_device_release is not called which is that
>>>>>> function which contain ida_simple_remove.
>>>>>>
>>>>>> I have alias for rtc0 (rtc0 = &rtc;)
>>>>>> And here is a log with debug. As you see when driver is removed for the
>>>>>> first time rtc_device_release is not called. When this is done for the
>>>>>> second time rtc_device_release is called properly and the same device
>>>>>> allocated via ida is used.
>>>>>>
>>>>>> root@linaro-alip:~# dmesg | grep rtc
>>>>>> [    3.372715] [drm] Cannot find any crtc or sizes - going 1024x768
>>>>>> [    3.422099] hctosys: unable to open rtc device (rtc0)
>>>>>> [    6.578930] rtc_zynqmp ffa60000.rtc: rtc core: registered
>>>>>> ffa60000.rtc as rtc0
>>>>>> root@linaro-alip:~#
>>>>>> root@linaro-alip:~# lsmod
>>>>>> Module                  Size  Used by
>>>>>> rtc_zynqmp             16384  0
>>>>>> uio_pdrv_genirq        16384  0
>>>>>> root@linaro-alip:~# rmmod rtc_zynqmp
>>>>>> [   26.805172] rtc_core: devm_rtc_device_unregister
>>>>>> [   26.809794] rtc_core: devm_rtc_device_release
>>>>>> [   26.814129] rtc_core: rtc_device_unregister
>>>>>> root@linaro-alip:~# modprobe rtc_zynqmp
>>>>>> [   35.879655] rtc_zynqmp ffa60000.rtc: /aliases ID 0 not available
>>>>>> [   35.886002] rtc_zynqmp ffa60000.rtc: rtc core: registered
>>>>>> ffa60000.rtc as rtc1
>>>>>> root@linaro-alip:~# rmmod rtc_zynqmp
>>>>>> [  122.140487] rtc_core: devm_rtc_device_unregister
>>>>>> [  122.145110] rtc_core: devm_rtc_device_release
>>>>>> [  122.149443] rtc_core: rtc_device_unregister
>>>>>> [  122.153770] rtc_core: rtc_device_release
>>>>>> root@linaro-alip:~# modprobe rtc_zynqmp
>>>>>> [  123.646002] rtc_zynqmp ffa60000.rtc: /aliases ID 0 not available
>>>>>> [  123.652249] rtc_zynqmp ffa60000.rtc: rtc core: registered
>>>>>> ffa60000.rtc as rtc1
>>>>>> root@linaro-alip:~# rmmod rtc_zynqmp
>>>>>> [  125.876188] rtc_core: devm_rtc_device_release
>>>>>> [  125.880554] rtc_core: rtc_device_unregister
>>>>>> [  125.885163] rtc_core: rtc_device_release
>>>>>> root@linaro-alip:~#
>>>>>>
>>>>>> I have also done experiment to setup rtc alias to rtc1 and this ID is
>>>>>> used only once. It looks like something is not released properly.
>>>>>>
>>>>>> This is out of tree driver but I can't see any specific code which could
>>>>>> improve behavior.
>>>>>> I have tested i2c rtc mcp79410 and there is not a visible problem but it
>>>>>> is not MMIO.
>>>>>
>>>>> This is the function which is making the difference.
>>>>>
>>>>> It was added by John Stultz:
>>>>> "timers: Introduce in-kernel alarm-timer interface"
>>>>> (sha1:  ff3ead96d17f47ee70c294a5cc2cce9b61e82f0f)
>>>>>
>>>>> Probe function has device_init_wakeup(&pdev->dev, 1);
>>>>> That's why reference is taken (get_device() below)
>>>>>
>>>>> static int alarmtimer_rtc_add_device(struct device *dev,
>>>>>                                 struct class_interface *class_intf)
>>>>> {
>>>>>         unsigned long flags;
>>>>>         struct rtc_device *rtc = to_rtc_device(dev);
>>>>>
>>>>>         if (rtcdev)
>>>>>                 return -EBUSY;
>>>>>
>>>>>         pr_info("%s\n", __func__);
>>>>>
>>>>>         if (!rtc->ops->set_alarm)
>>>>>                 return -1;
>>>>>
>>>>>         pr_info("%s\n", __func__);
>>>>>
>>>>>         if (!device_may_wakeup(rtc->dev.parent))
>>>>>                 return -1;
>>>>>
>>>>>         spin_lock_irqsave(&rtcdev_lock, flags);
>>>>>         if (!rtcdev) {
>>>>>                 rtcdev = rtc;
>>>>>                 /* hold a reference so it doesn't go away */
>>>>>                 get_device(dev);
>>>>>         }
>>>>>         spin_unlock_irqrestore(&rtcdev_lock, flags);
>>>>>         return 0;
>>>>> }
>>>>>
>>>>> And in remove function device_init_wakeup(&pdev->dev, 0);
>>>>> But because there is still a reference rtc_device_release() is not
>>>>> called and ida is not freed.
>>>>>
>>>>> Generic question which I think should be asked if in this situation
>>>>> driver should be modular or not.
>>>>> If driver can be modular then somewhere should be put_device().
>>>>
>>>> So off the top of my head (sorry, packing for a trip at the moment), I
>>>> think this was because the alarmtimer subsystem needs to hold onto the
>>>> rtcdev so it doesn't disappear under it, as it will be needed when
>>>> setting any alarmtimers on suspend.
>>>>
>>>> Part of the issue is the alarmtimer interface will provide an error to
>>>> userspace if there's no rtcdev, so we don't want a situation where
>>>> timers successfully set then silently never fire because the rtc was
>>>> removed.
>>>
>>> right I fully understand that.
>>>
>>>>
>>>> That said, there may very well be bugs in how it was handled, and I've
>>>> not looked closely at it recently.
>>>
>>> On the other hand you can have multiple alarms in the system and you can
>>> remove them at run time. It means I would expect that you can remove rtc
>>> if alarm is not set. When you run application driver is in use and you
>>> can't do it.
>>>
>>> Anyway by saying this I expect every driver which setup
>>> device_init_wakeup(..,1); and device_init_wakeup(..,0) in remove has the
>>> same issue.
>>> Solution is definitely not making rtc as a module which is in my case
>>> rtc-zynqmp an option but not the best one.
>>
>> I think it is good time to continue on this.
> 
> Any update on this one?

It is quite some time from my last ping that's hwy I am sending new one.
If this is not going to be resolve I will send a patch which will simply
disable module functionality which is reasonable workaround for now.

Thanks,
Michal

-- 
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
--- 
You received this message because you are subscribed to the Google Groups 
"rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rtc-linux+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to