drm/ttm: Fix race condition in ttm_bo_delayed_delete (v3, final)
authorLuca Barbieri <luca@luca-barbieri.com>
Wed, 20 Jan 2010 19:01:30 +0000 (20:01 +0100)
committerDave Airlie <airlied@redhat.com>
Mon, 25 Jan 2010 01:43:54 +0000 (11:43 +1000)
commit1a961ce09fe39df9a1b796df98794fd32c76c413
tree06ab04dd5f4fb780f23a8468cf2b65d152c3db1f
parent8471a26b9c36c965d278020cc0699e2e95d120e5
drm/ttm: Fix race condition in ttm_bo_delayed_delete (v3, final)

Resending this with Thomas Hellstrom's signoff for merging into 2.6.33

ttm_bo_delayed_delete has a race condition, because after we do:
kref_put(&nentry->list_kref, ttm_bo_release_list);

we are not holding the list lock and not holding any reference to
objects, and thus every bo in the list can be removed and freed at
this point.

However, we then use the next pointer we stored, which is not guaranteed
to be valid.

This was apparently the cause of some Nouveau oopses I experienced.

This patch rewrites the function so that it keeps the reference to nentry
until nentry itself is freed and we already got a reference to nentry->next.

v2 updated by me according to Thomas Hellstrom's feedback.
v3 proposed by Thomas Hellstrom. Commit comment updated by me.

Both updates fixed minor efficiency/style issues only and all three versions
should be correct.

Signed-off-by: Luca Barbieri <luca@luca-barbieri.com>
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/ttm/ttm_bo.c