Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/client: Inline drm_client_buffer_addfb() and _rmfb()

Creating and deleting a client buffer always creates and deletes
the underlying DRM framebuffer. Inline the helper functions into
their callers.

With the _addfb code being inlined into drm_client_buffer_create(),
clean up the function's error rollback to release the framebuffer's
handle and GEM buffer object as needed.

Move the _rmfb code into drm_client_buffer_delete() rather than its
current location in drm_client_framebuffer_delete(). The former is
now the inverse of drm_client_buffer_create(). Makes no difference
for cleaning up. Also prepares for the removal of
drm_client_framebuffer_delete().

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
Tested-by: Francesco Valla <francesco@valla.it>
Link: https://patch.msgid.link/20251027121042.143588-4-tzimmermann@suse.de

+40 -53
+40 -53
drivers/gpu/drm/drm_client.c
··· 178 178 179 179 static void drm_client_buffer_delete(struct drm_client_buffer *buffer) 180 180 { 181 + int ret; 182 + 183 + ret = drm_mode_rmfb(buffer->client->dev, buffer->fb->base.id, buffer->client->file); 184 + if (ret) 185 + drm_err(buffer->client->dev, 186 + "Error removing FB:%u (%d)\n", buffer->fb->base.id, ret); 187 + 181 188 if (buffer->gem) { 182 189 drm_gem_vunmap(buffer->gem, &buffer->map); 183 190 drm_gem_object_put(buffer->gem); ··· 197 190 drm_client_buffer_create(struct drm_client_dev *client, u32 width, u32 height, 198 191 u32 format, u32 handle, u32 pitch) 199 192 { 193 + struct drm_mode_fb_cmd2 fb_req = { 194 + .width = width, 195 + .height = height, 196 + .pixel_format = format, 197 + .handles = { 198 + handle, 199 + }, 200 + .pitches = { 201 + pitch, 202 + }, 203 + }; 204 + struct drm_device *dev = client->dev; 200 205 struct drm_client_buffer *buffer; 201 206 struct drm_gem_object *obj; 207 + struct drm_framebuffer *fb; 202 208 int ret; 203 209 204 210 buffer = kzalloc(sizeof(*buffer), GFP_KERNEL); ··· 226 206 goto err_delete; 227 207 } 228 208 209 + ret = drm_mode_addfb2(dev, &fb_req, client->file); 210 + if (ret) 211 + goto err_drm_gem_object_put; 212 + 213 + fb = drm_framebuffer_lookup(dev, client->file, fb_req.fb_id); 214 + if (drm_WARN_ON(dev, !fb)) { 215 + ret = -ENOENT; 216 + goto err_drm_mode_rmfb; 217 + } 218 + 219 + /* drop the reference we picked up in framebuffer lookup */ 220 + drm_framebuffer_put(fb); 221 + 222 + strscpy(fb->comm, client->name, TASK_COMM_LEN); 223 + 229 224 buffer->gem = obj; 225 + buffer->fb = fb; 230 226 231 227 return buffer; 232 228 229 + err_drm_mode_rmfb: 230 + drm_mode_rmfb(dev, fb_req.fb_id, client->file); 231 + err_drm_gem_object_put: 232 + drm_gem_object_put(obj); 233 233 err_delete: 234 234 kfree(buffer); 235 235 return ERR_PTR(ret); ··· 363 323 } 364 324 EXPORT_SYMBOL(drm_client_buffer_vunmap); 365 325 366 - static void drm_client_buffer_rmfb(struct drm_client_buffer *buffer) 367 - { 368 - int ret; 369 - 370 - if (!buffer->fb) 371 - return; 372 - 373 - ret = drm_mode_rmfb(buffer->client->dev, buffer->fb->base.id, buffer->client->file); 374 - if (ret) 375 - drm_err(buffer->client->dev, 376 - "Error removing FB:%u (%d)\n", buffer->fb->base.id, ret); 377 - 378 - buffer->fb = NULL; 379 - } 380 - 381 - static int drm_client_buffer_addfb(struct drm_client_buffer *buffer, 382 - u32 width, u32 height, u32 format, 383 - u32 handle, u32 pitch) 384 - { 385 - struct drm_client_dev *client = buffer->client; 386 - struct drm_mode_fb_cmd2 fb_req = { }; 387 - int ret; 388 - 389 - fb_req.width = width; 390 - fb_req.height = height; 391 - fb_req.pixel_format = format; 392 - fb_req.handles[0] = handle; 393 - fb_req.pitches[0] = pitch; 394 - 395 - ret = drm_mode_addfb2(client->dev, &fb_req, client->file); 396 - if (ret) 397 - return ret; 398 - 399 - buffer->fb = drm_framebuffer_lookup(client->dev, buffer->client->file, fb_req.fb_id); 400 - if (WARN_ON(!buffer->fb)) 401 - return -ENOENT; 402 - 403 - /* drop the reference we picked up in framebuffer lookup */ 404 - drm_framebuffer_put(buffer->fb); 405 - 406 - strscpy(buffer->fb->comm, client->name, TASK_COMM_LEN); 407 - 408 - return 0; 409 - } 410 - 411 326 /** 412 327 * drm_client_framebuffer_create - Create a client framebuffer 413 328 * @client: DRM client ··· 400 405 goto err_drm_mode_destroy_dumb; 401 406 } 402 407 403 - ret = drm_client_buffer_addfb(buffer, width, height, format, 404 - dumb_args.handle, dumb_args.pitch); 405 - if (ret) 406 - goto err_drm_client_buffer_delete; 407 - 408 408 /* 409 409 * The handle is only needed for creating the framebuffer, destroy it 410 410 * again to solve a circular dependency should anybody export the GEM ··· 410 420 411 421 return buffer; 412 422 413 - err_drm_client_buffer_delete: 414 - drm_client_buffer_delete(buffer); 415 423 err_drm_mode_destroy_dumb: 416 424 drm_mode_destroy_dumb(client->dev, dumb_args.handle, client->file); 417 425 return ERR_PTR(ret); ··· 425 437 if (!buffer) 426 438 return; 427 439 428 - drm_client_buffer_rmfb(buffer); 429 440 drm_client_buffer_delete(buffer); 430 441 } 431 442 EXPORT_SYMBOL(drm_client_framebuffer_delete);