* [PATCH] rtc: interface: set the next alarm event appropriately
@ 2017-09-20 3:22 Xu Yiping
2017-09-20 9:16 ` Alexandre Belloni
0 siblings, 1 reply; 5+ messages in thread
From: Xu Yiping @ 2017-09-20 3:22 UTC (permalink / raw)
To: a.zummo, alexandre.belloni, linux-rtc, linux-kernel, roy.chenjun,
colin.king, wanghao24
From: Xu YiPing <xuyiping@hisilicon.com>
After commit 2b2f5ff00f63 ("rtc: interface: ignore expired timers when
enqueuing new timers"), the rtc_timer_enqueue will not reprogram the RTC
when there is any non-expired timers in the timerqueue. If we set a
RTC_TIMER between now and the next non-expired timers, it won't go into
effect in time.
So, besides ignoring the expired timers, we should take the next effect
timer into account, and reprogram the RTC timer appropriately.
Signed-off-by: Xu YiPing <xuyiping@hisilicon.com>
Signed-off-by: Chen Jun <roy.chenjun@hisilicon.com>
---
drivers/rtc/interface.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
index 8cec9a0..e237166 100644
--- a/drivers/rtc/interface.c
+++ b/drivers/rtc/interface.c
@@ -766,20 +766,23 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer)
struct timerqueue_node *next = timerqueue_getnext(&rtc->timerqueue);
struct rtc_time tm;
ktime_t now;
+ ktime_t next_effect = KTIME_MAX;
timer->enabled = 1;
__rtc_read_time(rtc, &tm);
now = rtc_tm_to_ktime(tm);
- /* Skip over expired timers */
+ /* Skip over expired timers, get next effect timer */
while (next) {
- if (next->expires >= now)
+ if (next->expires >= now) {
+ next_effect = next->expires;
break;
+ }
next = timerqueue_iterate_next(next);
}
timerqueue_add(&rtc->timerqueue, &timer->node);
- if (!next) {
+ if (timer->node.expires < next_effect) {
struct rtc_wkalrm alarm;
int err;
alarm.time = rtc_ktime_to_tm(timer->node.expires);
--
2.7.4
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH] rtc: interface: set the next alarm event appropriately
2017-09-20 3:22 [PATCH] rtc: interface: set the next alarm event appropriately Xu Yiping
@ 2017-09-20 9:16 ` Alexandre Belloni
2017-09-20 9:36 ` YiPing Xu
2017-09-21 6:45 ` YiPing Xu
0 siblings, 2 replies; 5+ messages in thread
From: Alexandre Belloni @ 2017-09-20 9:16 UTC (permalink / raw)
To: Xu Yiping
Cc: a.zummo, linux-rtc, linux-kernel, roy.chenjun, colin.king,
wanghao24
Hi,
On 20/09/2017 at 11:22:31 +0800, Xu Yiping wrote:
> From: Xu YiPing <xuyiping@hisilicon.com>
>
> After commit 2b2f5ff00f63 ("rtc: interface: ignore expired timers when
> enqueuing new timers"), the rtc_timer_enqueue will not reprogram the RTC
> when there is any non-expired timers in the timerqueue. If we set a
> RTC_TIMER between now and the next non-expired timers, it won't go into
> effect in time.
>
> So, besides ignoring the expired timers, we should take the next effect
> timer into account, and reprogram the RTC timer appropriately.
>
Can you try this patch instead? I think it solves this issue:
http://patchwork.ozlabs.org/patch/792482/
> Signed-off-by: Xu YiPing <xuyiping@hisilicon.com>
> Signed-off-by: Chen Jun <roy.chenjun@hisilicon.com>
> ---
> drivers/rtc/interface.c | 9 ++++++---
> 1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
> index 8cec9a0..e237166 100644
> --- a/drivers/rtc/interface.c
> +++ b/drivers/rtc/interface.c
> @@ -766,20 +766,23 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer)
> struct timerqueue_node *next = timerqueue_getnext(&rtc->timerqueue);
> struct rtc_time tm;
> ktime_t now;
> + ktime_t next_effect = KTIME_MAX;
>
> timer->enabled = 1;
> __rtc_read_time(rtc, &tm);
> now = rtc_tm_to_ktime(tm);
>
> - /* Skip over expired timers */
> + /* Skip over expired timers, get next effect timer */
> while (next) {
> - if (next->expires >= now)
> + if (next->expires >= now) {
> + next_effect = next->expires;
> break;
> + }
> next = timerqueue_iterate_next(next);
> }
>
> timerqueue_add(&rtc->timerqueue, &timer->node);
> - if (!next) {
> + if (timer->node.expires < next_effect) {
> struct rtc_wkalrm alarm;
> int err;
> alarm.time = rtc_ktime_to_tm(timer->node.expires);
> --
> 2.7.4
>
--
Alexandre Belloni, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [PATCH] rtc: interface: set the next alarm event appropriately
2017-09-20 9:16 ` Alexandre Belloni
@ 2017-09-20 9:36 ` YiPing Xu
2017-09-21 6:45 ` YiPing Xu
1 sibling, 0 replies; 5+ messages in thread
From: YiPing Xu @ 2017-09-20 9:36 UTC (permalink / raw)
To: Alexandre Belloni
Cc: a.zummo, linux-rtc, linux-kernel, roy.chenjun, colin.king,
wanghao24
Hi,
On 2017/9/20 17:16, Alexandre Belloni wrote:
> Hi,
>
> On 20/09/2017 at 11:22:31 +0800, Xu Yiping wrote:
>> From: Xu YiPing <xuyiping@hisilicon.com>
>>
>> After commit 2b2f5ff00f63 ("rtc: interface: ignore expired timers when
>> enqueuing new timers"), the rtc_timer_enqueue will not reprogram the RTC
>> when there is any non-expired timers in the timerqueue. If we set a
>> RTC_TIMER between now and the next non-expired timers, it won't go into
>> effect in time.
>>
>> So, besides ignoring the expired timers, we should take the next effect
>> timer into account, and reprogram the RTC timer appropriately.
>>
>
> Can you try this patch instead? I think it solves this issue:
> http://patchwork.ozlabs.org/patch/792482/
it looks work.
will it be merged into the main tree ?
>> Signed-off-by: Xu YiPing <xuyiping@hisilicon.com>
>> Signed-off-by: Chen Jun <roy.chenjun@hisilicon.com>
>> ---
>> drivers/rtc/interface.c | 9 ++++++---
>> 1 file changed, 6 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
>> index 8cec9a0..e237166 100644
>> --- a/drivers/rtc/interface.c
>> +++ b/drivers/rtc/interface.c
>> @@ -766,20 +766,23 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer)
>> struct timerqueue_node *next = timerqueue_getnext(&rtc->timerqueue);
>> struct rtc_time tm;
>> ktime_t now;
>> + ktime_t next_effect = KTIME_MAX;
>>
>> timer->enabled = 1;
>> __rtc_read_time(rtc, &tm);
>> now = rtc_tm_to_ktime(tm);
>>
>> - /* Skip over expired timers */
>> + /* Skip over expired timers, get next effect timer */
>> while (next) {
>> - if (next->expires >= now)
>> + if (next->expires >= now) {
>> + next_effect = next->expires;
>> break;
>> + }
>> next = timerqueue_iterate_next(next);
>> }
>>
>> timerqueue_add(&rtc->timerqueue, &timer->node);
>> - if (!next) {
>> + if (timer->node.expires < next_effect) {
>> struct rtc_wkalrm alarm;
>> int err;
>> alarm.time = rtc_ktime_to_tm(timer->node.expires);
>> --
>> 2.7.4
>>
>
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [PATCH] rtc: interface: set the next alarm event appropriately
2017-09-20 9:16 ` Alexandre Belloni
2017-09-20 9:36 ` YiPing Xu
@ 2017-09-21 6:45 ` YiPing Xu
2017-09-21 8:57 ` Alexandre Belloni
1 sibling, 1 reply; 5+ messages in thread
From: YiPing Xu @ 2017-09-21 6:45 UTC (permalink / raw)
To: Alexandre Belloni
Cc: a.zummo, linux-rtc, linux-kernel, roy.chenjun, colin.king,
wanghao24
On 2017/9/20 17:16, Alexandre Belloni wrote:
> Hi,
>
> On 20/09/2017 at 11:22:31 +0800, Xu Yiping wrote:
>> From: Xu YiPing <xuyiping@hisilicon.com>
>>
>> After commit 2b2f5ff00f63 ("rtc: interface: ignore expired timers when
>> enqueuing new timers"), the rtc_timer_enqueue will not reprogram the RTC
>> when there is any non-expired timers in the timerqueue. If we set a
>> RTC_TIMER between now and the next non-expired timers, it won't go into
>> effect in time.
>>
>> So, besides ignoring the expired timers, we should take the next effect
>> timer into account, and reprogram the RTC timer appropriately.
>>
>
> Can you try this patch instead? I think it solves this issue:
> http://patchwork.ozlabs.org/patch/792482/
We've tested this patch, it works too.
Will it be merged into the main tree?
>> Signed-off-by: Xu YiPing <xuyiping@hisilicon.com>
>> Signed-off-by: Chen Jun <roy.chenjun@hisilicon.com>
>> ---
>> drivers/rtc/interface.c | 9 ++++++---
>> 1 file changed, 6 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
>> index 8cec9a0..e237166 100644
>> --- a/drivers/rtc/interface.c
>> +++ b/drivers/rtc/interface.c
>> @@ -766,20 +766,23 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer)
>> struct timerqueue_node *next = timerqueue_getnext(&rtc->timerqueue);
>> struct rtc_time tm;
>> ktime_t now;
>> + ktime_t next_effect = KTIME_MAX;
>>
>> timer->enabled = 1;
>> __rtc_read_time(rtc, &tm);
>> now = rtc_tm_to_ktime(tm);
>>
>> - /* Skip over expired timers */
>> + /* Skip over expired timers, get next effect timer */
>> while (next) {
>> - if (next->expires >= now)
>> + if (next->expires >= now) {
>> + next_effect = next->expires;
>> break;
>> + }
>> next = timerqueue_iterate_next(next);
>> }
>>
>> timerqueue_add(&rtc->timerqueue, &timer->node);
>> - if (!next) {
>> + if (timer->node.expires < next_effect) {
>> struct rtc_wkalrm alarm;
>> int err;
>> alarm.time = rtc_ktime_to_tm(timer->node.expires);
>> --
>> 2.7.4
>>
>
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [PATCH] rtc: interface: set the next alarm event appropriately
2017-09-21 6:45 ` YiPing Xu
@ 2017-09-21 8:57 ` Alexandre Belloni
0 siblings, 0 replies; 5+ messages in thread
From: Alexandre Belloni @ 2017-09-21 8:57 UTC (permalink / raw)
To: YiPing Xu
Cc: a.zummo, linux-rtc, linux-kernel, roy.chenjun, colin.king,
wanghao24
Hi,
On 21/09/2017 at 14:45:17 +0800, YiPing Xu wrote:
>
>
> On 2017/9/20 17:16, Alexandre Belloni wrote:
> > Hi,
> >
> > On 20/09/2017 at 11:22:31 +0800, Xu Yiping wrote:
> > > From: Xu YiPing <xuyiping@hisilicon.com>
> > >
> > > After commit 2b2f5ff00f63 ("rtc: interface: ignore expired timers when
> > > enqueuing new timers"), the rtc_timer_enqueue will not reprogram the RTC
> > > when there is any non-expired timers in the timerqueue. If we set a
> > > RTC_TIMER between now and the next non-expired timers, it won't go into
> > > effect in time.
> > >
> > > So, besides ignoring the expired timers, we should take the next effect
> > > timer into account, and reprogram the RTC timer appropriately.
> > >
> >
> > Can you try this patch instead? I think it solves this issue:
> > http://patchwork.ozlabs.org/patch/792482/
>
> We've tested this patch, it works too.
>
> Will it be merged into the main tree?
>
Yes, I will send it as a fix for 4.14.
--
Alexandre Belloni, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2017-09-21 8:57 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-09-20 3:22 [PATCH] rtc: interface: set the next alarm event appropriately Xu Yiping
2017-09-20 9:16 ` Alexandre Belloni
2017-09-20 9:36 ` YiPing Xu
2017-09-21 6:45 ` YiPing Xu
2017-09-21 8:57 ` Alexandre Belloni
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox