Re: Question about dec_lock_cnt method in Context class
Yuxin Ren <[email protected]>
| Newsgroups | gmane.comp.micro-kernel.l4.devel |
|---|---|
| Message-ID | <CAAKbDrfNhX7HfqHw=82rvaY8U=tE5v3_tCqdp5wUsjcR+-RY1w@mail.gmail.com> |
Hi All, 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? Thank you very much. Best, Yuxin On Wed, Aug 27, 2014 at 2:28 PM, Yuxin Ren <[email protected]> wrote: > Hi All, > > 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? > > Consider the following case: > Thread A is running on core 1 holding a helping lock, but is preempted by > another high priority thread. > Thread B is running on core 2, and tries to take the same helping lock. It > finds the lock is held by A, so > it helps A to run by migrating A to core 2. > When A releases its lock, finding the current cpu is not its home cpu, so > it does not set "_running_under_lock" to false. > Then A continues to run on core 1 and tries to take that lock again. But > now it can never take the lock, as the implementation > of helping lock. > > 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; > } > } > ... > } > > Do I misunderstand anything here? > > Thank you very much. > Best, > Yuxin > _______________________________________________ l4-hackers mailing list [email protected] http://os.inf.tu-dresden.de/mailman/listinfo/l4-hackers