Re: git: 87e140a5c6f8 - main - iwlwifi: avoid (hard) hang on loading module
Date: Mon, 09 Dec 2024 19:22:57 UTC
On 9 Dec 2024, at 14:47, Bjoern A. Zeeb <bz@FreeBSD.org> wrote:
>
> The branch main has been updated by bz:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=87e140a5c6f89eea7ea6320d1ae34566492abfc0
>
> commit 87e140a5c6f89eea7ea6320d1ae34566492abfc0
> Author: Bjoern A. Zeeb <bz@FreeBSD.org>
> AuthorDate: 2024-12-08 20:24:10 +0000
> Commit: Bjoern A. Zeeb <bz@FreeBSD.org>
> CommitDate: 2024-12-09 14:45:24 +0000
>
> iwlwifi: avoid (hard) hang on loading module
>
> For certain users or chipsets (reports were for CNVi devices but
> we are not sure if this is limited or specific to them) loading
> if_iwlwifi hangs.
>
> The reason for this is that a SYSINIT (module_load_order()) has not
> yet run in this case and the Linux driver tries to load the
> chipsets-specific module. On FreeBSD all supported sub-modules are
> part of if_iwlwifi so we do not have to load them separately but
> calling into kern_kldload via LinuxKPI request_module while loading
> the module gives us a hard hang.
>
> iwlwifi calls request_module_nowait() so we can simply skip over this
> and continue and the SYSINIT will do the job later if no other
> dependencies fail.
>
> Sponsored by: The FreeBSD Foundation
> MFC after: 3 days
> PR: 282789
> Tested by: Ruslan Makhmatkhanov, Pete Wright
> Differential Revision: https://reviews.freebsd.org/D47994
> ---
> sys/contrib/dev/iwlwifi/iwl-drv.c | 13 +++++++++++++
> 1 file changed, 13 insertions(+)
>
> diff --git a/sys/contrib/dev/iwlwifi/iwl-drv.c b/sys/contrib/dev/iwlwifi/iwl-drv.c
> index 7f4746e5591e..61e5c064de80 100644
> --- a/sys/contrib/dev/iwlwifi/iwl-drv.c
> +++ b/sys/contrib/dev/iwlwifi/iwl-drv.c
> @@ -1749,7 +1749,20 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context)
> goto out_unbind;
> }
> } else {
> +#if defined(__linux__)
> request_module_nowait("%s", op->name);
> +#elif defined(__FreeBSD__)
> + /*
> + * In FreeBSD if_iwlwifi contains all drv modules in a single
> + * module. SYSINIT will do the job later. We cannot call
> + * into kern_kldload() while being called from kern_kldload():
> + * LinuxKPI request_module[_nowait] will hang hard.
> + * Given this is request_module_nowait() we can simply skip it.
> + */
> + if (bootverbose)
> + printf("%s: module '%s' not yet available; will be"
> + "initialized in a moment\n", __func__, op->name);
Missing a space in the string.
Also, why not just have request_module_nowait itself defer the load
until it can be done, at which point it can notice that there’s nothing
to do?
Jess
> +#endif
> }
> mutex_unlock(&iwlwifi_opmode_table_mtx);
>