Re: [PATCH 2/3] X86: add a generic API to let vdso code detect context switch

Shaohua Li
2014-12-10T18:51:33Z

On Wed, Dec 10, 2014 at 10:38:41AM -0800, Andy Lutomirski wrote:
> On Sun, Dec 7, 2014 at 7:03 PM, Shaohua Li <shli@fb.com> wrote:
> > vdso code can't disable preempt, so it can be preempted at any time.
> > This makes a challenge to implement specific features. This patch adds a
> > generic API to let vdso code detect context switch.
> >
> > With this patch, every cpu maintains a context switch count. The upper
> > bits of the count is the logical cpu id, so the count can't be identical
> > for any cpu. The low bits of the count will be increased for each
> > context switch. For a x86_64 cpu with 4096 cpus, the context switch will
> > be overflowed for 2^(64 - 12) context switch, which is a long time and can be
> > ignored. The change of the count in giving time can be used to detect if
> > context switch occurs.
>
> Why do you need those high bits? I don't understand how you could
> possibly confuse one cpu's count with another's unless you fail to
> make sure that you're reading the same address both times.
>
> That being said, I don't like this patch. I'm not sure I have a much
> better idea, though. More thoughts in the 0/0 email to follow.
the vdso code doesn't disable preemption, so it can be migrated between
cpus at any time, the usage is:

get_countext_switch_count (in cpu A)
do_something (in cpu B)
get_countext_switch_count (in cpu C)

The cpu A, B, C could be completely different. We want to make sure
there is no preemption here and we use the context switch count to judge
this. If the high bits is ignored, the context switch count could be
identical even A != C, then our judgement using the switch count is
wrong.

Thanks,
Shaohua