[Click] SpinlockInfo Help
Eddie Kohler
kohler at cs.ucla.edu
Tue Aug 5 11:26:41 EDT 2008
Hi Kevin,
Thanks for this bug report -- the fix is in. Sorry!
Eddie
springbo at cs.wisc.edu wrote:
> Hi,
>
> When trying to track down a x86_64 concurrency bug, I came across problems
> using SpinlockInfo, SpinlockAcquire, and SpinlockRelease. My test script
> is attached. The resulting segfault backtrace is:
>
> 0x00000000004c5353 in Spinlock::acquire (this=0x0)
> at ../include/click/sync.hh:108
> 108 if (_owner != click_current_processor()) {
> (gdb) where
> #0 0x00000000004c5353 in Spinlock::acquire (this=0x0)
> at ../include/click/sync.hh:108
> #1 0x000000000057af0b in SpinlockAcquire::simple_action (this=0x8d53e0,
> p=0x8dac00) at ../elements/threads/spinlockacquire.hh:30
> #2 0x00000000005b8a5f in Element::push (this=0x8d53e0, port=0, p=0x8dac00)
> at ../lib/element.cc:2585
> #3 0x000000000049a900 in Element::Port::push (this=0x8d4ec8, p=0x8dac00)
> at ../include/click/element.hh:545
> #4 0x00000000005728cb in Unqueue::run_task (this=0x8d4ea0)
> at ../elements/standard/unqueue.cc:71
> #5 0x00000000005ca57f in Task::fire (this=0x8d4f18)
> at ../include/click/task.hh:542
> #6 0x00000000005ca795 in RouterThread::run_tasks (this=0x8d0380, ntasks=122)
> at ../lib/routerthread.cc:386
> #7 0x00000000005ca35c in RouterThread::driver (this=0x8d0380)
> at ../lib/routerthread.cc:540
> #8 0x00000000005a715d in main (argc=2, argv=0x7fffe0d3d758) at click.cc:546
>
> I am running a multithreaded x86_64 installation built on the master cvs
> sources from about three weeks ago. From the backtrace you'll notice
> SpinlockAcquire::_lock = 0.
>
> My understanding of what is going on:
>
> Line 41 of spinlockinfo.cc:
>>>>>>> ndb->define(name, &_spinlocks.back(), sizeof(Spinlock *));
> calls DynamicNameDB::define with the name, a pointer to the Spinlock, and
> the size of the Spinlock pointer
>
> Line 268 of nameinfo.cc:
>>>>>>> memcpy(x, value, vsize);
> copies the first 8 bytes of the Spinlock into the value of x (The first 8
> bytes of Spinlock should be _lock(0) and _depth(0) or NULL if viewed as a
> pointer)
>
> Line 28 of spinlockacquire.cc:
>>>>>>> if (!NameInfo::query(NameInfo::T_SPINLOCK, this, name, &_lock,
> sizeof(Spinlock *)))
> Line 226 of nameinfo.cc (in the query function):
>>>>>>> memcpy(value, x, vsize);
> the argument _lock is set to the first 8 bytes of the spinlock (which have
> a value of 0).
>
> Finally when the _lock is used the pointer with a value of NULL is
> dereferenced. Resulting in a seg fault (or worse if running as a module).
>
>
> Sorry I didn't come up with a patch, but I couldn't come up with an easy
> fix without changing the way the elements work.
>
> Could anyone verify they can use the Spinlock elements? Or possibly point
> out the flaw in my logic above?
>
> Thanks,
> Kevin Springborn
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> click mailing list
> click at amsterdam.lcs.mit.edu
> https://amsterdam.lcs.mit.edu/mailman/listinfo/click
More information about the click
mailing list