diff mbox series

power: supply: core: Use blocking_notifier_call_chain to avoid RCU complaint

Message ID 20230913033233.602986-1-kai.heng.feng@canonical.com
State Accepted
Commit bbaa6ffa5b6c9609d3b3c431c389b407eea5441f
Headers show
Series power: supply: core: Use blocking_notifier_call_chain to avoid RCU complaint | expand

Commit Message

Kai-Heng Feng Sept. 13, 2023, 3:32 a.m. UTC
AMD PMF driver can cause the following warning:
[  196.159546] ------------[ cut here ]------------
[  196.159556] Voluntary context switch within RCU read-side critical section!
[  196.159571] WARNING: CPU: 0 PID: 9 at kernel/rcu/tree_plugin.h:320 rcu_note_context_switch+0x43d/0x560
[  196.159604] Modules linked in: nvme_fabrics ccm rfcomm snd_hda_scodec_cs35l41_spi cmac algif_hash algif_skcipher af_alg bnep joydev btusb btrtl uvcvideo btintel btbcm videobuf2_vmalloc intel_rapl_msr btmtk videobuf2_memops uvc videobuf2_v4l2 intel_rapl_common binfmt_misc hid_sensor_als snd_sof_amd_vangogh hid_sensor_trigger bluetooth industrialio_triggered_buffer videodev snd_sof_amd_rembrandt hid_sensor_iio_common amdgpu ecdh_generic kfifo_buf videobuf2_common hp_wmi kvm_amd sparse_keymap snd_sof_amd_renoir wmi_bmof industrialio ecc mc nls_iso8859_1 kvm snd_sof_amd_acp irqbypass snd_sof_xtensa_dsp crct10dif_pclmul crc32_pclmul mt7921e snd_sof_pci snd_ctl_led polyval_clmulni mt7921_common polyval_generic snd_sof ghash_clmulni_intel mt792x_lib mt76_connac_lib sha512_ssse3 snd_sof_utils aesni_intel snd_hda_codec_realtek crypto_simd mt76 snd_hda_codec_generic cryptd snd_soc_core snd_hda_codec_hdmi rapl ledtrig_audio input_leds snd_compress i2c_algo_bit drm_ttm_helper mac80211 snd_pci_ps hid_multitouch ttm drm_exec
[  196.159970]  drm_suballoc_helper snd_rpl_pci_acp6x amdxcp drm_buddy snd_hda_intel snd_acp_pci snd_hda_scodec_cs35l41_i2c serio_raw gpu_sched snd_hda_scodec_cs35l41 snd_acp_legacy_common snd_intel_dspcfg snd_hda_cs_dsp_ctls snd_hda_codec libarc4 drm_display_helper snd_pci_acp6x cs_dsp snd_hwdep snd_soc_cs35l41_lib video k10temp snd_pci_acp5x thunderbolt snd_hda_core drm_kms_helper cfg80211 snd_seq snd_rn_pci_acp3x snd_pcm snd_acp_config cec snd_soc_acpi snd_seq_device rc_core ccp snd_pci_acp3x snd_timer snd soundcore wmi amd_pmf platform_profile amd_pmc mac_hid serial_multi_instantiate wireless_hotkey hid_sensor_hub sch_fq_codel msr parport_pc ppdev lp parport efi_pstore ip_tables x_tables autofs4 btrfs blake2b_generic raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx libcrc32c xor raid6_pq raid1 raid0 multipath linear dm_mirror dm_region_hash dm_log cdc_ether usbnet r8152 mii hid_generic nvme i2c_hid_acpi i2c_hid nvme_core i2c_piix4 xhci_pci amd_sfh drm xhci_pci_renesas nvme_common hid
[  196.160382] CPU: 0 PID: 9 Comm: kworker/0:1 Not tainted 6.6.0-rc1 #4
[  196.160397] Hardware name: HP HP EliteBook 845 14 inch G10 Notebook PC/8B6E, BIOS V82 Ver. 01.02.00 08/24/2023
[  196.160405] Workqueue: events power_supply_changed_work
[  196.160426] RIP: 0010:rcu_note_context_switch+0x43d/0x560
[  196.160440] Code: 00 48 89 be 40 08 00 00 48 89 86 48 08 00 00 48 89 10 e9 63 fe ff ff 48 c7 c7 10 e7 b0 9e c6 05 e8 d8 20 02 01 e8 13 0f f3 ff <0f> 0b e9 27 fc ff ff a9 ff ff ff 7f 0f 84 cf fc ff ff 65 48 8b 3c
[  196.160450] RSP: 0018:ffffc900001878f0 EFLAGS: 00010046
[  196.160462] RAX: 0000000000000000 RBX: ffff88885e834040 RCX: 0000000000000000
[  196.160470] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000
[  196.160476] RBP: ffffc90000187910 R08: 0000000000000000 R09: 0000000000000000
[  196.160482] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000
[  196.160488] R13: 0000000000000000 R14: ffff888100990000 R15: ffff888100990000
[  196.160495] FS:  0000000000000000(0000) GS:ffff88885e800000(0000) knlGS:0000000000000000
[  196.160504] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[  196.160512] CR2: 000055cb053c8246 CR3: 000000013443a000 CR4: 0000000000750ef0
[  196.160520] PKRU: 55555554
[  196.160526] Call Trace:
[  196.160532]  <TASK>
[  196.160548]  ? show_regs+0x72/0x90
[  196.160570]  ? rcu_note_context_switch+0x43d/0x560
[  196.160580]  ? __warn+0x8d/0x160
[  196.160600]  ? rcu_note_context_switch+0x43d/0x560
[  196.160613]  ? report_bug+0x1bb/0x1d0
[  196.160637]  ? handle_bug+0x46/0x90
[  196.160658]  ? exc_invalid_op+0x19/0x80
[  196.160675]  ? asm_exc_invalid_op+0x1b/0x20
[  196.160709]  ? rcu_note_context_switch+0x43d/0x560
[  196.160727]  __schedule+0xb9/0x15f0
[  196.160746]  ? srso_alias_return_thunk+0x5/0x7f
[  196.160765]  ? srso_alias_return_thunk+0x5/0x7f
[  196.160778]  ? acpi_ns_search_one_scope+0xbe/0x270
[  196.160806]  schedule+0x68/0x110
[  196.160820]  schedule_timeout+0x151/0x160
[  196.160829]  ? srso_alias_return_thunk+0x5/0x7f
[  196.160842]  ? srso_alias_return_thunk+0x5/0x7f
[  196.160855]  ? acpi_ns_lookup+0x3c5/0xa90
[  196.160878]  __down_common+0xff/0x220
[  196.160905]  __down_timeout+0x16/0x30
[  196.160920]  down_timeout+0x64/0x70
[  196.160938]  acpi_os_wait_semaphore+0x85/0x200
[  196.160959]  acpi_ut_acquire_mutex+0x9e/0x280
[  196.160979]  acpi_ex_enter_interpreter+0x2d/0xb0
[  196.160992]  acpi_ns_evaluate+0x2f0/0x5f0
[  196.161005]  acpi_evaluate_object+0x172/0x490
[  196.161018]  ? acpi_os_signal_semaphore+0x8a/0xd0
[  196.161038]  acpi_evaluate_integer+0x52/0xe0
[  196.161055]  ? kfree+0x79/0x120
[  196.161071]  ? srso_alias_return_thunk+0x5/0x7f
[  196.161089]  acpi_ac_get_state.part.0+0x27/0x80
[  196.161110]  get_ac_property+0x5c/0x70
[  196.161127]  ? __pfx___power_supply_is_system_supplied+0x10/0x10
[  196.161146]  __power_supply_is_system_supplied+0x44/0xb0
[  196.161166]  class_for_each_device+0x124/0x160
[  196.161184]  ? acpi_ac_get_state.part.0+0x27/0x80
[  196.161203]  ? srso_alias_return_thunk+0x5/0x7f
[  196.161223]  power_supply_is_system_supplied+0x3c/0x70
[  196.161243]  amd_pmf_get_power_source+0xe/0x20 [amd_pmf]
[  196.161276]  amd_pmf_power_slider_update_event+0x49/0x90 [amd_pmf]
[  196.161310]  amd_pmf_pwr_src_notify_call+0xe7/0x100 [amd_pmf]
[  196.161340]  notifier_call_chain+0x5f/0xe0
[  196.161362]  atomic_notifier_call_chain+0x33/0x60
[  196.161378]  power_supply_changed_work+0x84/0x110
[  196.161394]  process_one_work+0x178/0x360
[  196.161412]  ? __pfx_worker_thread+0x10/0x10
[  196.161424]  worker_thread+0x307/0x430
[  196.161440]  ? __pfx_worker_thread+0x10/0x10
[  196.161451]  kthread+0xf4/0x130
[  196.161467]  ? __pfx_kthread+0x10/0x10
[  196.161486]  ret_from_fork+0x43/0x70
[  196.161502]  ? __pfx_kthread+0x10/0x10
[  196.161518]  ret_from_fork_asm+0x1b/0x30
[  196.161558]  </TASK>
[  196.161562] ---[ end trace 0000000000000000 ]---

