Commit b9d5efcc authored by Andreas Oberritter's avatar Andreas Oberritter Committed by Mauro Carvalho Chehab

[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: default avatarAndreas Oberritter <obi@linuxtv.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent a1dca1e3
...@@ -507,7 +507,7 @@ static int dvb_frontend_is_exiting(struct dvb_frontend *fe) ...@@ -507,7 +507,7 @@ static int dvb_frontend_is_exiting(struct dvb_frontend *fe)
return 1; return 1;
if (fepriv->dvbdev->writers == 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)) dvb_shutdown_timeout * HZ))
return 1; return 1;
...@@ -2116,12 +2116,15 @@ static int dvb_frontend_release(struct inode *inode, struct file *file) ...@@ -2116,12 +2116,15 @@ static int dvb_frontend_release(struct inode *inode, struct file *file)
dprintk ("%s\n", __func__); dprintk ("%s\n", __func__);
if ((file->f_flags & O_ACCMODE) != O_RDONLY) if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
fepriv->release_jiffies = jiffies; fepriv->release_jiffies = jiffies;
mb();
}
ret = dvb_generic_release (inode, file); ret = dvb_generic_release (inode, file);
if (dvbdev->users == -1) { if (dvbdev->users == -1) {
wake_up(&fepriv->wait_queue);
if (fepriv->exit != DVB_FE_NO_EXIT) { if (fepriv->exit != DVB_FE_NO_EXIT) {
fops_put(file->f_op); fops_put(file->f_op);
file->f_op = NULL; file->f_op = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment