Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/kern_rmlock.c
Show First 20 Lines • Show All 542 Lines • ▼ Show 20 Lines | _rm_wlock(struct rmlock *rm) | ||||
if (rm->lock_object.lo_flags & LO_SLEEPABLE) | if (rm->lock_object.lo_flags & LO_SLEEPABLE) | ||||
sx_xlock(&rm->rm_lock_sx); | sx_xlock(&rm->rm_lock_sx); | ||||
else | else | ||||
mtx_lock(&rm->rm_lock_mtx); | mtx_lock(&rm->rm_lock_mtx); | ||||
if (CPU_CMP(&rm->rm_writecpus, &all_cpus)) { | if (CPU_CMP(&rm->rm_writecpus, &all_cpus)) { | ||||
/* Get all read tokens back */ | /* Get all read tokens back */ | ||||
readcpus = all_cpus; | CPU_ANDNOT(&readcpus, &all_cpus, &rm->rm_writecpus); | ||||
CPU_ANDNOT(&readcpus, &rm->rm_writecpus); | |||||
rm->rm_writecpus = all_cpus; | rm->rm_writecpus = all_cpus; | ||||
/* | /* | ||||
* Assumes rm->rm_writecpus update is visible on other CPUs | * Assumes rm->rm_writecpus update is visible on other CPUs | ||||
* before rm_cleanIPI is called. | * before rm_cleanIPI is called. | ||||
*/ | */ | ||||
#ifdef SMP | #ifdef SMP | ||||
smp_rendezvous_cpus(readcpus, | smp_rendezvous_cpus(readcpus, | ||||
▲ Show 20 Lines • Show All 699 Lines • Show Last 20 Lines |