Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bc081cc8 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab
Browse files

V4L/DVB: dvb_demux: Don't use vmalloc at dvb_dmx_swfilter_packet



As dvb_dmx_swfilter_packet() is protected by a spinlock, it shouldn't sleep.
However, vmalloc() may call sleep. So, move the initialization of
dvb_demux::cnt_storage field to a better place.

Reviewed-by: default avatarAndy Walls <awalls@radix.net>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent adefdcee
Loading
Loading
Loading
Loading
+8 −11
Original line number Diff line number Diff line
@@ -426,16 +426,7 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf)
		};
	};

	if (dvb_demux_tscheck) {
		if (!demux->cnt_storage)
			demux->cnt_storage = vmalloc(MAX_PID + 1);

		if (!demux->cnt_storage) {
			printk(KERN_WARNING "Couldn't allocate memory for TS/TEI check. Disabling it\n");
			dvb_demux_tscheck = 0;
			goto no_dvb_demux_tscheck;
		}

	if (demux->cnt_storage) {
		/* check pkt counter */
		if (pid < MAX_PID) {
			if (buf[1] & 0x80)
@@ -454,7 +445,6 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf)
		};
		/* end check */
	};
no_dvb_demux_tscheck:

	list_for_each_entry(feed, &demux->feed_list, list_head) {
		if ((feed->pid != pid) && (feed->pid != 0x2000))
@@ -1258,6 +1248,13 @@ int dvb_dmx_init(struct dvb_demux *dvbdemux)
		dvbdemux->feed[i].index = i;
	}

	if (dvb_demux_tscheck) {
		dvbdemux->cnt_storage = vmalloc(MAX_PID + 1);

		if (!dvbdemux->cnt_storage)
			printk(KERN_WARNING "Couldn't allocate memory for TS/TEI check. Disabling it\n");
	}

	INIT_LIST_HEAD(&dvbdemux->frontend_list);

	for (i = 0; i < DMX_TS_PES_OTHER; i++) {