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>