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

drm: Put legacy lastclose work into drm_legacy_dev_reinit

Except for the ->lasclose driver callback evrything in drm_lastclose()
is all legacy cruft and can be hidden. Which means another
dev->struct_mutex site disappears entirely for modern drivers!

Also while at it change the return value of drm_lastclose to void
since it will always succeed. No one checks the return value of
close() anyway, ever.

v2: Move misplaced hunk, spotted by 0day.

Cc: Thierry Reding <thierry.reding@gmail.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1461691808-12414-3-git-send-email-daniel.vetter@ffwll.ch

+30 -34
+29 -33
drivers/gpu/drm/drm_fops.c
··· 381 381 */ 382 382 static void drm_legacy_dev_reinit(struct drm_device *dev) 383 383 { 384 - if (drm_core_check_feature(dev, DRIVER_MODESET)) 385 - return; 386 - 387 - dev->sigdata.lock = NULL; 388 - 389 - dev->context_flag = 0; 390 - dev->last_context = 0; 391 - dev->if_version = 0; 392 - } 393 - 394 - /* 395 - * Take down the DRM device. 396 - * 397 - * \param dev DRM device structure. 398 - * 399 - * Frees every resource in \p dev. 400 - * 401 - * \sa drm_device 402 - */ 403 - int drm_lastclose(struct drm_device * dev) 404 - { 405 - DRM_DEBUG("\n"); 406 - 407 - if (dev->driver->lastclose) 408 - dev->driver->lastclose(dev); 409 - DRM_DEBUG("driver lastclose completed\n"); 410 - 411 - if (dev->irq_enabled && !drm_core_check_feature(dev, DRIVER_MODESET)) 384 + if (dev->irq_enabled) 412 385 drm_irq_uninstall(dev); 413 386 414 387 mutex_lock(&dev->struct_mutex); ··· 394 421 395 422 mutex_unlock(&dev->struct_mutex); 396 423 397 - drm_legacy_dev_reinit(dev); 424 + dev->sigdata.lock = NULL; 425 + 426 + dev->context_flag = 0; 427 + dev->last_context = 0; 428 + dev->if_version = 0; 398 429 399 430 DRM_DEBUG("lastclose completed\n"); 400 - return 0; 431 + } 432 + 433 + /* 434 + * Take down the DRM device. 435 + * 436 + * \param dev DRM device structure. 437 + * 438 + * Frees every resource in \p dev. 439 + * 440 + * \sa drm_device 441 + */ 442 + void drm_lastclose(struct drm_device * dev) 443 + { 444 + DRM_DEBUG("\n"); 445 + 446 + if (dev->driver->lastclose) 447 + dev->driver->lastclose(dev); 448 + DRM_DEBUG("driver lastclose completed\n"); 449 + 450 + if (!drm_core_check_feature(dev, DRIVER_MODESET)) 451 + drm_legacy_dev_reinit(dev); 401 452 } 402 453 403 454 /** ··· 442 445 struct drm_file *file_priv = filp->private_data; 443 446 struct drm_minor *minor = file_priv->minor; 444 447 struct drm_device *dev = minor->dev; 445 - int retcode = 0; 446 448 447 449 mutex_lock(&drm_global_mutex); 448 450 ··· 534 538 */ 535 539 536 540 if (!--dev->open_count) { 537 - retcode = drm_lastclose(dev); 541 + drm_lastclose(dev); 538 542 if (drm_device_is_unplugged(dev)) 539 543 drm_put_dev(dev); 540 544 } ··· 542 546 543 547 drm_minor_release(minor); 544 548 545 - return retcode; 549 + return 0; 546 550 } 547 551 EXPORT_SYMBOL(drm_release); 548 552
+1 -1
drivers/gpu/drm/drm_internal.h
··· 26 26 27 27 /* drm_fops.c */ 28 28 extern struct mutex drm_global_mutex; 29 - int drm_lastclose(struct drm_device *dev); 29 + void drm_lastclose(struct drm_device *dev); 30 30 31 31 /* drm_pci.c */ 32 32 int drm_pci_set_unique(struct drm_device *dev,