Module Name: src Committed By: riastradh Date: Thu Mar 3 06:09:33 UTC 2022
Modified Files: src/sys/dev/usb: usbdi.c usbdi.h Log Message: usbdi(9): New usbd_suspend_pipe, usbd_resume_pipe. - New usbd_suspend_pipe to persistently stop transfers on a pipe and cancel pending ones or wait for their callbacks to finish. Idempotent. - New usbd_resume_pipe to allow transfers again. Idempotent, but no new xfers may be submitted before repeating this. This way it is safe to usbd_abort_pipe in two threads concurrently, e.g. if one thread is closing a device while another is revoking it -- but the threads have to agree on when it is done being aborted before starting to use it again. - Existing usbd_abort_pipe now does suspend then resume. No change in semantics so drivers that relied on being able to submit transfers again won't be broken any worse than the already are broken. This allows drivers to avoid races such as: /* read */ if (sc->sc_dying) return ENXIO; /* (*) */ err = usbd_bulk_transfer(...); /* detach or or close */ sc->sc_dying = true; usbd_abort_pipe(...); wait_for_io_to_drain(...); The detach or close logic might happen at the same time as (*), with no way to stop the bulk transfer before it starts, leading to deadlock when detach/close waits for I/O operations like read to drain. Instead, the close routine can use usbd_suspend_pipe, and the usbd_bulk_transfer is guaranteed to fail. But some drivers such as ucom(4) don't close and reopen pipes after aborting them -- they open on attach and close on detach, and just abort when the /dev node is closed, expecting that xfers will continue to work when next opened. These drivers can instead use usbd_suspend_pipe on close and usbd_resume_pipe on open. Perhaps it would be better to make them open pipes on open and close pipes on close, but these functions make for a less intrusive transition. To generate a diff of this commit: cvs rdiff -u -r1.227 -r1.228 src/sys/dev/usb/usbdi.c cvs rdiff -u -r1.106 -r1.107 src/sys/dev/usb/usbdi.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.