lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <d3ceaead-5619-4413-acce-64567c08fb27@quicinc.com>
Date: Mon, 26 Aug 2024 11:04:41 +0800
From: Baochen Qiang <quic_bqiang@...cinc.com>
To: Manivannan Sadhasivam <manivannan.sadhasivam@...aro.org>,
        <kvalo@...nel.org>, <jjohnson@...nel.org>
CC: <linux-wireless@...r.kernel.org>, <ath12k@...ts.infradead.org>,
        <linux-kernel@...r.kernel.org>
Subject: Re: [PATCH 1/3] wifi: ath11k: Set IRQ affinity hint after requesting
 all shared IRQs



On 8/23/2024 11:55 PM, Manivannan Sadhasivam wrote:
> If a shared IRQ is used by the driver due to platform limitation, then the
> IRQ affinity hint is set right after the allocation of IRQ vectors in
> ath11k_pci_alloc_msi(). This does no harm unless one of the functions
> requesting the IRQ fails and attempt to free the IRQ. This results in the
> below warning:
> 
> [   29.804276] ath11k_pci 0000:01:00.0: failed to power up mhi: -110
> [   29.810564] ath11k_pci 0000:01:00.0: failed to start mhi: -110
> [   29.816566] ath11k_pci 0000:01:00.0: failed to power up :-110
> [   29.847202] ath11k_pci 0000:01:00.0: failed to create soc core: -110
> [   29.853735] ath11k_pci 0000:01:00.0: failed to init core: -110
> [   29.859745] ------------[ cut here ]------------
> [   29.864486] WARNING: CPU: 7 PID: 349 at kernel/irq/manage.c:1929 free_irq+0x278/0x29c
> [   29.872529] Modules linked in: snd_soc_hdmi_codec ath11k_pci(+) venus_dec venus_enc ath11k videobuf2_dma_contig videobuf2_memops nb7vpq904m lontium_lt9611uxc mcp251xfd mac80211 can_dev libarc4 hci_uart
>  btqca btbcm ax88179_178a usbnet option leds_qcom_lpg usb_wwan led_class_multicolor usbserial crct10dif_ce qcom_pmic_tcpm tcpm venus_core aux_hpd_bridge qcom_spmi_adc_tm5 v4l2_mem2mem qcom_pon qcom_spmi_a
> dc5 videobuf2_v4l2 bluetooth videobuf2_common msm qcom_spmi_temp_alarm rtc_pm8xxx qcom_vadc_common ocmem snd_soc_sm8250 gpu_sched snd_soc_qcom_sdw videodev drm_exec phy_qcom_qmp_combo drm_display_helper s
> nd_soc_qcom_common qcom_stats mc i2c_qcom_geni llcc_qcom spi_geni_qcom drm_dp_aux_bus aux_bridge icc_bwmon typec qcom_rng coresight_stm coresight_tmc coresight_replicator stm_core coresight_funnel soundwi
> re_qcom qrtr pci_pwrctl_pwrseq qcrypto pci_pwrctl_core soundwire_bus snd_soc_lpass_va_macro pinctrl_sm8250_lpass_lpi snd_soc_lpass_wsa_macro authenc lpass_gfm_sm8250 coresight slimbus pinctrl_lpass_lpi
> [   29.872610]  snd_soc_lpass_macro_common qcom_q6v5_pas libdes qcom_pil_info qcom_q6v5 qcom_sysmon qcom_common pwrseq_qcom_wcn qcom_glink_smem mdt_loader pwrseq_core icc_osm_l3 qmi_helpers qcom_wdt socin
> fo display_connector drm_kms_helper cfg80211 rfkill fuse drm backlight ip_tables x_tables ipv6
> [   29.990067] CPU: 7 UID: 0 PID: 349 Comm: (udev-worker) Not tainted 6.11-rc4 #50
> [   29.997564] Hardware name: Qualcomm Technologies, Inc. Robotics RB5 (DT)
> [   30.004446] pstate: 604000c5 (nZCv daIF +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
> [   30.011591] pc : free_irq+0x278/0x29c
> [   30.015355] lr : free_irq+0xb4/0x29c
> [   30.019030] sp : ffff800081f236e0
> [   30.022441] x29: ffff800081f236e0 x28: ffff64630d260000 x27: ffffd8d89a8c3458
> [   30.029764] x26: ffff64630d26ac00 x25: 00000000000000d6 x24: ffff6463029c58dc
> [   30.037086] x23: ffff6463029c5990 x22: ffff64630d261c58 x21: 0000000000000000
> [   30.044408] x20: ffff646301431c00 x19: ffff6463029c5800 x18: 0000000000000010
> [   30.051730] x17: 0000000000010108 x16: ffffd8d8f1d8b840 x15: 0763072007740769
> [   30.059051] x14: 000000000000030d x13: ffff646306b35ae8 x12: ffffd8d8f3852b80
> [   30.066374] x11: ffff646306b356c0 x10: 0000000000000000 x9 : 00000000000000d6
> [   30.073696] x8 : 000000000000000f x7 : 1fffec8c605626a1 x6 : ffffd8d8f2e602b8
> [   30.081017] x5 : 0000000000000030 x4 : ffff646302b13580 x3 : ffff646301431c98
> [   30.088339] x2 : 0000000000200880 x1 : ffff646301431c00 x0 : ffffd8d8f2b2c1b8
> [   30.095662] Call trace:
> [   30.098183]  free_irq+0x278/0x29c
> [   30.101595]  ath11k_pcic_free_irq+0x70/0x10c [ath11k]
> [   30.106800]  ath11k_pci_probe+0x800/0x820 [ath11k_pci]
> [   30.112081]  local_pci_probe+0x40/0xbc
> [   30.115934]  pci_device_probe+0x1d4/0x1e8
> [   30.120049]  really_probe+0xbc/0x268
> [   30.123727]  __driver_probe_device+0x78/0x12c
> [   30.128204]  driver_probe_device+0x40/0x11c
> [   30.132505]  __driver_attach+0x74/0x124
> [   30.136445]  bus_for_each_dev+0x78/0xe0
> [   30.140383]  driver_attach+0x24/0x30
> [   30.144059]  bus_add_driver+0xe4/0x208
> [   30.147910]  driver_register+0x60/0x128
> [   30.151849]  __pci_register_driver+0x44/0x50
> [   30.156238]  ath11k_pci_init+0x2c/0x6c [ath11k_pci]
> [   30.161242]  do_one_initcall+0x70/0x1b8
> [   30.165182]  do_init_module+0x5c/0x1f0
> [   30.169034]  load_module+0x19f0/0x1abc
> [   30.172884]  init_module_from_file+0x88/0xc8
> [   30.177273]  __arm64_sys_finit_module+0x1c4/0x2b0
> [   30.182102]  invoke_syscall+0x44/0x100
> [   30.185953]  el0_svc_common.constprop.0+0xc0/0xe0
> [   30.190783]  do_el0_svc+0x1c/0x28
> [   30.194196]  el0_svc+0x34/0xdc
> [   30.197335]  el0t_64_sync_handler+0xc0/0xc4
> [   30.201635]  el0t_64_sync+0x190/0x194
> [   30.205399] ---[ end trace 0000000000000000 ]---
> [   30.432731] ath11k_pci 0000:01:00.0: probe with driver ath11k_pci failed with error -110
> 
> The warning is due to not clearing the affinity hint before freeing the
> IRQ.
> 
> So to fix this, let's set the IRQ affinity hint after requesting all the
> shared IRQ. This will make sure that the affinity hint gets cleared in the
> error path before freeing the IRQ.
if you check 39564b475ac5 ("wifi: ath11k: fix boot failure with one MSI vector") you would see that the hint is set before requesting any IRQ for a purpose.

> 
> Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-05266-QCAHSTSWPLZ_V2_TO_X86-1
> 
> Cc: Baochen Qiang <quic_bqiang@...cinc.com>
> Fixes: e94b07493da3 ("ath11k: Set IRQ affinity to CPU0 in case of one MSI vector")
> Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@...aro.org>
> ---
>  drivers/net/wireless/ath/ath11k/pci.c | 24 ++++++++++++------------
>  1 file changed, 12 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/net/wireless/ath/ath11k/pci.c b/drivers/net/wireless/ath/ath11k/pci.c
> index 8d63b84d1261..0c22e18e65c7 100644
> --- a/drivers/net/wireless/ath/ath11k/pci.c
> +++ b/drivers/net/wireless/ath/ath11k/pci.c
> @@ -886,16 +886,10 @@ static int ath11k_pci_probe(struct pci_dev *pdev,
>  	if (ret)
>  		goto err_pci_disable_msi;
>  
> -	ret = ath11k_pci_set_irq_affinity_hint(ab_pci, cpumask_of(0));
> -	if (ret) {
> -		ath11k_err(ab, "failed to set irq affinity %d\n", ret);
> -		goto err_pci_disable_msi;
> -	}
> -
>  	ret = ath11k_mhi_register(ab_pci);
>  	if (ret) {
>  		ath11k_err(ab, "failed to register mhi: %d\n", ret);
> -		goto err_irq_affinity_cleanup;
> +		goto err_pci_disable_msi;
>  	}
>  
>  	ret = ath11k_hal_srng_init(ab);
> @@ -916,6 +910,12 @@ static int ath11k_pci_probe(struct pci_dev *pdev,
>  		goto err_ce_free;
>  	}
>  
> +	ret = ath11k_pci_set_irq_affinity_hint(ab_pci, cpumask_of(0));
> +	if (ret) {
> +		ath11k_err(ab, "failed to set irq affinity %d\n", ret);
> +		goto err_free_irq;
> +	}
> +
>  	/* kernel may allocate a dummy vector before request_irq and
>  	 * then allocate a real vector when request_irq is called.
>  	 * So get msi_data here again to avoid spurious interrupt
> @@ -924,17 +924,20 @@ static int ath11k_pci_probe(struct pci_dev *pdev,
>  	ret = ath11k_pci_config_msi_data(ab_pci);
>  	if (ret) {
>  		ath11k_err(ab, "failed to config msi_data: %d\n", ret);
> -		goto err_free_irq;
> +		goto err_irq_affinity_cleanup;
>  	}
>  
>  	ret = ath11k_core_init(ab);
>  	if (ret) {
>  		ath11k_err(ab, "failed to init core: %d\n", ret);
> -		goto err_free_irq;
> +		goto err_irq_affinity_cleanup;
>  	}
>  	ath11k_qmi_fwreset_from_cold_boot(ab);
>  	return 0;
>  
> +err_irq_affinity_cleanup:
> +	ath11k_pci_set_irq_affinity_hint(ab_pci, NULL);
> +
>  err_free_irq:
>  	ath11k_pcic_free_irq(ab);
>  
> @@ -947,9 +950,6 @@ static int ath11k_pci_probe(struct pci_dev *pdev,
>  err_mhi_unregister:
>  	ath11k_mhi_unregister(ab_pci);
>  
> -err_irq_affinity_cleanup:
> -	ath11k_pci_set_irq_affinity_hint(ab_pci, NULL);
> -
>  err_pci_disable_msi:
>  	ath11k_pci_free_msi(ab_pci);
>  

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