• Greentime Hu's avatar
    riscv: Enable context tracking · ed48b297
    Greentime Hu authored
    This patch implements and enables context tracking for riscv (which is a
    prerequisite for CONFIG_NO_HZ_FULL support)
    
    It adds checking for previous state in the entry that all excepttions and
    interrupts goes to and calls context_tracking_user_exit() if it comes from
    user space. It also calls context_tracking_user_enter() if it will return
    to user space before restore_all.
    
    This patch is tested with the dynticks-testing testcase in
    qemu-system-riscv64 virt machine and Unleashed board.
    git://git.kernel.org/pub/scm/linux/kernel/git/frederic/dynticks-testing.git
    
    We can see the log here. The tick got mostly stopped during the execution
    of the user loop.
    
                            _-----=> irqs-off
                           / _----=> need-resched
                          | / _---=> hardirq/softirq
                          || / _--=> preempt-depth
                          ||| /     delay
         TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
            | |       |   ||||       |         |
       <idle>-0     [001] d..2   604.183512: sched_switch: prev_comm=swapper/1 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=taskset next_pid=273 next_prio=120
    user_loop-273   [001] d.h1   604.184788: hrtimer_expire_entry: hrtimer=000000002eda5fab function=tick_sched_timer now=604176096300
    user_loop-273   [001] d.s2   604.184897: workqueue_queue_work: work struct=00000000383402c2 function=vmstat_update workqueue=00000000f36d35d4 req_cpu=1 cpu=1
    user_loop-273   [001] dns2   604.185039: tick_stop: success=0 dependency=SCHED
    user_loop-273   [001] dn.1   604.185103: tick_stop: success=0 dependency=SCHED
    user_loop-273   [001] d..2   604.185154: sched_switch: prev_comm=taskset prev_pid=273 prev_prio=120 prev_state=R+ ==> next_comm=kworker/1:1 next_pid=46 next_prio=120
        <...>-46    [001] ....   604.185194: workqueue_execute_start: work struct 00000000383402c2: function vmstat_update
        <...>-46    [001] d..2   604.185266: sched_switch: prev_comm=kworker/1:1 prev_pid=46 prev_prio=120 prev_state=I ==> next_comm=taskset next_pid=273 next_prio=120
    user_loop-273   [001] d.h1   604.188812: hrtimer_expire_entry: hrtimer=000000002eda5fab function=tick_sched_timer now=604180133400
    user_loop-273   [001] d..1   604.189050: tick_stop: success=1 dependency=NONE
    user_loop-273   [001] d..2   614.251386: sched_switch: prev_comm=user_loop prev_pid=273 prev_prio=120 prev_state=X ==> next_comm=swapper/1 next_pid=0 next_prio=120
       <idle>-0     [001] d..2   614.315391: sched_switch: prev_comm=swapper/1 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=taskset next_pid=276 next_prio=120
    Signed-off-by: default avatarGreentime Hu <greentime.hu@sifive.com>
    Signed-off-by: default avatarPalmer Dabbelt <palmerdabbelt@google.com>
    ed48b297
entry.S 11.6 KB