mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-15 10:17:20 +00:00
- Use callout_init_mtx() to initialize toffhandle callout using the fdc's
mutex. - Don't use callout_drain() to stop the toffhandle callout while holding the fdc mutex (this could deadlock) in functions called from softclock (callouts aren't allowed to do voluntary sleeps). Instead, use callout_stop(). Note that since we hold the associated mutex and are now using callout_init_mtx(), callout_stop() is just as effective as callout_drain(). (Though callout_drain() is still needed in detach to make sure softclock isn't contesting on our mutex before we destroy the mutex.) - Remove unused callout 'tohandle' from softc. MFC after: 1 week
This commit is contained in:
parent
c94b3e542e
commit
9fc9d84b9b
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=155956
@ -250,7 +250,6 @@ struct fd_data {
|
|||||||
#define FD_NO_TRACK -2
|
#define FD_NO_TRACK -2
|
||||||
int options; /* FDOPT_* */
|
int options; /* FDOPT_* */
|
||||||
struct callout toffhandle;
|
struct callout toffhandle;
|
||||||
struct callout tohandle;
|
|
||||||
struct g_geom *fd_geom;
|
struct g_geom *fd_geom;
|
||||||
struct g_provider *fd_provider;
|
struct g_provider *fd_provider;
|
||||||
device_t dev;
|
device_t dev;
|
||||||
@ -617,7 +616,7 @@ fd_turnon(void *arg)
|
|||||||
int once;
|
int once;
|
||||||
|
|
||||||
fd = arg;
|
fd = arg;
|
||||||
mtx_lock(&fd->fdc->fdc_mtx);
|
mtx_assert(&fd->fdc->fdc_mtx, MA_OWNED);
|
||||||
fd->flags &= ~FD_MOTORWAIT;
|
fd->flags &= ~FD_MOTORWAIT;
|
||||||
fd->flags |= FD_MOTOR;
|
fd->flags |= FD_MOTOR;
|
||||||
once = 0;
|
once = 0;
|
||||||
@ -628,7 +627,6 @@ fd_turnon(void *arg)
|
|||||||
bioq_disksort(&fd->fdc->head, bp);
|
bioq_disksort(&fd->fdc->head, bp);
|
||||||
once = 1;
|
once = 1;
|
||||||
}
|
}
|
||||||
mtx_unlock(&fd->fdc->fdc_mtx);
|
|
||||||
if (once)
|
if (once)
|
||||||
wakeup(&fd->fdc->head);
|
wakeup(&fd->fdc->head);
|
||||||
}
|
}
|
||||||
@ -647,7 +645,7 @@ fd_motor(struct fd_data *fd, int turnon)
|
|||||||
fdc->fdout |= (FDO_MOEN0 << fd->fdsu);
|
fdc->fdout |= (FDO_MOEN0 << fd->fdsu);
|
||||||
callout_reset(&fd->toffhandle, hz, fd_turnon, fd);
|
callout_reset(&fd->toffhandle, hz, fd_turnon, fd);
|
||||||
} else {
|
} else {
|
||||||
callout_drain(&fd->toffhandle);
|
callout_stop(&fd->toffhandle);
|
||||||
fd->flags &= ~(FD_MOTOR|FD_MOTORWAIT);
|
fd->flags &= ~(FD_MOTOR|FD_MOTORWAIT);
|
||||||
fdc->fdout &= ~(FDO_MOEN0 << fd->fdsu);
|
fdc->fdout &= ~(FDO_MOEN0 << fd->fdsu);
|
||||||
}
|
}
|
||||||
@ -659,9 +657,8 @@ fd_turnoff(void *xfd)
|
|||||||
{
|
{
|
||||||
struct fd_data *fd = xfd;
|
struct fd_data *fd = xfd;
|
||||||
|
|
||||||
mtx_lock(&fd->fdc->fdc_mtx);
|
mtx_assert(&fd->fdc->fdc_mtx, MA_OWNED);
|
||||||
fd_motor(fd, 0);
|
fd_motor(fd, 0);
|
||||||
mtx_unlock(&fd->fdc->fdc_mtx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1199,7 +1196,7 @@ fd_enqueue(struct fd_data *fd, struct bio *bp)
|
|||||||
mtx_lock(&fdc->fdc_mtx);
|
mtx_lock(&fdc->fdc_mtx);
|
||||||
/* If we go from idle, cancel motor turnoff */
|
/* If we go from idle, cancel motor turnoff */
|
||||||
if (fd->fd_iocount++ == 0)
|
if (fd->fd_iocount++ == 0)
|
||||||
callout_drain(&fd->toffhandle);
|
callout_stop(&fd->toffhandle);
|
||||||
if (fd->flags & FD_MOTOR) {
|
if (fd->flags & FD_MOTOR) {
|
||||||
/* The motor is on, send it directly to the controller */
|
/* The motor is on, send it directly to the controller */
|
||||||
bioq_disksort(&fdc->head, bp);
|
bioq_disksort(&fdc->head, bp);
|
||||||
@ -1939,8 +1936,7 @@ fd_probe(device_t dev)
|
|||||||
fd->fdc = fdc;
|
fd->fdc = fdc;
|
||||||
fd->fdsu = fdsu;
|
fd->fdsu = fdsu;
|
||||||
fd->options = 0;
|
fd->options = 0;
|
||||||
callout_init(&fd->toffhandle, 1);
|
callout_init_mtx(&fd->toffhandle, &fd->fdc->fdc_mtx, 0);
|
||||||
callout_init(&fd->tohandle, 1);
|
|
||||||
|
|
||||||
/* initialize densities for subdevices */
|
/* initialize densities for subdevices */
|
||||||
fdsettype(fd, fd_native_types[fd->type]);
|
fdsettype(fd, fd_native_types[fd->type]);
|
||||||
|
Loading…
Reference in New Issue
Block a user