Date: Tue, 17 Feb 2015 20:05:35 +0000 From: "hselasky (Hans Petter Selasky)" <phabric-noreply@FreeBSD.org> To: freebsd-net@freebsd.org Subject: [Differential] [Commented On] D1711: Changes to the callout code to restore active semantics and also add a test-framework and test to validate thecallout code (and potentially for use by other tests). Message-ID: <03a0edb3b8bd68541c132c9156c389a6@localhost.localdomain> In-Reply-To: <differential-rev-PHID-DREV-vhk6ww63dvpj6egspuyt-req@FreeBSD.org> References: <differential-rev-PHID-DREV-vhk6ww63dvpj6egspuyt-req@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
hselasky added a comment.
randall: Let me try to explain a bit slower:
Assume that a callout has been cancelled and is now migrating to another CPU. c->c_cpu = CPUBLOCK.
Upon calling _callout_stop_safe() we will enter the callout_lock() function which will wait for the condition "c->c_cpu == CPUBLOCK" to disappear.
Thread 1:
mtx_lock(xxx);
_callout_stop_safe(struct callout *c, int safe)
callout_lock();
while(c->c_cpu == CPUBLOCK)
;
mtx_unlock(xxx);
Thread 2:
softclock_call_cc()
if (c_lock != NULL)
class->lc_lock(xxx); /* stuck forever */
In softclock_call_cc() c->c_cpu is only updated _after_ that class->lc_lock() has been locked / unlocked. Especially this is critical if the callback function locks and unlocks the "xxx" lock multiple times.
Do you get it? Or do you want me to explain more. Sorry I am not so good communicating with you.
--HPS
REVISION DETAIL
https://reviews.freebsd.org/D1711
To: rrs, gnn, rwatson, lstewart, jhb, kostikbel, sbruno, imp, adrian, hselasky
Cc: julian, hiren, jhb, kostikbel, emaste, delphij, neel, erj, freebsd-net
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?03a0edb3b8bd68541c132c9156c389a6>
