Re: [PATCH v7 06/16] lockdep: Detect and handle hist_lock ring buffer overwrite

From: Byungchul Park
Date: Wed Jul 12 2017 - 22:11:13 EST


On Wed, Jul 12, 2017 at 09:56:17AM +0200, Peter Zijlstra wrote:
> On Wed, Jul 12, 2017 at 11:00:53AM +0900, Byungchul Park wrote:
> > On Tue, Jul 11, 2017 at 06:12:32PM +0200, Peter Zijlstra wrote:
>
> > > Right, like I wrote in the comment; I don't think you need quite this
> > > much.
> > >
> > > The problem only happens if you rewind more than MAX_XHLOCKS_NR;
> > > although I realize it can be an accumulative rewind, which makes it
> > > slightly more tricky.
> > >
> > > We can either make the rewind more expensive and make xhlock_valid()
> > > false for each rewound entry; or we can keep the max_idx and account
> >
> > Does max_idx mean the 'original position - 1'?
>
> orig_idx = current->hist_idx;
> current->hist_idx++;
> if ((int)(current->hist_idx - orig_idx) > 0)
> current->hist_idx_max = current->hist_idx;
>
>
> I've forgotten if the idx points to the most recent entry or beyond it.
>
> Given the circular nature, and tail being one ahead of head, the max
> effectively tracks the tail (I suppose we can also do an explicit tail
> tracking, but that might end up more difficult).
>
> This allows rewinds of less than array_size() while still maintaining a
> correct tail.
>
> Only once we (cummulative or not) rewind past the tail -- iow, loose the
> _entire_ history, do we need to do something drastic.

I am sorry but I don't understand why we have to do the drastic work.

Does my approach have problems, rewinding to 'original idx' on exit and
deciding whether overwrite or not? I think, this way, no need to do the
drastic work. Or.. does my one get more overhead in usual case?

>
> > > from there. If we rewind >= MAX_XHLOCKS_NR from the max_idx we need to
> > > invalidate the entire state, which we can do by invaliding
> >
> > Could you explain what the entire state is?
>
> All hist_lock[]. Did the above help?
>
> > > xhlock_valid() or by re-introduction of the hist_gen_id. When we
> >
> > What does the re-introduction of the hist_gen_id mean?
>
> What you used to call work_id or something like that. A generation count
> for the hist_lock[].