driver: timer: npcx: fix the racing condition when getting current uptime
In npcx_itim_evt_isr, it updates the cyc_sys_announced variable and then calls sys_clock_announce() to update the kernel curr_tick variable. If an ISR handler with higher priority preempts the timer ISR after the sys_clock_announce is updated and before the sys_clock_announce() is called, it will read the wrong time when calling k_uptime_get() because the cyc_sys_announced and the curr_tick are not synchronized. The commit fixes the problem by raising the timer's interrupt priority to the highest one (i.e. 1 in npcx's configuration). This commit also moves the computation of the delta cycle inside the spinlock in sys_clock_elapsed() to prevent another potential racing condition. Signed-off-by: Jun Lin <CHLin56@nuvoton.com> Signed-off-by: Wealian Liao <WHLIAO@nuvoton.com>
This commit is contained in:
parent
0fe74a3f9f
commit
803a4ff620
3 changed files with 4 additions and 4 deletions
|
@ -249,12 +249,12 @@ uint32_t sys_clock_elapsed(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
k_spinlock_key_t key = k_spin_lock(&lock);
|
k_spinlock_key_t key = k_spin_lock(&lock);
|
||||||
uint64_t current = npcx_itim_get_sys_cyc64();
|
uint64_t delta_cycle = npcx_itim_get_sys_cyc64() - cyc_sys_announced;
|
||||||
|
|
||||||
k_spin_unlock(&lock, key);
|
k_spin_unlock(&lock, key);
|
||||||
|
|
||||||
/* Return how many ticks elapsed since last sys_clock_announce() call */
|
/* Return how many ticks elapsed since last sys_clock_announce() call */
|
||||||
return (uint32_t)((current - cyc_sys_announced) / SYS_CYCLES_PER_TICK);
|
return (uint32_t)(delta_cycle / SYS_CYCLES_PER_TICK);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t sys_clock_cycle_get_32(void)
|
uint32_t sys_clock_cycle_get_32(void)
|
||||||
|
|
|
@ -68,7 +68,7 @@
|
||||||
reg-names = "evt_itim", "sys_itim";
|
reg-names = "evt_itim", "sys_itim";
|
||||||
clocks = <&pcc NPCX_CLOCK_BUS_LFCLK NPCX_PWDWN_CTL4 3
|
clocks = <&pcc NPCX_CLOCK_BUS_LFCLK NPCX_PWDWN_CTL4 3
|
||||||
&pcc NPCX_CLOCK_BUS_APB2 NPCX_PWDWN_CTL7 5>;
|
&pcc NPCX_CLOCK_BUS_APB2 NPCX_PWDWN_CTL7 5>;
|
||||||
interrupts = <46 2>; /* Event timer interrupt */
|
interrupts = <46 1>; /* Event timer interrupt */
|
||||||
label = "ITIM";
|
label = "ITIM";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -69,7 +69,7 @@
|
||||||
reg-names = "evt_itim", "sys_itim";
|
reg-names = "evt_itim", "sys_itim";
|
||||||
clocks = <&pcc NPCX_CLOCK_BUS_LFCLK NPCX_PWDWN_CTL4 0
|
clocks = <&pcc NPCX_CLOCK_BUS_LFCLK NPCX_PWDWN_CTL4 0
|
||||||
&pcc NPCX_CLOCK_BUS_APB2 NPCX_PWDWN_CTL7 5>;
|
&pcc NPCX_CLOCK_BUS_APB2 NPCX_PWDWN_CTL7 5>;
|
||||||
interrupts = <28 2>; /* Event timer interrupt */
|
interrupts = <28 1>; /* Event timer interrupt */
|
||||||
label = "ITIM";
|
label = "ITIM";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue