On Tue, Dec 13, 2016 at 12:13:22PM +0100, Martin Schwidefsky wrote:
> On Mon, 12 Dec 2016 16:02:30 +0100
> Frederic Weisbecker <[email protected]> wrote:
> 
> > On Mon, Dec 12, 2016 at 11:27:54AM +0100, Martin Schwidefsky wrote:
> > > 3) The call to vtime_flush in account_process_tick is done in irq context 
> > > from
> > >    update_process_times. hardirq_offset==1 is also correct.  
> > 
> > Let's see this for example:
> > 
> > +       if ((tsk->flags & PF_VCPU) && (irq_count() - hardirq_offset == 0))
> > +               S390_lowcore.guest_timer += timer;
> > 
> > If the tick is interrupting guest, we have accounted the guest time on tick 
> > IRQ entry.
> > Now we are in the middle of the tick interrupt and since hardirq_offset is 
> > 1, we
> > are taking the above path by accounting half of the tick-IRQ time as guest, 
> > which is wrong,
> > it's actually IRQ time.
> 
> Hmm, you got me there. The system time from irq_enter until 
> account_process_tick
> is reached is indeed IRQ time. It is not much but it is incorrect. The best 
> fix
> would be to rip out the accounting of the system time from 
> account_process_tick
> as irq_enter / irq_exit will do system time accounting anyway. To do that
> do_account_vtime needs to be split, because for the task switch we need to
> account the system time of the previous task.

Exactly!

Reply via email to