On Fri, Dec 05, 2014 at 09:42:35AM +0100, Takashi Iwai wrote:
At Thu, 4 Dec 2014 21:03:25 +0000, Chris Wilson wrote:
The current implementation of drm_read() faces a number of issues:
- Upon an error, it consumes the event which may lead to the client
blocking. 2. Upon an error, it forgets about events already copied 3. If it fails to copy a single event with O_NONBLOCK it falls into a infinite loop of reporting EAGAIN. 3. There is a race between multiple waiters and blocking reads of the events list.
Here, we inline drm_dequeue_event() into drm_read() so that we can take the spinlock around the list walking and event copying, and importantly reorder the error handling to avoid the issues above.
Cc: Takashi Iwai tiwai@suse.de
Reviewed-by: Takashi Iwai tiwai@suse.de
Merged to drm-misc with the tag for the drm_read testcase added. Thanks for the patch&reivew. -Daniel