提交 d0a0548a 编写于 作者: A Akihiro Tsukada 提交者: Mauro Carvalho Chehab

media: media/dvb: earth-pt3: fix hang-up in a rare case

When a user starts and stops filtering at a demux device too quickly
in a very short interval, the user process hangs in uninterruptible sleep,
due to an inconsistency of kthread status in the driver.
The kthread can be stopped before it starts running its thread function,
but the invocation status was partly managed in the kthread function,
which resulted in a double kthread_stop() of one kthread.
Signed-off-by: NAkihiro Tsukada <tskd08@gmail.com>
Signed-off-by: NMauro Carvalho Chehab <mchehab@s-opensource.com>
上级 62055056
...@@ -472,7 +472,6 @@ static int pt3_fetch_thread(void *data) ...@@ -472,7 +472,6 @@ static int pt3_fetch_thread(void *data)
} }
dev_dbg(adap->dvb_adap.device, "PT3: [%s] exited\n", dev_dbg(adap->dvb_adap.device, "PT3: [%s] exited\n",
adap->thread->comm); adap->thread->comm);
adap->thread = NULL;
return 0; return 0;
} }
...@@ -486,6 +485,7 @@ static int pt3_start_streaming(struct pt3_adapter *adap) ...@@ -486,6 +485,7 @@ static int pt3_start_streaming(struct pt3_adapter *adap)
if (IS_ERR(thread)) { if (IS_ERR(thread)) {
int ret = PTR_ERR(thread); int ret = PTR_ERR(thread);
adap->thread = NULL;
dev_warn(adap->dvb_adap.device, dev_warn(adap->dvb_adap.device,
"PT3 (adap:%d, dmx:%d): failed to start kthread\n", "PT3 (adap:%d, dmx:%d): failed to start kthread\n",
adap->dvb_adap.num, adap->dmxdev.dvbdev->id); adap->dvb_adap.num, adap->dmxdev.dvbdev->id);
...@@ -508,6 +508,7 @@ static int pt3_stop_streaming(struct pt3_adapter *adap) ...@@ -508,6 +508,7 @@ static int pt3_stop_streaming(struct pt3_adapter *adap)
/* kill the fetching thread */ /* kill the fetching thread */
ret = kthread_stop(adap->thread); ret = kthread_stop(adap->thread);
adap->thread = NULL;
return ret; return ret;
} }
...@@ -520,14 +521,8 @@ static int pt3_start_feed(struct dvb_demux_feed *feed) ...@@ -520,14 +521,8 @@ static int pt3_start_feed(struct dvb_demux_feed *feed)
adap = container_of(feed->demux, struct pt3_adapter, demux); adap = container_of(feed->demux, struct pt3_adapter, demux);
adap->num_feeds++; adap->num_feeds++;
if (adap->thread) if (adap->num_feeds > 1)
return 0; return 0;
if (adap->num_feeds != 1) {
dev_warn(adap->dvb_adap.device,
"%s: unmatched start/stop_feed in adap:%i/dmx:%i\n",
__func__, adap->dvb_adap.num, adap->dmxdev.dvbdev->id);
adap->num_feeds = 1;
}
return pt3_start_streaming(adap); return pt3_start_streaming(adap);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册