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

drm/radeon: use system_wq instead of dev_priv->wq

With cmwq, there's no reason for radeon to use a dedicated workqueue.
Drop dev_priv->wq and use system_wq instead.

Because radeon_driver_irq_uninstall_kms() may be called from
unsleepable context, the work items can't be flushed from there.
Instead, init and flush from radeon_irq_kms_init/fini().

While at it, simplify canceling/flushing of rdev->pm.dynpm_idle_work.
Always initialize and sync cancel instead of being unnecessarily smart
about it.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Alex Deucher <alexdeucher@gmail.com>
Cc: dri-devel@lists.freedesktop.org
Signed-off-by: Dave Airlie <airlied@redhat.com>

authored by

Tejun Heo and committed by
Dave Airlie
32c87fca af5dd83b

+23 -44
+1 -1
drivers/gpu/drm/radeon/evergreen.c
··· 2756 2756 if (wptr != rdev->ih.wptr) 2757 2757 goto restart_ih; 2758 2758 if (queue_hotplug) 2759 - queue_work(rdev->wq, &rdev->hotplug_work); 2759 + schedule_work(&rdev->hotplug_work); 2760 2760 rdev->ih.rptr = rptr; 2761 2761 WREG32(IH_RB_RPTR, rdev->ih.rptr); 2762 2762 spin_unlock_irqrestore(&rdev->ih.lock, flags);
+1 -1
drivers/gpu/drm/radeon/r100.c
··· 682 682 /* reset gui idle ack. the status bit is broken */ 683 683 rdev->irq.gui_idle_acked = false; 684 684 if (queue_hotplug) 685 - queue_work(rdev->wq, &rdev->hotplug_work); 685 + schedule_work(&rdev->hotplug_work); 686 686 if (rdev->msi_enabled) { 687 687 switch (rdev->family) { 688 688 case CHIP_RS400:
+1 -1
drivers/gpu/drm/radeon/r600.c
··· 3442 3442 if (wptr != rdev->ih.wptr) 3443 3443 goto restart_ih; 3444 3444 if (queue_hotplug) 3445 - queue_work(rdev->wq, &rdev->hotplug_work); 3445 + schedule_work(&rdev->hotplug_work); 3446 3446 rdev->ih.rptr = rptr; 3447 3447 WREG32(IH_RB_RPTR, rdev->ih.rptr); 3448 3448 spin_unlock_irqrestore(&rdev->ih.lock, flags);
-1
drivers/gpu/drm/radeon/radeon.h
··· 1152 1152 struct r700_vram_scratch vram_scratch; 1153 1153 int msi_enabled; /* msi enabled */ 1154 1154 struct r600_ih ih; /* r6/700 interrupt ring */ 1155 - struct workqueue_struct *wq; 1156 1155 struct work_struct hotplug_work; 1157 1156 int num_crtc; /* number of crtcs */ 1158 1157 struct mutex dc_hw_i2c_mutex; /* display controller hw i2c mutex */
-6
drivers/gpu/drm/radeon/radeon_device.c
··· 710 710 init_waitqueue_head(&rdev->irq.vblank_queue); 711 711 init_waitqueue_head(&rdev->irq.idle_queue); 712 712 713 - /* setup workqueue */ 714 - rdev->wq = create_workqueue("radeon"); 715 - if (rdev->wq == NULL) 716 - return -ENOMEM; 717 - 718 713 /* Set asic functions */ 719 714 r = radeon_asic_init(rdev); 720 715 if (r) ··· 808 813 /* evict vram memory */ 809 814 radeon_bo_evict_vram(rdev); 810 815 radeon_fini(rdev); 811 - destroy_workqueue(rdev->wq); 812 816 vga_switcheroo_unregister_client(rdev->pdev); 813 817 vga_client_register(rdev->pdev, NULL, NULL, NULL); 814 818 if (rdev->rio_mem)
+3 -2
drivers/gpu/drm/radeon/radeon_irq_kms.c
··· 64 64 struct radeon_device *rdev = dev->dev_private; 65 65 unsigned i; 66 66 67 - INIT_WORK(&rdev->hotplug_work, radeon_hotplug_work_func); 68 - 69 67 /* Disable *all* interrupts */ 70 68 rdev->irq.sw_int = false; 71 69 rdev->irq.gui_idle = false; ··· 112 114 { 113 115 int r = 0; 114 116 117 + INIT_WORK(&rdev->hotplug_work, radeon_hotplug_work_func); 118 + 115 119 spin_lock_init(&rdev->irq.sw_lock); 116 120 r = drm_vblank_init(rdev->ddev, rdev->num_crtc); 117 121 if (r) { ··· 152 152 if (rdev->msi_enabled) 153 153 pci_disable_msi(rdev->pdev); 154 154 } 155 + flush_work_sync(&rdev->hotplug_work); 155 156 } 156 157 157 158 void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev)
+16 -31
drivers/gpu/drm/radeon/radeon_pm.c
··· 405 405 rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT; 406 406 mutex_unlock(&rdev->pm.mutex); 407 407 } else if (strncmp("profile", buf, strlen("profile")) == 0) { 408 - bool flush_wq = false; 409 - 410 408 mutex_lock(&rdev->pm.mutex); 411 - if (rdev->pm.pm_method == PM_METHOD_DYNPM) { 412 - cancel_delayed_work(&rdev->pm.dynpm_idle_work); 413 - flush_wq = true; 414 - } 415 409 /* disable dynpm */ 416 410 rdev->pm.dynpm_state = DYNPM_STATE_DISABLED; 417 411 rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE; 418 412 rdev->pm.pm_method = PM_METHOD_PROFILE; 419 413 mutex_unlock(&rdev->pm.mutex); 420 - if (flush_wq) 421 - flush_workqueue(rdev->wq); 414 + cancel_delayed_work_sync(&rdev->pm.dynpm_idle_work); 422 415 } else { 423 416 DRM_ERROR("invalid power method!\n"); 424 417 goto fail; ··· 517 524 518 525 void radeon_pm_suspend(struct radeon_device *rdev) 519 526 { 520 - bool flush_wq = false; 521 - 522 527 mutex_lock(&rdev->pm.mutex); 523 528 if (rdev->pm.pm_method == PM_METHOD_DYNPM) { 524 - cancel_delayed_work(&rdev->pm.dynpm_idle_work); 525 529 if (rdev->pm.dynpm_state == DYNPM_STATE_ACTIVE) 526 530 rdev->pm.dynpm_state = DYNPM_STATE_SUSPENDED; 527 - flush_wq = true; 528 531 } 529 532 mutex_unlock(&rdev->pm.mutex); 530 - if (flush_wq) 531 - flush_workqueue(rdev->wq); 533 + 534 + cancel_delayed_work_sync(&rdev->pm.dynpm_idle_work); 532 535 } 533 536 534 537 void radeon_pm_resume(struct radeon_device *rdev) ··· 539 550 if (rdev->pm.pm_method == PM_METHOD_DYNPM 540 551 && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) { 541 552 rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE; 542 - queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work, 543 - msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); 553 + schedule_delayed_work(&rdev->pm.dynpm_idle_work, 554 + msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); 544 555 } 545 556 mutex_unlock(&rdev->pm.mutex); 546 557 radeon_pm_compute_clocks(rdev); ··· 574 585 ret = radeon_hwmon_init(rdev); 575 586 if (ret) 576 587 return ret; 588 + 589 + INIT_DELAYED_WORK(&rdev->pm.dynpm_idle_work, radeon_dynpm_idle_work_handler); 590 + 577 591 if (rdev->pm.num_power_states > 1) { 578 592 /* where's the best place to put these? */ 579 593 ret = device_create_file(rdev->dev, &dev_attr_power_profile); ··· 590 598 rdev->acpi_nb.notifier_call = radeon_acpi_event; 591 599 register_acpi_notifier(&rdev->acpi_nb); 592 600 #endif 593 - INIT_DELAYED_WORK(&rdev->pm.dynpm_idle_work, radeon_dynpm_idle_work_handler); 594 - 595 601 if (radeon_debugfs_pm_init(rdev)) { 596 602 DRM_ERROR("Failed to register debugfs file for PM!\n"); 597 603 } ··· 603 613 void radeon_pm_fini(struct radeon_device *rdev) 604 614 { 605 615 if (rdev->pm.num_power_states > 1) { 606 - bool flush_wq = false; 607 - 608 616 mutex_lock(&rdev->pm.mutex); 609 617 if (rdev->pm.pm_method == PM_METHOD_PROFILE) { 610 618 rdev->pm.profile = PM_PROFILE_DEFAULT; 611 619 radeon_pm_update_profile(rdev); 612 620 radeon_pm_set_clocks(rdev); 613 621 } else if (rdev->pm.pm_method == PM_METHOD_DYNPM) { 614 - /* cancel work */ 615 - cancel_delayed_work(&rdev->pm.dynpm_idle_work); 616 - flush_wq = true; 617 622 /* reset default clocks */ 618 623 rdev->pm.dynpm_state = DYNPM_STATE_DISABLED; 619 624 rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT; 620 625 radeon_pm_set_clocks(rdev); 621 626 } 622 627 mutex_unlock(&rdev->pm.mutex); 623 - if (flush_wq) 624 - flush_workqueue(rdev->wq); 628 + 629 + cancel_delayed_work_sync(&rdev->pm.dynpm_idle_work); 625 630 626 631 device_remove_file(rdev->dev, &dev_attr_power_profile); 627 632 device_remove_file(rdev->dev, &dev_attr_power_method); ··· 675 690 radeon_pm_get_dynpm_state(rdev); 676 691 radeon_pm_set_clocks(rdev); 677 692 678 - queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work, 679 - msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); 693 + schedule_delayed_work(&rdev->pm.dynpm_idle_work, 694 + msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); 680 695 } else if (rdev->pm.dynpm_state == DYNPM_STATE_PAUSED) { 681 696 rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE; 682 - queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work, 683 - msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); 697 + schedule_delayed_work(&rdev->pm.dynpm_idle_work, 698 + msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); 684 699 DRM_DEBUG_DRIVER("radeon: dynamic power management activated\n"); 685 700 } 686 701 } else { /* count == 0 */ ··· 785 800 radeon_pm_set_clocks(rdev); 786 801 } 787 802 788 - queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work, 789 - msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); 803 + schedule_delayed_work(&rdev->pm.dynpm_idle_work, 804 + msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); 790 805 } 791 806 mutex_unlock(&rdev->pm.mutex); 792 807 ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched);
+1 -1
drivers/gpu/drm/radeon/rs600.c
··· 692 692 /* reset gui idle ack. the status bit is broken */ 693 693 rdev->irq.gui_idle_acked = false; 694 694 if (queue_hotplug) 695 - queue_work(rdev->wq, &rdev->hotplug_work); 695 + schedule_work(&rdev->hotplug_work); 696 696 if (rdev->msi_enabled) { 697 697 switch (rdev->family) { 698 698 case CHIP_RS600: