--- /dev/null
+diff --git a/drivers/media/dvb/dvb-core/dmxdev.c b/drivers/media/dvb/dvb-core/dmxdev.c
+index e4b5c03..caca6e5 100644
+--- a/drivers/media/dvb/dvb-core/dmxdev.c
++++ b/drivers/media/dvb/dvb-core/dmxdev.c
+@@ -81,9 +81,14 @@ static ssize_t dvb_dmxdev_buffer_read(struct dvb_ringbuffer *src,
+ break;
+ }
+
++
+ ret = wait_event_interruptible(src->queue,
+ !dvb_ringbuffer_empty(src) ||
+- (src->error != 0));
++ (src->error != 0) ||
++ (src->do_wait != 1));
++ if (src->do_wait != 1)
++ ret = -EINTR;
++
+ if (ret < 0)
+ break;
+
+@@ -963,6 +968,22 @@ dvb_demux_read(struct file *file, char __user *buf, size_t count,
+ return ret;
+ }
+
++static int dvb_demux_lock_filter(struct dmxdev_filter *dmxdevfilter)
++{
++ int ret;
++
++ dmxdevfilter->buffer.do_wait = 0;
++
++ if (waitqueue_active(&dmxdevfilter->buffer.queue))
++ wake_up(&dmxdevfilter->buffer.queue);
++
++ ret = mutex_lock_interruptible(&dmxdevfilter->mutex);
++
++ dmxdevfilter->buffer.do_wait = 1;
++
++ return ret;
++}
++
+ static int dvb_demux_do_ioctl(struct file *file,
+ unsigned int cmd, void *parg)
+ {
+@@ -976,7 +997,7 @@ static int dvb_demux_do_ioctl(struct file *file,
+
+ switch (cmd) {
+ case DMX_START:
+- if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
++ if (dvb_demux_lock_filter(dmxdevfilter)) {
+ mutex_unlock(&dmxdev->mutex);
+ return -ERESTARTSYS;
+ }
+@@ -988,7 +1009,7 @@ static int dvb_demux_do_ioctl(struct file *file,
+ break;
+
+ case DMX_STOP:
+- if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
++ if (dvb_demux_lock_filter(dmxdevfilter)) {
+ mutex_unlock(&dmxdev->mutex);
+ return -ERESTARTSYS;
+ }
+@@ -997,7 +1018,7 @@ static int dvb_demux_do_ioctl(struct file *file,
+ break;
+
+ case DMX_SET_FILTER:
+- if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
++ if (dvb_demux_lock_filter(dmxdevfilter)) {
+ mutex_unlock(&dmxdev->mutex);
+ return -ERESTARTSYS;
+ }
+@@ -1006,7 +1027,7 @@ static int dvb_demux_do_ioctl(struct file *file,
+ break;
+
+ case DMX_SET_PES_FILTER:
+- if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
++ if (dvb_demux_lock_filter(dmxdevfilter)) {
+ mutex_unlock(&dmxdev->mutex);
+ return -ERESTARTSYS;
+ }
+@@ -1015,7 +1036,7 @@ static int dvb_demux_do_ioctl(struct file *file,
+ break;
+
+ case DMX_SET_BUFFER_SIZE:
+- if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
++ if (dvb_demux_lock_filter(dmxdevfilter)) {
+ mutex_unlock(&dmxdev->mutex);
+ return -ERESTARTSYS;
+ }
+@@ -1059,7 +1080,7 @@ static int dvb_demux_do_ioctl(struct file *file,
+ break;
+
+ case DMX_ADD_PID:
+- if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
++ if (dvb_demux_lock_filter(dmxdevfilter)) {
+ ret = -ERESTARTSYS;
+ break;
+ }
+@@ -1068,7 +1089,7 @@ static int dvb_demux_do_ioctl(struct file *file,
+ break;
+
+ case DMX_REMOVE_PID:
+- if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
++ if (dvb_demux_lock_filter(dmxdevfilter)) {
+ ret = -ERESTARTSYS;
+ break;
+ }
+diff --git a/drivers/media/dvb/dvb-core/dvb_ringbuffer.c b/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
+index a5712cd..9f744c2 100644
+--- a/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
++++ b/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
+@@ -45,7 +45,8 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len)
+ rbuf->data=data;
+ rbuf->size=len;
+ rbuf->error=0;
+-
++ rbuf->do_wait=1;
++
+ init_waitqueue_head(&rbuf->queue);
+
+ spin_lock_init(&(rbuf->lock));
+diff --git a/drivers/media/dvb/dvb-core/dvb_ringbuffer.h b/drivers/media/dvb/dvb-core/dvb_ringbuffer.h
+index 41f04da..6951dd3 100644
+--- a/drivers/media/dvb/dvb-core/dvb_ringbuffer.h
++++ b/drivers/media/dvb/dvb-core/dvb_ringbuffer.h
+@@ -39,6 +39,7 @@ struct dvb_ringbuffer {
+
+ wait_queue_head_t queue;
+ spinlock_t lock;
++ int do_wait;
+ };
+
+ #define DVB_RINGBUFFER_PKTHDRSIZE 3