diff options
author | Jerome Glisse <jglisse@redhat.com> | 2010-02-15 21:36:33 +0100 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-02-18 15:07:04 +1000 |
commit | 94429bb6c8343722544e282d89dc4638672e49b4 (patch) | |
tree | 6c401e2c50724236da26468963fd99eda1cf3917 /drivers/gpu/drm/radeon/radeon_cs.c | |
parent | 91cb91becf372b5308cdd7d2e15b2e3ef66bae7e (diff) | |
download | kernel_samsung_smdk4412-94429bb6c8343722544e282d89dc4638672e49b4.zip kernel_samsung_smdk4412-94429bb6c8343722544e282d89dc4638672e49b4.tar.gz kernel_samsung_smdk4412-94429bb6c8343722544e282d89dc4638672e49b4.tar.bz2 |
drm/radeon/kms: fix bo's fence association
Previous code did associate fence to bo before the fence was emited
and it also didn't lock protected access to ttm sync_obj member.
Both of this flaw leads to possible race between different code
path. This patch fix this by associating fence only once the fence
is emitted and properly lock protect access to sync_obj member of
ttm.
Fix:
https://bugs.freedesktop.org/show_bug.cgi?id=26438
and likely similar others bugs
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_cs.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_cs.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index 1190148..e9d0850 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c @@ -86,7 +86,7 @@ int radeon_cs_parser_relocs(struct radeon_cs_parser *p) &p->validated); } } - return radeon_bo_list_validate(&p->validated, p->ib->fence); + return radeon_bo_list_validate(&p->validated); } int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) @@ -189,12 +189,10 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error) { unsigned i; - if (error && parser->ib) { - radeon_bo_list_unvalidate(&parser->validated, - parser->ib->fence); - } else { - radeon_bo_list_unreserve(&parser->validated); + if (!error && parser->ib) { + radeon_bo_list_fence(&parser->validated, parser->ib->fence); } + radeon_bo_list_unreserve(&parser->validated); for (i = 0; i < parser->nrelocs; i++) { if (parser->relocs[i].gobj) { mutex_lock(&parser->rdev->ddev->struct_mutex); |