Re: Question about dec_lock_cnt method in Context class

Yuxin Ren <[email protected]>
Newsgroups gmane.comp.micro-kernel.l4.devel
Message-ID <CAAKbDrem2YbsZq_rh4fpR+6Eovz=5=TvECWNStnSNPUw07BXVg@mail.gmail.com>
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 <
[email protected]> 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 <[email protected]> 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                 [email protected]
>   Lackorzynski         http://os.inf.tu-dresden.de/~adam/
>
> _______________________________________________
> l4-hackers mailing list
> [email protected]
> http://os.inf.tu-dresden.de/mailman/listinfo/l4-hackers
>

_______________________________________________
l4-hackers mailing list
[email protected]
http://os.inf.tu-dresden.de/mailman/listinfo/l4-hackers
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.