kernel_optimize_test/drivers/usb/usbip
Nobuo Iwata 6dc38da4a5 usbip: safe completion against unbind operation
This patch adds a code fragment to ignore completing URBs in closing
connection.

Regarding this patch, 2 execution contexts are related.

1) stub_tx.c: stub_complete() which is called from USB core
1-1) add to unlink list and free URB or
1-2) move to tx list

2) stub_dev.c: stub_shutdown_connection() which is invoked by unbind
operation through sysfs.
2-1) stop TX/RX threads
2-2) close TCP connection and set ud.tcp_socket to NULL
2-3) cleanup pending URBs by stub_device_cleanup_urbs(sdev)
2-4) free unlink list (no lock)

In the race condition, URBs which will be cleared in 2-3) may be
handled in 1).
In case 1-1), it will not be transferred bcause tx threads are stooped
in 2-1).
In case 1-2), may be freed in 2-4).

With this patch, after 2-2), completing URBs in 1) will not be handled
and cleared in 2-3).

The kernel log with this patch is as below.

kernel: usbip_core: usbip_kernel_unlink:792: shutting down tcp_socket
ef61d980
kernel: usbip-host 1-3: free sdev f5df6180
kernel: usbip-host 1-3: free urb f5df6700
kernel: usbip-host 1-3: Enter
kernel: usbip_core: usbip_stop_eh:132: usbip_eh waiting completion 5
kernel: usbip_host: stub_complete:71: complete! status 0
kernel: usbip_host: stub_complete:102: ignore urb for closed connection
e725fc00 (*)
kernel: usbip_host: stub_complete:71: complete! status -2
kernel: usbip-host 1-3: stopped by a call to usb_kill_urb() because of
cleaning up a virtual connection
kernel: usbip-host 1-3: free urb e725fc00 (**)
kernel: usbip-host 1-3: free urb e725e000
kernel: usbip_host: stub_complete:71: complete! status -2
kernel: usbip-host 1-3: stopped by a call to usb_kill_urb() because of
cleaning up a virtual connection
kernel: usbip-host 1-3: free urb e725f800
kernel: usbip_host: stub_complete:71: complete! status -2
kernel: usbip-host 1-3: stopped by a call to usb_kill_urb() because of
cleaning up a virtual connection
kernel: usbip-host 1-3: free urb e725e800
kernel: usbip_host: stub_complete:71: complete! status -2
kernel: usbip-host 1-3: stopped by a call to usb_kill_urb() because of
cleaning up a virtual connection
kernel: usbip-host 1-3: device reset
kernel: usbip-host 1-3: lock for reset
kernel: usbip_host: store_match_busid:178: del busid 1-3
kernel: uvcvideo: Found UVC 1.00 device Venus USB2.0 Camera (056e:700a)
kernel: input: Venus USB2.0 Camera as
/devices/pci0000:00/0000:00:1a.7/usb1/1-3/1-3:1.0/input/input22

(*) skipped with this patch in completion
(**) released in 2-3

Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2016-04-28 12:28:08 -07:00
..
Kconfig usbip: vudc: Add vudc to Kconfig 2016-04-26 15:19:50 -07:00
Makefile usbip: vudc: Add vudc to Kconfig 2016-04-26 15:19:50 -07:00
README
stub_dev.c usbip: fix NULL pointer dereference on errors 2016-04-28 12:28:08 -07:00
stub_main.c
stub_rx.c usbip: fix NULL pointer dereference on errors 2016-04-28 12:28:08 -07:00
stub_tx.c usbip: safe completion against unbind operation 2016-04-28 12:28:08 -07:00
stub.h usbip: fix NULL pointer dereference on errors 2016-04-28 12:28:08 -07:00
usbip_common.c usbip: vudc: Make usbip_common vudc-aware 2016-04-26 15:19:50 -07:00
usbip_common.h usbip: vudc: Make usbip_common vudc-aware 2016-04-26 15:19:50 -07:00
usbip_event.c usbip: event handler as one thread 2016-04-19 04:33:15 +09:00
vhci_hcd.c usb: usbip: Fix possible deadlocks reported by lockdep 2016-02-03 13:52:10 -08:00
vhci_rx.c usb: usbip: Fix possible deadlocks reported by lockdep 2016-02-03 13:52:10 -08:00
vhci_sysfs.c usb: usbip: Fix possible deadlocks reported by lockdep 2016-02-03 13:52:10 -08:00
vhci_tx.c usb: usbip: Fix possible deadlocks reported by lockdep 2016-02-03 13:52:10 -08:00
vhci.h
vudc_dev.c usb: usbip: vudc: Rename find_endpoint() to vudc_find_endpoint() 2016-04-28 12:28:08 -07:00
vudc_main.c usbip: vudc: Add VUDC main file 2016-04-26 15:19:50 -07:00
vudc_rx.c usb: usbip: vudc: Rename find_endpoint() to vudc_find_endpoint() 2016-04-28 12:28:08 -07:00
vudc_sysfs.c usbip: vudc: Add SysFS infrastructure for VUDC 2016-04-26 15:19:50 -07:00
vudc_transfer.c usb: usbip: vudc: Rename find_endpoint() to vudc_find_endpoint() 2016-04-28 12:28:08 -07:00
vudc_tx.c usbip: vudc: Add vudc_tx 2016-04-26 15:19:50 -07:00
vudc.h usb: usbip: vudc: Rename find_endpoint() to vudc_find_endpoint() 2016-04-28 12:28:08 -07:00

TODO:
	- more discussion about the protocol
	- testing
	- review of the userspace interface
	- document the protocol

Please send patches for this code to Greg Kroah-Hartman <greg@kroah.com>