This removes the last usage of the Big Kernel Lock from the ieee1394 stack, i.e. from raw1394's (unlocked_)ioctl and compat_ioctl. The ioctl()s don't need to take the BKL, but they need to be serialized per struct file *. In particular, accesses to ->iso_state need to be serial. We simply use a blocking mutex for this purpose because libraw1394 does not use O_NONBLOCK. In practice, there is no lock contention anyway because most if not all libraw1394 clients use a libraw1394 handle only in a single thread. mmap() also accesses ->iso_state. Until now this was unprotected against concurrent changes by ioctls. Fix this bug while we are at it. Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#ifndef IEEE1394_RAW1394_PRIVATE_H
 | 
						|
#define IEEE1394_RAW1394_PRIVATE_H
 | 
						|
 | 
						|
/* header for definitions that are private to the raw1394 driver
 | 
						|
   and not visible to user-space */
 | 
						|
 | 
						|
#define RAW1394_DEVICE_MAJOR      171
 | 
						|
#define RAW1394_DEVICE_NAME       "raw1394"
 | 
						|
 | 
						|
#define RAW1394_MAX_USER_CSR_DIRS	16
 | 
						|
 | 
						|
struct iso_block_store {
 | 
						|
        atomic_t refcount;
 | 
						|
        size_t data_size;
 | 
						|
        quadlet_t data[0];
 | 
						|
};
 | 
						|
 | 
						|
enum raw1394_iso_state { RAW1394_ISO_INACTIVE = 0,
 | 
						|
			 RAW1394_ISO_RECV = 1,
 | 
						|
			 RAW1394_ISO_XMIT = 2 };
 | 
						|
 | 
						|
struct file_info {
 | 
						|
        struct list_head list;
 | 
						|
 | 
						|
	struct mutex state_mutex;
 | 
						|
        enum { opened, initialized, connected } state;
 | 
						|
        unsigned int protocol_version;
 | 
						|
 | 
						|
        struct hpsb_host *host;
 | 
						|
 | 
						|
        struct list_head req_pending;	/* protected by reqlists_lock */
 | 
						|
        struct list_head req_complete;	/* protected by reqlists_lock */
 | 
						|
        spinlock_t reqlists_lock;
 | 
						|
        wait_queue_head_t wait_complete;
 | 
						|
 | 
						|
        struct list_head addr_list;	/* protected by host_info_lock */
 | 
						|
 | 
						|
        u8 __user *fcp_buffer;
 | 
						|
 | 
						|
        u8 notification; /* (busreset-notification) RAW1394_NOTIFY_OFF/ON */
 | 
						|
 | 
						|
	/* new rawiso API */
 | 
						|
	enum raw1394_iso_state iso_state;
 | 
						|
	struct hpsb_iso *iso_handle;
 | 
						|
 | 
						|
	/* User space's CSR1212 dynamic ConfigROM directories */
 | 
						|
	struct csr1212_keyval *csr1212_dirs[RAW1394_MAX_USER_CSR_DIRS];
 | 
						|
 | 
						|
	/* Legacy ConfigROM update flag */
 | 
						|
	u8 cfgrom_upd;
 | 
						|
};
 | 
						|
 | 
						|
struct arm_addr {
 | 
						|
        struct list_head addr_list; /* file_info list */
 | 
						|
        u64    start, end;
 | 
						|
        u64    arm_tag;
 | 
						|
        u8     access_rights;
 | 
						|
        u8     notification_options;
 | 
						|
        u8     client_transactions;
 | 
						|
        u64    recvb;
 | 
						|
        u16    rec_length;
 | 
						|
        u8     *addr_space_buffer; /* accessed by read/write/lock requests */
 | 
						|
};
 | 
						|
 | 
						|
struct pending_request {
 | 
						|
        struct list_head list;
 | 
						|
        struct file_info *file_info;
 | 
						|
        struct hpsb_packet *packet;
 | 
						|
        struct iso_block_store *ibs;
 | 
						|
        quadlet_t *data;
 | 
						|
        int free_data;
 | 
						|
        struct raw1394_request req;
 | 
						|
};
 | 
						|
 | 
						|
struct host_info {
 | 
						|
        struct list_head list;
 | 
						|
        struct hpsb_host *host;
 | 
						|
        struct list_head file_info_list;  /* protected by host_info_lock */
 | 
						|
};
 | 
						|
 | 
						|
#endif  /* IEEE1394_RAW1394_PRIVATE_H */
 |