Question about dec_lock_cnt method in Context class

Yuxin Ren ryx at gwmail.gwu.edu
Mon Sep 8 17:54:32 CEST 2014


Unfortunately this modification does not help.
I have a question about the switch_lock code.

PRIVATE inline
bool NO_INSTRUMENT
Switch_lock::set_lock_owner(Context *o)
{
  bool have_no_locks = o->_lock_cnt < 1;

  if (have_no_locks)
    {
      assert_kdb (current_cpu() == o->home_cpu());
      for (;;)
        {
          if (EXPECT_FALSE(access_once(&o->_running_under_lock)))
            continue;
          if (EXPECT_TRUE(mp_cas(&o->_running_under_lock, Mword(false),
Mword(true))))
            break;
        }
    }
    ...
}

In which case, the variable "_running_under_lock"  is set to true but the
lock_cnt is 0?
Now in my test, the kernel goes into this dead loop.
I cannot figure out how to solve this problem.

Thank you very much.
Yuixn


On Sun, Aug 31, 2014 at 5:58 PM, Adam Lackorzynski <
adam at os.inf.tu-dresden.de> wrote:

> On Fri Aug 29, 2014 at 13:46:38 -0400, Yuxin Ren wrote:
> > I have some further understanding about the code.
> > If thread A can go back to its home cpu(core 1), this means it is not
> > running on the core 2.
> > And when A release its lock, it will switch to its helper.
> > During the context switch from thread A to its helper on core 2, the "
> > _running_under_lock"
> > of thread A should be set to false. Thus thread A is able to continue to
> > run on its home cpu.
> >
> > I think this logic has no problem. But I observed a thread going into
> > the infinite loop in Switch_lock::set_lock_owner method.
> > in my test program.
> > Because of inappropriate memory barrier, or anything else?
> >
> > On Wed, Aug 27, 2014 at 2:28 PM, Yuxin Ren <ryx at gwmail.gwu.edu> wrote:
> > > I have a question about the dec_lock_cnt method in Context class under
> > > multiple processor.
> > > In its implementation, it checks if thread's home cpu is equal to
> current
> > > cpu.
> > > If not, it does not unset "_running_under_lock" variable, even if the
> > > _lock_cnt is 0.
> > > Why does it check if home cpu is equal to current cpu?
>
> This one should work better:
>
> Context::dec_lock_cnt()
> {
>   int n = _lock_cnt - 1;
>   write_now(&_lock_cnt, n);
>   if (EXPECT_TRUE(!n && home_cpu() == current_cpu()))
>     {
>       Mem::mp_wmb();
>       write_now(&_running_under_lock, Mword(false));
>     }
> }
>
>
>
>
>
> Adam
> --
> Adam                 adam at os.inf.tu-dresden.de
>   Lackorzynski         http://os.inf.tu-dresden.de/~adam/
>
> _______________________________________________
> l4-hackers mailing list
> l4-hackers at os.inf.tu-dresden.de
> http://os.inf.tu-dresden.de/mailman/listinfo/l4-hackers
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://os.inf.tu-dresden.de/pipermail/l4-hackers/attachments/20140908/82d2e556/attachment.html>


More information about the l4-hackers mailing list