Since there's no guarantee that all the callbacks can work in atomic
context, switch to use blocking_notifier_call_chain to relax the
constraint.

Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
---
 drivers/power/supply/power_supply_core.c | 8 ++++----
 include/linux/power_supply.h             | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

Comments

Mario Limonciello Sept. 13, 2023, 4:15 a.m. UTC | #1
On 9/12/2023 22:32, Kai-Heng Feng wrote:
> AMD PMF driver can cause the following warning:
> [  196.159546] ------------[ cut here ]------------
> [  196.159556] Voluntary context switch within RCU read-side critical section!
> [  196.159571] WARNING: CPU: 0 PID: 9 at kernel/rcu/tree_plugin.h:320 rcu_note_context_switch+0x43d/0x560
> [  196.159604] Modules linked in: nvme_fabrics ccm rfcomm snd_hda_scodec_cs35l41_spi cmac algif_hash algif_skcipher af_alg bnep joydev btusb btrtl uvcvideo btintel btbcm videobuf2_vmalloc intel_rapl_msr btmtk videobuf2_memops uvc videobuf2_v4l2 intel_rapl_common binfmt_misc hid_sensor_als snd_sof_amd_vangogh hid_sensor_trigger bluetooth industrialio_triggered_buffer videodev snd_sof_amd_rembrandt hid_sensor_iio_common amdgpu ecdh_generic kfifo_buf videobuf2_common hp_wmi kvm_amd sparse_keymap snd_sof_amd_renoir wmi_bmof industrialio ecc mc nls_iso8859_1 kvm snd_sof_amd_acp irqbypass snd_sof_xtensa_dsp crct10dif_pclmul crc32_pclmul mt7921e snd_sof_pci snd_ctl_led polyval_clmulni mt7921_common polyval_generic snd_sof ghash_clmulni_intel mt792x_lib mt76_connac_lib sha512_ssse3 snd_sof_utils aesni_intel snd_hda_codec_realtek crypto_simd mt76 snd_hda_codec_generic cryptd snd_soc_core snd_hda_codec_hdmi rapl ledtrig_audio input_leds snd_compress i2c_algo_bit drm_ttm_helper mac80211 snd_pci_ps hid_multitouch ttm drm_exec
> [  196.159970]  drm_suballoc_helper snd_rpl_pci_acp6x amdxcp drm_buddy snd_hda_intel snd_acp_pci snd_hda_scodec_cs35l41_i2c serio_raw gpu_sched snd_hda_scodec_cs35l41 snd_acp_legacy_common snd_intel_dspcfg snd_hda_cs_dsp_ctls snd_hda_codec libarc4 drm_display_helper snd_pci_acp6x cs_dsp snd_hwdep snd_soc_cs35l41_lib video k10temp snd_pci_acp5x thunderbolt snd_hda_core drm_kms_helper cfg80211 snd_seq snd_rn_pci_acp3x snd_pcm snd_acp_config cec snd_soc_acpi snd_seq_device rc_core ccp snd_pci_acp3x snd_timer snd soundcore wmi amd_pmf platform_profile amd_pmc mac_hid serial_multi_instantiate wireless_hotkey hid_sensor_hub sch_fq_codel msr parport_pc ppdev lp parport efi_pstore ip_tables x_tables autofs4 btrfs blake2b_generic raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx libcrc32c xor raid6_pq raid1 raid0 multipath linear dm_mirror dm_region_hash dm_log cdc_ether usbnet r8152 mii hid_generic nvme i2c_hid_acpi i2c_hid nvme_core i2c_piix4 xhci_pci amd_sfh drm xhci_pci_renesas nvme_common hid
> [  196.160382] CPU: 0 PID: 9 Comm: kworker/0:1 Not tainted 6.6.0-rc1 #4
> [  196.160397] Hardware name: HP HP EliteBook 845 14 inch G10 Notebook PC/8B6E, BIOS V82 Ver. 01.02.00 08/24/2023
> [  196.160405] Workqueue: events power_supply_changed_work
> [  196.160426] RIP: 0010:rcu_note_context_switch+0x43d/0x560
> [  196.160440] Code: 00 48 89 be 40 08 00 00 48 89 86 48 08 00 00 48 89 10 e9 63 fe ff ff 48 c7 c7 10 e7 b0 9e c6 05 e8 d8 20 02 01 e8 13 0f f3 ff <0f> 0b e9 27 fc ff ff a9 ff ff ff 7f 0f 84 cf fc ff ff 65 48 8b 3c
> [  196.160450] RSP: 0018:ffffc900001878f0 EFLAGS: 00010046
> [  196.160462] RAX: 0000000000000000 RBX: ffff88885e834040 RCX: 0000000000000000
> [  196.160470] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000
> [  196.160476] RBP: ffffc90000187910 R08: 0000000000000000 R09: 0000000000000000
> [  196.160482] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000
> [  196.160488] R13: 0000000000000000 R14: ffff888100990000 R15: ffff888100990000
> [  196.160495] FS:  0000000000000000(0000) GS:ffff88885e800000(0000) knlGS:0000000000000000
> [  196.160504] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> [  196.160512] CR2: 000055cb053c8246 CR3: 000000013443a000 CR4: 0000000000750ef0
> [  196.160520] PKRU: 55555554
> [  196.160526] Call Trace:
> [  196.160532]  <TASK>
> [  196.160548]  ? show_regs+0x72/0x90
> [  196.160570]  ? rcu_note_context_switch+0x43d/0x560
> [  196.160580]  ? __warn+0x8d/0x160
> [  196.160600]  ? rcu_note_context_switch+0x43d/0x560
> [  196.160613]  ? report_bug+0x1bb/0x1d0
> [  196.160637]  ? handle_bug+0x46/0x90
> [  196.160658]  ? exc_invalid_op+0x19/0x80
> [  196.160675]  ? asm_exc_invalid_op+0x1b/0x20
> [  196.160709]  ? rcu_note_context_switch+0x43d/0x560
> [  196.160727]  __schedule+0xb9/0x15f0
> [  196.160746]  ? srso_alias_return_thunk+0x5/0x7f
> [  196.160765]  ? srso_alias_return_thunk+0x5/0x7f
> [  196.160778]  ? acpi_ns_search_one_scope+0xbe/0x270
> [  196.160806]  schedule+0x68/0x110
> [  196.160820]  schedule_timeout+0x151/0x160
> [  196.160829]  ? srso_alias_return_thunk+0x5/0x7f
> [  196.160842]  ? srso_alias_return_thunk+0x5/0x7f
> [  196.160855]  ? acpi_ns_lookup+0x3c5/0xa90
> [  196.160878]  __down_common+0xff/0x220
> [  196.160905]  __down_timeout+0x16/0x30
> [  196.160920]  down_timeout+0x64/0x70
> [  196.160938]  acpi_os_wait_semaphore+0x85/0x200
> [  196.160959]  acpi_ut_acquire_mutex+0x9e/0x280
> [  196.160979]  acpi_ex_enter_interpreter+0x2d/0xb0
> [  196.160992]  acpi_ns_evaluate+0x2f0/0x5f0
> [  196.161005]  acpi_evaluate_object+0x172/0x490
> [  196.161018]  ? acpi_os_signal_semaphore+0x8a/0xd0
> [  196.161038]  acpi_evaluate_integer+0x52/0xe0
> [  196.161055]  ? kfree+0x79/0x120
> [  196.161071]  ? srso_alias_return_thunk+0x5/0x7f
> [  196.161089]  acpi_ac_get_state.part.0+0x27/0x80
> [  196.161110]  get_ac_property+0x5c/0x70
> [  196.161127]  ? __pfx___power_supply_is_system_supplied+0x10/0x10
> [  196.161146]  __power_supply_is_system_supplied+0x44/0xb0
> [  196.161166]  class_for_each_device+0x124/0x160
> [  196.161184]  ? acpi_ac_get_state.part.0+0x27/0x80
> [  196.161203]  ? srso_alias_return_thunk+0x5/0x7f
> [  196.161223]  power_supply_is_system_supplied+0x3c/0x70
> [  196.161243]  amd_pmf_get_power_source+0xe/0x20 [amd_pmf]
> [  196.161276]  amd_pmf_power_slider_update_event+0x49/0x90 [amd_pmf]
> [  196.161310]  amd_pmf_pwr_src_notify_call+0xe7/0x100 [amd_pmf]
> [  196.161340]  notifier_call_chain+0x5f/0xe0
> [  196.161362]  atomic_notifier_call_chain+0x33/0x60
> [  196.161378]  power_supply_changed_work+0x84/0x110
> [  196.161394]  process_one_work+0x178/0x360
> [  196.161412]  ? __pfx_worker_thread+0x10/0x10
> [  196.161424]  worker_thread+0x307/0x430
> [  196.161440]  ? __pfx_worker_thread+0x10/0x10
> [  196.161451]  kthread+0xf4/0x130
> [  196.161467]  ? __pfx_kthread+0x10/0x10
> [  196.161486]  ret_from_fork+0x43/0x70
> [  196.161502]  ? __pfx_kthread+0x10/0x10
> [  196.161518]  ret_from_fork_asm+0x1b/0x30
> [  196.161558]  </TASK>
> [  196.161562] ---[ end trace 0000000000000000 ]---
> 
> Since there's no guarantee that all the callbacks can work in atomic
> context, switch to use blocking_notifier_call_chain to relax the
> constraint.
> 
> Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>

