Hi Michal,

I've just send a patch to fix this issue (and avoid your other patch).

Could you test it? (I did test on an atmel platform)

Sorry it took so long!

On 29/06/2017 at 09:34:14 +0200, Michal Simek wrote:
> 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
> 

-- 
Alexandre Belloni, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com

-- 
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