 30ad64b8ac
			
		
	
	
	30ad64b8ac
	
	
	
		
			
			Since most dvb ioctls wrap their real work with dvb_usercopy, the static mutex
used in dvb_usercopy effectively is a global lock for dvb ioctls.
Unfortunately, frontend ioctls can be blocked by the frontend thread for
several seconds; this leads to unacceptable lock contention.  Mitigate that by
pushing the mutex from dvb_usercopy down to the individual, device specific
ioctls.
There are 10 such ioctl functions using dvb_usercopy, either calling it
directly, or via the trivial wrapper dvb_generic_ioctl. The following already
employ their own locking and look safe:
    • dvb_demux_ioctl           (as per dvb_demux_do_ioctl)
    • dvb_dvr_ioctl             (as per dvb_dvr_do_ioctl)
    • dvb_osd_ioctl             (as per single non-trivial callee)
    • fdtv_ca_ioctl             (as per callees)
    • dvb_frontend_ioctl
The following functions do not, and are thus changed to use a device specific
mutex:
    • dvb_net_ioctl             (as per dvb_net_do_ioctl)
    • dvb_ca_en50221_io_ioctl   (as per dvb_ca_en50221_io_do_ioctl)
    • dvb_video_ioctl
    • dvb_audio_ioctl
    • dvb_ca_ioctl
Signed-off-by: Nikolaus Schulz <schulz@macnetix.de>
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
		
	
			
		
			
				
	
	
		
			67 lines
		
	
	
	
		
			1.7 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
	
		
			1.7 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * dvb_net.h
 | |
|  *
 | |
|  * Copyright (C) 2001 Ralph Metzler for convergence integrated media GmbH
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU Lesser General Public License
 | |
|  * as published by the Free Software Foundation; either version 2.1
 | |
|  * of the License, or (at your option) any later version.
 | |
|  *
 | |
|  * This program is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU Lesser General Public License
 | |
|  * along with this program; if not, write to the Free Software
 | |
|  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #ifndef _DVB_NET_H_
 | |
| #define _DVB_NET_H_
 | |
| 
 | |
| #include <linux/module.h>
 | |
| #include <linux/netdevice.h>
 | |
| #include <linux/inetdevice.h>
 | |
| #include <linux/etherdevice.h>
 | |
| #include <linux/skbuff.h>
 | |
| 
 | |
| #include "dvbdev.h"
 | |
| 
 | |
| #define DVB_NET_DEVICES_MAX 10
 | |
| 
 | |
| #ifdef CONFIG_DVB_NET
 | |
| 
 | |
| struct dvb_net {
 | |
| 	struct dvb_device *dvbdev;
 | |
| 	struct net_device *device[DVB_NET_DEVICES_MAX];
 | |
| 	int state[DVB_NET_DEVICES_MAX];
 | |
| 	unsigned int exit:1;
 | |
| 	struct dmx_demux *demux;
 | |
| 	struct mutex ioctl_mutex;
 | |
| };
 | |
| 
 | |
| void dvb_net_release(struct dvb_net *);
 | |
| int  dvb_net_init(struct dvb_adapter *, struct dvb_net *, struct dmx_demux *);
 | |
| 
 | |
| #else
 | |
| 
 | |
| struct dvb_net {
 | |
| 	struct dvb_device *dvbdev;
 | |
| };
 | |
| 
 | |
| static inline void dvb_net_release(struct dvb_net *dvbnet)
 | |
| {
 | |
| }
 | |
| 
 | |
| static inline int dvb_net_init(struct dvb_adapter *adap,
 | |
| 			       struct dvb_net *dvbnet, struct dmx_demux *dmx)
 | |
| {
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| #endif /* ifdef CONFIG_DVB_NET */
 | |
| 
 | |
| #endif
 |