I believe this is actually the same bug that was reported in the past 
but it was masked by other changes.
Considering that I think these tags apply to this situation:

Fixes: 4c71ae414474 ("platform/x86/amd/pmf: Add support SPS PMF feature")
Reported-by: Allen Zhong <allen@atr.me>
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217571

The fix looks good to me as well, thanks.

Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>

> ---
>   drivers/power/supply/power_supply_core.c | 8 ++++----
>   include/linux/power_supply.h             | 2 +-
>   2 files changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c
> index 0b69fb7bafd8..416409e2fd6d 100644
> --- a/drivers/power/supply/power_supply_core.c
> +++ b/drivers/power/supply/power_supply_core.c
> @@ -29,7 +29,7 @@
>   struct class *power_supply_class;
>   EXPORT_SYMBOL_GPL(power_supply_class);
>   
> -ATOMIC_NOTIFIER_HEAD(power_supply_notifier);
> +BLOCKING_NOTIFIER_HEAD(power_supply_notifier);
>   EXPORT_SYMBOL_GPL(power_supply_notifier);
>   
>   static struct device_type power_supply_dev_type;
> @@ -97,7 +97,7 @@ static void power_supply_changed_work(struct work_struct *work)
>   		class_for_each_device(power_supply_class, NULL, psy,
>   				      __power_supply_changed_work);
>   		power_supply_update_leds(psy);
> -		atomic_notifier_call_chain(&power_supply_notifier,
> +		blocking_notifier_call_chain(&power_supply_notifier,
>   				PSY_EVENT_PROP_CHANGED, psy);
>   		kobject_uevent(&psy->dev.kobj, KOBJ_CHANGE);
>   		spin_lock_irqsave(&psy->changed_lock, flags);
> @@ -1262,13 +1262,13 @@ static void power_supply_dev_release(struct device *dev)
>   
>   int power_supply_reg_notifier(struct notifier_block *nb)
>   {
> -	return atomic_notifier_chain_register(&power_supply_notifier, nb);
> +	return blocking_notifier_chain_register(&power_supply_notifier, nb);
>   }
>   EXPORT_SYMBOL_GPL(power_supply_reg_notifier);
>   
>   void power_supply_unreg_notifier(struct notifier_block *nb)
>   {
> -	atomic_notifier_chain_unregister(&power_supply_notifier, nb);
> +	blocking_notifier_chain_unregister(&power_supply_notifier, nb);
>   }
>   EXPORT_SYMBOL_GPL(power_supply_unreg_notifier);
>   
> diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h
> index a427f13c757f..85b86768c0b9 100644
> --- a/include/linux/power_supply.h
> +++ b/include/linux/power_supply.h
> @@ -767,7 +767,7 @@ struct power_supply_battery_info {
>   	int bti_resistance_tolerance;
>   };
>   
> -extern struct atomic_notifier_head power_supply_notifier;
> +extern struct blocking_notifier_head power_supply_notifier;
>   extern int power_supply_reg_notifier(struct notifier_block *nb);
>   extern void power_supply_unreg_notifier(struct notifier_block *nb);
>   #if IS_ENABLED(CONFIG_POWER_SUPPLY)
Shyam Sundar S K Sept. 13, 2023, 1:03 p.m. UTC | #2
Hi Kai-Heng Feng,

On 9/13/2023 9:45 AM, Mario Limonciello wrote:
> On 9/12/2023 22:32, Kai-Heng Feng wrote:
>> AMD PMF driver can cause the following warning:
>> [  196.159546] ------------[ cut here ]------------
>> [  196.159556] Voluntary context switch within RCU read-side critical
>> section!
>> [  196.159571] WARNING: CPU: 0 PID: 9 at kernel/rcu/tree_plugin.h:320
>> rcu_note_context_switch+0x43d/0x560
>> [  196.159604] Modules linked in: nvme_fabrics ccm rfcomm
>> snd_hda_scodec_cs35l41_spi cmac algif_hash algif_skcipher af_alg bnep
>> joydev btusb btrtl uvcvideo btintel btbcm videobuf2_vmalloc
>> intel_rapl_msr btmtk videobuf2_memops uvc videobuf2_v4l2
>> intel_rapl_common binfmt_misc hid_sensor_als snd_sof_amd_vangogh
>> hid_sensor_trigger bluetooth industrialio_triggered_buffer videodev
>> snd_sof_amd_rembrandt hid_sensor_iio_common amdgpu ecdh_generic
>> kfifo_buf videobuf2_common hp_wmi kvm_amd sparse_keymap
>> snd_sof_amd_renoir wmi_bmof industrialio ecc mc nls_iso8859_1 kvm
>> snd_sof_amd_acp irqbypass snd_sof_xtensa_dsp crct10dif_pclmul
>> crc32_pclmul mt7921e snd_sof_pci snd_ctl_led polyval_clmulni
>> mt7921_common polyval_generic snd_sof ghash_clmulni_intel mt792x_lib
>> mt76_connac_lib sha512_ssse3 snd_sof_utils aesni_intel
>> snd_hda_codec_realtek crypto_simd mt76 snd_hda_codec_generic cryptd
>> snd_soc_core snd_hda_codec_hdmi rapl ledtrig_audio input_leds
>> snd_compress i2c_algo_bit drm_ttm_helper mac80211 snd_pci_ps
>> hid_multitouch ttm drm_exec
>> [  196.159970]  drm_suballoc_helper snd_rpl_pci_acp6x amdxcp
>> drm_buddy snd_hda_intel snd_acp_pci snd_hda_scodec_cs35l41_i2c
>> serio_raw gpu_sched snd_hda_scodec_cs35l41 snd_acp_legacy_common
>> snd_intel_dspcfg snd_hda_cs_dsp_ctls snd_hda_codec libarc4
>> drm_display_helper snd_pci_acp6x cs_dsp snd_hwdep snd_soc_cs35l41_lib
>> video k10temp snd_pci_acp5x thunderbolt snd_hda_core drm_kms_helper
>> cfg80211 snd_seq snd_rn_pci_acp3x snd_pcm snd_acp_config cec
>> snd_soc_acpi snd_seq_device rc_core ccp snd_pci_acp3x snd_timer snd
>> soundcore wmi amd_pmf platform_profile amd_pmc mac_hid
>> serial_multi_instantiate wireless_hotkey hid_sensor_hub sch_fq_codel
>> msr parport_pc ppdev lp parport efi_pstore ip_tables x_tables autofs4
>> btrfs blake2b_generic raid10 raid456 async_raid6_recov async_memcpy
>> async_pq async_xor async_tx libcrc32c xor raid6_pq raid1 raid0
>> multipath linear dm_mirror dm_region_hash dm_log cdc_ether usbnet
>> r8152 mii hid_generic nvme i2c_hid_acpi i2c_hid nvme_core i2c_piix4
>> xhci_pci amd_sfh drm xhci_pci_renesas nvme_common hid
>> [  196.160382] CPU: 0 PID: 9 Comm: kworker/0:1 Not tainted 6.6.0-rc1 #4
>> [  196.160397] Hardware name: HP HP EliteBook 845 14 inch G10
>> Notebook PC/8B6E, BIOS V82 Ver. 01.02.00 08/24/2023
>> [  196.160405] Workqueue: events power_supply_changed_work
>> [  196.160426] RIP: 0010:rcu_note_context_switch+0x43d/0x560
>> [  196.160440] Code: 00 48 89 be 40 08 00 00 48 89 86 48 08 00 00 48
>> 89 10 e9 63 fe ff ff 48 c7 c7 10 e7 b0 9e c6 05 e8 d8 20 02 01 e8 13
>> 0f f3 ff <0f> 0b e9 27 fc ff ff a9 ff ff ff 7f 0f 84 cf fc ff ff 65
>> 48 8b 3c
>> [  196.160450] RSP: 0018:ffffc900001878f0 EFLAGS: 00010046
>> [  196.160462] RAX: 0000000000000000 RBX: ffff88885e834040 RCX:
>> 0000000000000000
>> [  196.160470] RDX: 0000000000000000 RSI: 0000000000000000 RDI:
>> 0000000000000000
>> [  196.160476] RBP: ffffc90000187910 R08: 0000000000000000 R09:
>> 0000000000000000
>> [  196.160482] R10: 0000000000000000 R11: 0000000000000000 R12:
>> 0000000000000000
>> [  196.160488] R13: 0000000000000000 R14: ffff888100990000 R15:
>> ffff888100990000
>> [  196.160495] FS:  0000000000000000(0000) GS:ffff88885e800000(0000)
>> knlGS:0000000000000000
>> [  196.160504] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
>> [  196.160512] CR2: 000055cb053c8246 CR3: 000000013443a000 CR4:
>> 0000000000750ef0
>> [  196.160520] PKRU: 55555554
>> [  196.160526] Call Trace:
>> [  196.160532]  <TASK>
>> [  196.160548]  ? show_regs+0x72/0x90
>> [  196.160570]  ? rcu_note_context_switch+0x43d/0x560
>> [  196.160580]  ? __warn+0x8d/0x160
>> [  196.160600]  ? rcu_note_context_switch+0x43d/0x560
>> [  196.160613]  ? report_bug+0x1bb/0x1d0
>> [  196.160637]  ? handle_bug+0x46/0x90
>> [  196.160658]  ? exc_invalid_op+0x19/0x80
>> [  196.160675]  ? asm_exc_invalid_op+0x1b/0x20
>> [  196.160709]  ? rcu_note_context_switch+0x43d/0x560
>> [  196.160727]  __schedule+0xb9/0x15f0
>> [  196.160746]  ? srso_alias_return_thunk+0x5/0x7f
>> [  196.160765]  ? srso_alias_return_thunk+0x5/0x7f
>> [  196.160778]  ? acpi_ns_search_one_scope+0xbe/0x270
>> [  196.160806]  schedule+0x68/0x110
>> [  196.160820]  schedule_timeout+0x151/0x160
>> [  196.160829]  ? srso_alias_return_thunk+0x5/0x7f
>> [  196.160842]  ? srso_alias_return_thunk+0x5/0x7f
>> [  196.160855]  ? acpi_ns_lookup+0x3c5/0xa90
>> [  196.160878]  __down_common+0xff/0x220
>> [  196.160905]  __down_timeout+0x16/0x30
>> [  196.160920]  down_timeout+0x64/0x70
>> [  196.160938]  acpi_os_wait_semaphore+0x85/0x200
>> [  196.160959]  acpi_ut_acquire_mutex+0x9e/0x280
>> [  196.160979]  acpi_ex_enter_interpreter+0x2d/0xb0
>> [  196.160992]  acpi_ns_evaluate+0x2f0/0x5f0
>> [  196.161005]  acpi_evaluate_object+0x172/0x490
>> [  196.161018]  ? acpi_os_signal_semaphore+0x8a/0xd0
>> [  196.161038]  acpi_evaluate_integer+0x52/0xe0
>> [  196.161055]  ? kfree+0x79/0x120
>> [  196.161071]  ? srso_alias_return_thunk+0x5/0x7f
>> [  196.161089]  acpi_ac_get_state.part.0+0x27/0x80
>> [  196.161110]  get_ac_property+0x5c/0x70
>> [  196.161127]  ? __pfx___power_supply_is_system_supplied+0x10/0x10
>> [  196.161146]  __power_supply_is_system_supplied+0x44/0xb0
>> [  196.161166]  class_for_each_device+0x124/0x160
>> [  196.161184]  ? acpi_ac_get_state.part.0+0x27/0x80
>> [  196.161203]  ? srso_alias_return_thunk+0x5/0x7f
>> [  196.161223]  power_supply_is_system_supplied+0x3c/0x70
>> [  196.161243]  amd_pmf_get_power_source+0xe/0x20 [amd_pmf]
>> [  196.161276]  amd_pmf_power_slider_update_event+0x49/0x90 [amd_pmf]
>> [  196.161310]  amd_pmf_pwr_src_notify_call+0xe7/0x100 [amd_pmf]
>> [  196.161340]  notifier_call_chain+0x5f/0xe0
>> [  196.161362]  atomic_notifier_call_chain+0x33/0x60
>> [  196.161378]  power_supply_changed_work+0x84/0x110
>> [  196.161394]  process_one_work+0x178/0x360
>> [  196.161412]  ? __pfx_worker_thread+0x10/0x10
>> [  196.161424]  worker_thread+0x307/0x430
>> [  196.161440]  ? __pfx_worker_thread+0x10/0x10
>> [  196.161451]  kthread+0xf4/0x130
>> [  196.161467]  ? __pfx_kthread+0x10/0x10
>> [  196.161486]  ret_from_fork+0x43/0x70
>> [  196.161502]  ? __pfx_kthread+0x10/0x10
>> [  196.161518]  ret_from_fork_asm+0x1b/0x30
>> [  196.161558]  </TASK>
>> [  196.161562] ---[ end trace 0000000000000000 ]---
>>
>> Since there's no guarantee that all the callbacks can work in atomic
>> context, switch to use blocking_notifier_call_chain to relax the
>> constraint.
>>
>> Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
>
> I believe this is actually the same bug that was reported in the past
> but it was masked by other changes.
> Considering that I think these tags apply to this situation:
>
> Fixes: 4c71ae414474 ("platform/x86/amd/pmf: Add support SPS PMF feature")

Thank you for the fix, but the right fixes tag for this one should be:

Fixes: d36240d26025 ("power_supply: Add power_supply notifier")


with that change in place:

Reviewed-by: Shyam Sundar S K Shyam-sundar.S-k@amd.com


Thanks,

Shyam

> Reported-by: Allen Zhong <allen@atr.me>
> Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217571
>
> The fix looks good to me as well, thanks.
>
> Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
>
>> ---
>>   drivers/power/supply/power_supply_core.c | 8 ++++----
>>   include/linux/power_supply.h             | 2 +-
>>   2 files changed, 5 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/power/supply/power_supply_core.c
>> b/drivers/power/supply/power_supply_core.c
>> index 0b69fb7bafd8..416409e2fd6d 100644
>> --- a/drivers/power/supply/power_supply_core.c
>> +++ b/drivers/power/supply/power_supply_core.c
>> @@ -29,7 +29,7 @@
>>   struct class *power_supply_class;
>>   EXPORT_SYMBOL_GPL(power_supply_class);
>>   -ATOMIC_NOTIFIER_HEAD(power_supply_notifier);
>> +BLOCKING_NOTIFIER_HEAD(power_supply_notifier);
>>   EXPORT_SYMBOL_GPL(power_supply_notifier);
>>     static struct device_type power_supply_dev_type;
>> @@ -97,7 +97,7 @@ static void power_supply_changed_work(struct
>> work_struct *work)
>>           class_for_each_device(power_supply_class, NULL, psy,
>>                         __power_supply_changed_work);
>>           power_supply_update_leds(psy);
>> -        atomic_notifier_call_chain(&power_supply_notifier,
>> +        blocking_notifier_call_chain(&power_supply_notifier,
>>                   PSY_EVENT_PROP_CHANGED, psy);
>>           kobject_uevent(&psy->dev.kobj, KOBJ_CHANGE);
>>           spin_lock_irqsave(&psy->changed_lock, flags);
>> @@ -1262,13 +1262,13 @@ static void power_supply_dev_release(struct
>> device *dev)
>>     int power_supply_reg_notifier(struct notifier_block *nb)
>>   {
>> -    return atomic_notifier_chain_register(&power_supply_notifier, nb);
>> +    return blocking_notifier_chain_register(&power_supply_notifier,
>> nb);
>>   }
>>   EXPORT_SYMBOL_GPL(power_supply_reg_notifier);
>>     void power_supply_unreg_notifier(struct notifier_block *nb)
>>   {
>> -    atomic_notifier_chain_unregister(&power_supply_notifier, nb);
>> +    blocking_notifier_chain_unregister(&power_supply_notifier, nb);
>>   }
>>   EXPORT_SYMBOL_GPL(power_supply_unreg_notifier);
>>   diff --git a/include/linux/power_supply.h
>> b/include/linux/power_supply.h
>> index a427f13c757f..85b86768c0b9 100644
>> --- a/include/linux/power_supply.h
>> +++ b/include/linux/power_supply.h
>> @@ -767,7 +767,7 @@ struct power_supply_battery_info {
>>       int bti_resistance_tolerance;
>>   };
>>   -extern struct atomic_notifier_head power_supply_notifier;
>> +extern struct blocking_notifier_head power_supply_notifier;
>>   extern int power_supply_reg_notifier(struct notifier_block *nb);
>>   extern void power_supply_unreg_notifier(struct notifier_block *nb);
>>   #if IS_ENABLED(CONFIG_POWER_SUPPLY)
>
Sebastian Reichel Sept. 13, 2023, 1:38 p.m. UTC | #3
On Wed, 13 Sep 2023 11:32:33 +0800, Kai-Heng Feng wrote:
> AMD PMF driver can cause the following warning:
> [  196.159546] ------------[ cut here ]------------
> [  196.159556] Voluntary context switch within RCU read-side critical section!
> [  196.159571] WARNING: CPU: 0 PID: 9 at kernel/rcu/tree_plugin.h:320 rcu_note_context_switch+0x43d/0x560
> [  196.159604] Modules linked in: nvme_fabrics ccm rfcomm snd_hda_scodec_cs35l41_spi cmac algif_hash algif_skcipher af_alg bnep joydev btusb btrtl uvcvideo btintel btbcm videobuf2_vmalloc intel_rapl_msr btmtk videobuf2_memops uvc videobuf2_v4l2 intel_rapl_common binfmt_misc hid_sensor_als snd_sof_amd_vangogh hid_sensor_trigger bluetooth industrialio_triggered_buffer videodev snd_sof_amd_rembrandt hid_sensor_iio_common amdgpu ecdh_generic kfifo_buf videobuf2_common hp_wmi kvm_amd sparse_keymap snd_sof_amd_renoir wmi_bmof industrialio ecc mc nls_iso8859_1 kvm snd_sof_amd_acp irqbypass snd_sof_xtensa_dsp crct10dif_pclmul crc32_pclmul mt7921e snd_sof_pci snd_ctl_led polyval_clmulni mt7921_common polyval_generic snd_sof ghash_clmulni_intel mt792x_lib mt76_connac_lib sha512_ssse3 snd_sof_utils aesni_intel snd_hda_codec_realtek crypto_simd mt76 snd_hda_codec_generic cryptd snd_soc_core snd_hda_codec_hdmi rapl ledtrig_audio input_leds snd_compress i2c_algo_bit drm_ttm_helper mac80211 snd_p
 ci_ps hid_multitouch ttm drm_exec
> [  196.159970]  drm_suballoc_helper snd_rpl_pci_acp6x amdxcp drm_buddy snd_hda_intel snd_acp_pci snd_hda_scodec_cs35l41_i2c serio_raw gpu_sched snd_hda_scodec_cs35l41 snd_acp_legacy_common snd_intel_dspcfg snd_hda_cs_dsp_ctls snd_hda_codec libarc4 drm_display_helper snd_pci_acp6x cs_dsp snd_hwdep snd_soc_cs35l41_lib video k10temp snd_pci_acp5x thunderbolt snd_hda_core drm_kms_helper cfg80211 snd_seq snd_rn_pci_acp3x snd_pcm snd_acp_config cec snd_soc_acpi snd_seq_device rc_core ccp snd_pci_acp3x snd_timer snd soundcore wmi amd_pmf platform_profile amd_pmc mac_hid serial_multi_instantiate wireless_hotkey hid_sensor_hub sch_fq_codel msr parport_pc ppdev lp parport efi_pstore ip_tables x_tables autofs4 btrfs blake2b_generic raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx libcrc32c xor raid6_pq raid1 raid0 multipath linear dm_mirror dm_region_hash dm_log cdc_ether usbnet r8152 mii hid_generic nvme i2c_hid_acpi i2c_hid nvme_core i2c_piix4 xhci_pci amd_sfh drm x
 hci_pci_renesas nvme_common hid
> [  196.160382] CPU: 0 PID: 9 Comm: kworker/0:1 Not tainted 6.6.0-rc1 #4
> [  196.160397] Hardware name: HP HP EliteBook 845 14 inch G10 Notebook PC/8B6E, BIOS V82 Ver. 01.02.00 08/24/2023
> [  196.160405] Workqueue: events power_supply_changed_work
> [  196.160426] RIP: 0010:rcu_note_context_switch+0x43d/0x560
> [  196.160440] Code: 00 48 89 be 40 08 00 00 48 89 86 48 08 00 00 48 89 10 e9 63 fe ff ff 48 c7 c7 10 e7 b0 9e c6 05 e8 d8 20 02 01 e8 13 0f f3 ff <0f> 0b e9 27 fc ff ff a9 ff ff ff 7f 0f 84 cf fc ff ff 65 48 8b 3c
> [  196.160450] RSP: 0018:ffffc900001878f0 EFLAGS: 00010046
> [  196.160462] RAX: 0000000000000000 RBX: ffff88885e834040 RCX: 0000000000000000
> [  196.160470] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000
> [  196.160476] RBP: ffffc90000187910 R08: 0000000000000000 R09: 0000000000000000
> [  196.160482] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000
> [  196.160488] R13: 0000000000000000 R14: ffff888100990000 R15: ffff888100990000
> [  196.160495] FS:  0000000000000000(0000) GS:ffff88885e800000(0000) knlGS:0000000000000000
> [  196.160504] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> [  196.160512] CR2: 000055cb053c8246 CR3: 000000013443a000 CR4: 0000000000750ef0
> [  196.160520] PKRU: 55555554
> [  196.160526] Call Trace:
> [  196.160532]  <TASK>
> [  196.160548]  ? show_regs+0x72/0x90
> [  196.160570]  ? rcu_note_context_switch+0x43d/0x560
> [  196.160580]  ? __warn+0x8d/0x160
> [  196.160600]  ? rcu_note_context_switch+0x43d/0x560
> [  196.160613]  ? report_bug+0x1bb/0x1d0
> [  196.160637]  ? handle_bug+0x46/0x90
> [  196.160658]  ? exc_invalid_op+0x19/0x80
> [  196.160675]  ? asm_exc_invalid_op+0x1b/0x20
> [  196.160709]  ? rcu_note_context_switch+0x43d/0x560
> [  196.160727]  __schedule+0xb9/0x15f0
> [  196.160746]  ? srso_alias_return_thunk+0x5/0x7f
> [  196.160765]  ? srso_alias_return_thunk+0x5/0x7f
> [  196.160778]  ? acpi_ns_search_one_scope+0xbe/0x270
> [  196.160806]  schedule+0x68/0x110
> [  196.160820]  schedule_timeout+0x151/0x160
> [  196.160829]  ? srso_alias_return_thunk+0x5/0x7f
> [  196.160842]  ? srso_alias_return_thunk+0x5/0x7f
> [  196.160855]  ? acpi_ns_lookup+0x3c5/0xa90
> [  196.160878]  __down_common+0xff/0x220
> [  196.160905]  __down_timeout+0x16/0x30
> [  196.160920]  down_timeout+0x64/0x70
> [  196.160938]  acpi_os_wait_semaphore+0x85/0x200
> [  196.160959]  acpi_ut_acquire_mutex+0x9e/0x280
> [  196.160979]  acpi_ex_enter_interpreter+0x2d/0xb0
> [  196.160992]  acpi_ns_evaluate+0x2f0/0x5f0
> [  196.161005]  acpi_evaluate_object+0x172/0x490
> [  196.161018]  ? acpi_os_signal_semaphore+0x8a/0xd0
> [  196.161038]  acpi_evaluate_integer+0x52/0xe0
> [  196.161055]  ? kfree+0x79/0x120
> [  196.161071]  ? srso_alias_return_thunk+0x5/0x7f
> [  196.161089]  acpi_ac_get_state.part.0+0x27/0x80
> [  196.161110]  get_ac_property+0x5c/0x70
> [  196.161127]  ? __pfx___power_supply_is_system_supplied+0x10/0x10
> [  196.161146]  __power_supply_is_system_supplied+0x44/0xb0
> [  196.161166]  class_for_each_device+0x124/0x160
> [  196.161184]  ? acpi_ac_get_state.part.0+0x27/0x80
> [  196.161203]  ? srso_alias_return_thunk+0x5/0x7f
> [  196.161223]  power_supply_is_system_supplied+0x3c/0x70
> [  196.161243]  amd_pmf_get_power_source+0xe/0x20 [amd_pmf]
> [  196.161276]  amd_pmf_power_slider_update_event+0x49/0x90 [amd_pmf]
> [  196.161310]  amd_pmf_pwr_src_notify_call+0xe7/0x100 [amd_pmf]
> [  196.161340]  notifier_call_chain+0x5f/0xe0
> [  196.161362]  atomic_notifier_call_chain+0x33/0x60
> [  196.161378]  power_supply_changed_work+0x84/0x110
> [  196.161394]  process_one_work+0x178/0x360
> [  196.161412]  ? __pfx_worker_thread+0x10/0x10
> [  196.161424]  worker_thread+0x307/0x430
> [  196.161440]  ? __pfx_worker_thread+0x10/0x10
> [  196.161451]  kthread+0xf4/0x130
> [  196.161467]  ? __pfx_kthread+0x10/0x10
> [  196.161486]  ret_from_fork+0x43/0x70
> [  196.161502]  ? __pfx_kthread+0x10/0x10
> [  196.161518]  ret_from_fork_asm+0x1b/0x30
> [  196.161558]  </TASK>
> [  196.161562] ---[ end trace 0000000000000000 ]---
> 
> [...]

Applied, thanks!

[1/1] power: supply: core: Use blocking_notifier_call_chain to avoid RCU complaint
      commit: bbaa6ffa5b6c9609d3b3c431c389b407eea5441f

Best regards,
diff mbox series

Patch

diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c
index 0b69fb7bafd8..416409e2fd6d 100644
--- a/drivers/power/supply/power_supply_core.c
+++ b/drivers/power/supply/power_supply_core.c
@@ -29,7 +29,7 @@ 
 struct class *power_supply_class;
 EXPORT_SYMBOL_GPL(power_supply_class);
 
-ATOMIC_NOTIFIER_HEAD(power_supply_notifier);
+BLOCKING_NOTIFIER_HEAD(power_supply_notifier);
 EXPORT_SYMBOL_GPL(power_supply_notifier);
 
 static struct device_type power_supply_dev_type;
@@ -97,7 +97,7 @@  static void power_supply_changed_work(struct work_struct *work)
 		class_for_each_device(power_supply_class, NULL, psy,
 				      __power_supply_changed_work);
 		power_supply_update_leds(psy);
-		atomic_notifier_call_chain(&power_supply_notifier,
+		blocking_notifier_call_chain(&power_supply_notifier,
 				PSY_EVENT_PROP_CHANGED, psy);
 		kobject_uevent(&psy->dev.kobj, KOBJ_CHANGE);
 		spin_lock_irqsave(&psy->changed_lock, flags);
@@ -1262,13 +1262,13 @@  static void power_supply_dev_release(struct device *dev)
 
 int power_supply_reg_notifier(struct notifier_block *nb)
 {
-	return atomic_notifier_chain_register(&power_supply_notifier, nb);
+	return blocking_notifier_chain_register(&power_supply_notifier, nb);
 }
 EXPORT_SYMBOL_GPL(power_supply_reg_notifier);
 
 void power_supply_unreg_notifier(struct notifier_block *nb)
 {
-	atomic_notifier_chain_unregister(&power_supply_notifier, nb);
+	blocking_notifier_chain_unregister(&power_supply_notifier, nb);
 }
 EXPORT_SYMBOL_GPL(power_supply_unreg_notifier);
 
diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h
index a427f13c757f..85b86768c0b9 100644
--- a/include/linux/power_supply.h
+++ b/include/linux/power_supply.h
@@ -767,7 +767,7 @@  struct power_supply_battery_info {
 	int bti_resistance_tolerance;
 };
 
-extern struct atomic_notifier_head power_supply_notifier;
+extern struct blocking_notifier_head power_supply_notifier;
 extern int power_supply_reg_notifier(struct notifier_block *nb);
 extern void power_supply_unreg_notifier(struct notifier_block *nb);
 #if IS_ENABLED(CONFIG_POWER_SUPPLY)