Hi all,
I have some questions when reading source code of callb and scheduler
subsystems, which seem to me like possble race conditions.
The first case is race between callb_execute_class() and
callb_delete().
Relative code from uts/common/os/callb.c as below:
void *
callb_execute_class(int class, int code)
{
mutex_enter(&ct->ct_lock);
for (cp = ct->ct_first_cb[class];
cp != NULL && ret == 0; cp = cp->c_next) {
while (cp->c_flag & CALLB_EXECUTING)
cv_wait(&cp->c_done_cv, &ct->ct_lock);
/*
* cont if the callb is deleted while we're sleeping
*/
if (cp->c_flag == CALLB_FREE)
continue;
cp->c_flag |= CALLB_EXECUTING;
mutex_exit(&ct->ct_lock);
if (!(*cp->c_func)(cp->c_arg, code))
ret = cp->c_name;
mutex_enter(&ct->ct_lock);
cp->c_flag &= ~CALLB_EXECUTING;
cv_broadcast(&cp->c_done_cv);
}
mutex_exit(&ct->ct_lock);
return (ret);
}
Suspicious code is
/*
* cont if the callb is deleted while we're sleeping
*/
if (cp->c_flag == CALLB_FREE)
continue;
Actually, when (cp->c_flag == CALLB_FREE) is true, cp->c_next should
already point to next node on freelist instead of on class list.
The second case is relative to function disp_setup() in
uts/common/disp/disp.c.
dsip_setup() tries to grow dispatch queue entries in dispatch table when
increasing max
global priority. In current implementation, all other CPUs will be paused when
replacing
per-CPU dispatch table to protect it, but there's no such protection when
replacing
CPU partition level preempt dispatch table.
The above possible race condition could be triggered by configure
"kpqpri" to
a value less than 100 in /etc/system.
BTW, following code in function disp_setup() may be isn not what we
want because
kpqpri has been already set to kpreemptpri in disp_init(), so test "(kpqpri ==
KPQPRI)" will
always be false.
if (kpqpri == KPQPRI)
kpqpri = kpreemptpri;
Thanks!
Liu Jiang (Gerry)
Senior Software Engineer
OpenSolaris, OTC, SSG, Intel
Tel: (8610)82171643
iNet: 8-758-1643
Location: Raycom 9W013
_______________________________________________
opensolaris-code mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/opensolaris-code