diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_cs.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_cs.c | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index 5ab2cf96a264..f9b0fe002c0a 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
@@ -76,17 +76,17 @@ int radeon_cs_parser_relocs(struct radeon_cs_parser *p) | |||
76 | } | 76 | } |
77 | p->relocs_ptr[i] = &p->relocs[i]; | 77 | p->relocs_ptr[i] = &p->relocs[i]; |
78 | p->relocs[i].robj = p->relocs[i].gobj->driver_private; | 78 | p->relocs[i].robj = p->relocs[i].gobj->driver_private; |
79 | p->relocs[i].lobj.robj = p->relocs[i].robj; | 79 | p->relocs[i].lobj.bo = p->relocs[i].robj; |
80 | p->relocs[i].lobj.rdomain = r->read_domains; | 80 | p->relocs[i].lobj.rdomain = r->read_domains; |
81 | p->relocs[i].lobj.wdomain = r->write_domain; | 81 | p->relocs[i].lobj.wdomain = r->write_domain; |
82 | p->relocs[i].handle = r->handle; | 82 | p->relocs[i].handle = r->handle; |
83 | p->relocs[i].flags = r->flags; | 83 | p->relocs[i].flags = r->flags; |
84 | INIT_LIST_HEAD(&p->relocs[i].lobj.list); | 84 | INIT_LIST_HEAD(&p->relocs[i].lobj.list); |
85 | radeon_object_list_add_object(&p->relocs[i].lobj, | 85 | radeon_bo_list_add_object(&p->relocs[i].lobj, |
86 | &p->validated); | 86 | &p->validated); |
87 | } | 87 | } |
88 | } | 88 | } |
89 | return radeon_object_list_validate(&p->validated, p->ib->fence); | 89 | return radeon_bo_list_validate(&p->validated); |
90 | } | 90 | } |
91 | 91 | ||
92 | int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) | 92 | int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) |
@@ -189,16 +189,14 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error) | |||
189 | { | 189 | { |
190 | unsigned i; | 190 | unsigned i; |
191 | 191 | ||
192 | if (error) { | 192 | if (!error && parser->ib) { |
193 | radeon_object_list_unvalidate(&parser->validated); | 193 | radeon_bo_list_fence(&parser->validated, parser->ib->fence); |
194 | } else { | ||
195 | radeon_object_list_clean(&parser->validated); | ||
196 | } | 194 | } |
197 | for (i = 0; i < parser->nrelocs; i++) { | 195 | radeon_bo_list_unreserve(&parser->validated); |
198 | if (parser->relocs[i].gobj) { | 196 | if (parser->relocs != NULL) { |
199 | mutex_lock(&parser->rdev->ddev->struct_mutex); | 197 | for (i = 0; i < parser->nrelocs; i++) { |
200 | drm_gem_object_unreference(parser->relocs[i].gobj); | 198 | if (parser->relocs[i].gobj) |
201 | mutex_unlock(&parser->rdev->ddev->struct_mutex); | 199 | drm_gem_object_unreference_unlocked(parser->relocs[i].gobj); |
202 | } | 200 | } |
203 | } | 201 | } |
204 | kfree(parser->track); | 202 | kfree(parser->track); |
@@ -230,6 +228,7 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
230 | memset(&parser, 0, sizeof(struct radeon_cs_parser)); | 228 | memset(&parser, 0, sizeof(struct radeon_cs_parser)); |
231 | parser.filp = filp; | 229 | parser.filp = filp; |
232 | parser.rdev = rdev; | 230 | parser.rdev = rdev; |
231 | parser.dev = rdev->dev; | ||
233 | r = radeon_cs_parser_init(&parser, data); | 232 | r = radeon_cs_parser_init(&parser, data); |
234 | if (r) { | 233 | if (r) { |
235 | DRM_ERROR("Failed to initialize parser !\n"); | 234 | DRM_ERROR("Failed to initialize parser !\n"); |
@@ -246,7 +245,8 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
246 | } | 245 | } |
247 | r = radeon_cs_parser_relocs(&parser); | 246 | r = radeon_cs_parser_relocs(&parser); |
248 | if (r) { | 247 | if (r) { |
249 | DRM_ERROR("Failed to parse relocation !\n"); | 248 | if (r != -ERESTARTSYS) |
249 | DRM_ERROR("Failed to parse relocation %d!\n", r); | ||
250 | radeon_cs_parser_fini(&parser, r); | 250 | radeon_cs_parser_fini(&parser, r); |
251 | mutex_unlock(&rdev->cs_mutex); | 251 | mutex_unlock(&rdev->cs_mutex); |
252 | return r; | 252 | return r; |