[media] DVB: dvb_frontend: fix delayed thread exit
There are some issues and miss-behaves at the dvb fe thread: 1) dvb_shutdown_timeout should be dvb_shutdown_timeout * HZ instead of (dvb_shutdown_timeout * HZ + 1); 2) add a memory barrier to warrant that all CPU's will consider the new value for release_jiffies; 3) wake up dvb thread also when fepriv->exit == DVB_FE_NO_EXIT. Signed-off-by: Andreas Oberritter <obi@linuxtv.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
a1dca1e30a
commit
b9d5efcceb
@ -507,7 +507,7 @@ static int dvb_frontend_is_exiting(struct dvb_frontend *fe)
|
||||
return 1;
|
||||
|
||||
if (fepriv->dvbdev->writers == 1)
|
||||
if (time_after(jiffies, fepriv->release_jiffies +
|
||||
if (time_after_eq(jiffies, fepriv->release_jiffies +
|
||||
dvb_shutdown_timeout * HZ))
|
||||
return 1;
|
||||
|
||||
@ -2116,12 +2116,15 @@ static int dvb_frontend_release(struct inode *inode, struct file *file)
|
||||
|
||||
dprintk ("%s\n", __func__);
|
||||
|
||||
if ((file->f_flags & O_ACCMODE) != O_RDONLY)
|
||||
if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
|
||||
fepriv->release_jiffies = jiffies;
|
||||
mb();
|
||||
}
|
||||
|
||||
ret = dvb_generic_release (inode, file);
|
||||
|
||||
if (dvbdev->users == -1) {
|
||||
wake_up(&fepriv->wait_queue);
|
||||
if (fepriv->exit != DVB_FE_NO_EXIT) {
|
||||
fops_put(file->f_op);
|
||||
file->f_op = NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user