Add comments explaining what hold/unhold do

They act as a simple one-deep semaphore to keep open/close/probe from
running at the same time to avoid races that creates.
This commit is contained in:
Warner Losh 2018-11-01 21:51:41 +00:00
parent 7890b5c14e
commit 9385e92b25
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=340024
2 changed files with 10 additions and 3 deletions

View File

@ -470,6 +470,12 @@ cam_periph_release(struct cam_periph *periph)
mtx_unlock(mtx);
}
/*
* hold/unhold act as mutual exclusion for sections of the code that
* need to sleep and want to make sure that other sections that
* will interfere are held off. This only protects exclusive sections
* from each other.
*/
int
cam_periph_hold(struct cam_periph *periph, int priority)
{

View File

@ -2697,9 +2697,10 @@ daregister(struct cam_periph *periph, void *arg)
TASK_INIT(&softc->sysctl_task, 0, dasysctlinit, periph);
/*
* Take an exclusive refcount on the periph while dastart is called
* to finish the probe. The reference will be dropped in dadone at
* the end of probe.
* Take an exclusive section lock qon the periph while dastart is called
* to finish the probe. The lock will be dropped in dadone at the end
* of probe. This locks out daopen and daclose from racing with the
* probe.
*
* XXX if cam_periph_hold returns an error, we don't hold a refcount.
*/