From: Chris Wilson Date: Thu, 4 Dec 2014 21:03:25 +0000 (+0000) Subject: drm: Make drm_read() more robust against multithreaded races X-Git-Tag: fixes-v4.0-rc1~91^2~33^2~3 X-Git-Url: http://git.openpandora.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cdd1cf799bd24ac0a4184549601ae302267301c5;p=pandora-kernel.git drm: Make drm_read() more robust against multithreaded races The current implementation of drm_read() faces a number of issues: 1. 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 Signed-off-by: Chris Wilson Reviewed-by: Takashi Iwai Testcase: igt/drm_read Signed-off-by: Daniel Vetter --- Reading git-diff-tree failed