OpenCloudOS-Kernel/drivers/usb/gadget/function
Philip Oberstaller 3e9d3d2efc usb: gadget: serial: fix re-ordering of tx data
When a single thread is sending out data over the gadget serial port,
gs_start_tx() will be called both from the sender context and from the
write completion. Since the port lock is released before the packet is
queued, the order in which the URBs are submitted is not guaranteed.
E.g.

  sending thread                      completion (interrupt)

  gs_write()
    LOCK
                                      gs_write_complete()
                                        LOCK (wait)
    gs_start_tx()
      req1 = list_entry(pool->next)
      UNLOCK
                                        LOCK (acquired)
                                        gs_start_tx()
                                          req2 = list_entry(pool->next)
                                          UNLOCK
                                          usb_ep_queue(req2)
      usb_ep_queue(req1)

I.e., req2 is submitted before req1 but it contains the data that
comes after req1.

To reproduce, use SMP with sending thread and completion pinned to
different CPUs, or use PREEMPT_RT, and add the following delay just
before the call to usb_ep_queue():

		if (port->write_started > 0 && !list_empty(pool))
			udelay(1000);

To work around this problem, make sure that only one thread is running
through the gs_start_tx() loop with an extra flag write_busy. Since
gs_start_tx() is always called with the port lock held, no further
synchronisation is needed. The original caller will continue through
the loop when the request was successfully submitted.

Signed-off-by: Philip Oberstaller <Philip.Oberstaller@septentrio.com>
Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
Signed-off-by: Felipe Balbi <balbi@ti.com>
2015-04-27 14:44:29 -05:00
..
Makefile usb: gadget: f_printer: convert to new function interface with backward compatibility 2015-03-10 15:33:40 -05:00
f_acm.c usb: gadget: function: acm: make f_acm pass USB20CV Chapter9 2014-10-20 15:58:48 -05:00
f_ecm.c
f_eem.c usb: gadget: function: Remove redundant usb_free_all_descriptors 2014-10-23 13:57:24 -05:00
f_fs.c make new_sync_{read,write}() static 2015-04-11 22:29:40 -04:00
f_hid.c usb: gadget: hid: Fix static variable usage 2015-04-27 14:44:23 -05:00
f_loopback.c Revert "usb: gadget: zero: Add support for interrupt EP" 2015-03-11 10:00:05 -05:00
f_mass_storage.c usb: patches for v4.1 merge window 2015-03-24 22:57:49 +01:00
f_mass_storage.h
f_midi.c usb: gadget: fix misspelling of current function in string 2014-12-22 10:27:34 -06:00
f_ncm.c usb: gadget: function: Added usb_assign_descriptors failure check 2014-11-03 10:01:24 -06:00
f_obex.c usb: gadget: function: Remove redundant usb_free_all_descriptors 2014-10-23 13:57:24 -05:00
f_phonet.c usb: gadget: function: phonet: balance usb_ep_disable calls 2015-02-23 00:18:52 -06:00
f_printer.c usb: gadget: f_printer: use non-zero flag for bitwise and 2015-03-13 10:41:05 -05:00
f_rndis.c usb: gadget: function: delete an unnecessary check before rndis_add_hdr() 2014-11-21 09:08:12 -06:00
f_serial.c usb: gadget: serial: replace {V,}DBG macro with dev_{v,}dbg 2014-08-27 14:13:17 -05:00
f_sourcesink.c Revert "usb: gadget: zero: Add support for interrupt EP" 2015-03-11 10:00:05 -05:00
f_subset.c usb: gadget: function: Remove redundant usb_free_all_descriptors 2014-10-23 13:57:24 -05:00
f_uac1.c Linux 3.19-rc5 2015-01-19 09:57:20 -06:00
f_uac2.c usb: gadget: function: f_uac2: fix sparse warnings 2015-02-23 09:21:28 -06:00
f_uvc.c [media] gadget/uvc: embed video_device 2015-04-02 23:36:20 -03:00
f_uvc.h usb: gadget: f_uvc: remove compatibility layer 2014-09-09 09:49:41 -05:00
g_zero.h Revert "usb: gadget: zero: Add support for interrupt EP" 2015-03-11 10:00:05 -05:00
ndis.h
rndis.c
rndis.h
storage_common.c
storage_common.h
u_ecm.h
u_eem.h
u_ether.c usb: gadget: ethernet: re-use %pM specifier to print MAC 2015-01-19 12:53:32 -06:00
u_ether.h
u_ether_configfs.h
u_fs.h usb: gadget: ffs: add eventfd notification about ffs events 2015-01-27 09:34:59 -06:00
u_gether.h
u_hid.h usb: gadget: hid: add configfs support 2014-11-06 16:18:19 -06:00
u_midi.h usb: gadget: f_midi: add configfs support 2014-11-05 13:37:17 -06:00
u_ncm.h
u_phonet.h
u_printer.h usb: gadget: printer: add configfs support 2015-03-10 15:33:41 -05:00
u_rndis.h
u_serial.c usb: gadget: serial: fix re-ordering of tx data 2015-04-27 14:44:29 -05:00
u_serial.h
u_uac1.c usb: gadget: u_uac1: fix one code style problem 2015-01-15 09:41:48 -06:00
u_uac1.h usb: gadget: uac1: struct gaudio is useless for struct f_uac1_opts 2015-01-15 09:41:48 -06:00
u_uac2.h usb: gadget: f_uac2: add configfs support 2014-08-20 14:04:42 -05:00
u_uvc.h usb: gadget: uvc: configfs support in uvc function 2015-01-12 12:13:26 -06:00
uvc.h [media] gadget/uvc: embed video_device 2015-04-02 23:36:20 -03:00
uvc_configfs.c usb: gadget: uvc: comments for iterating over streaming hierarchy 2015-01-27 10:00:27 -06:00
uvc_configfs.h usb: gadget: uvc: configfs support in uvc function 2015-01-12 12:13:26 -06:00
uvc_queue.c [media] uvc gadget: switch to v4l2 core locking 2015-03-02 17:05:23 -03:00
uvc_queue.h [media] uvc gadget: switch to v4l2 core locking 2015-03-02 17:05:23 -03:00
uvc_v4l2.c Merge branch 'drm-next-merged' of git://people.freedesktop.org/~airlied/linux into v4l_for_linus 2015-04-21 09:44:55 -03:00
uvc_v4l2.h usb: gadget: uvc: separately compile some components of f_uvc 2014-09-09 09:49:12 -05:00
uvc_video.c Merge branch 'drm-next-merged' of git://people.freedesktop.org/~airlied/linux into v4l_for_linus 2015-04-21 09:44:55 -03:00
uvc_video.h usb: gadget: uvc: separately compile some components of f_uvc 2014-09-09 09:49:12 -05:00