Larry Finger <[email protected]> writes:
> From: Ping-Ke Shih <[email protected]>
>
> btcoex needs to sleep, thus it must run in thread context.
>
> Signed-off-by: Ping-Ke Shih <[email protected]>
> Signed-off-by: Larry Finger <[email protected]>
[...]
> +void rtl_c2hcmd_launcher(struct ieee80211_hw *hw, int exec)
> +{
> + struct rtl_priv *rtlpriv = rtl_priv(hw);
> + unsigned long flags;
> + struct rtl_c2hcmd *c2hcmd;
> +
> + while (true) {
> + /* dequeue a task */
> + spin_lock_irqsave(&rtlpriv->locks.c2hcmd_lock, flags);
> +
> + c2hcmd = list_first_entry_or_null(&rtlpriv->c2hcmd_list,
> + struct rtl_c2hcmd, list);
> +
> + if (c2hcmd)
> + list_del(&c2hcmd->list);
> +
> + spin_unlock_irqrestore(&rtlpriv->locks.c2hcmd_lock, flags);
> +
> + /* do it */
> + if (!c2hcmd)
> + break;
> +
> + if (rtlpriv->cfg->ops->c2h_content_parsing && exec)
> + rtlpriv->cfg->ops->c2h_content_parsing(hw,
> + c2hcmd->tag, c2hcmd->len, c2hcmd->val);
> +
> + /* free */
> + kfree(c2hcmd->val);
> +
> + kfree(c2hcmd);
> + }
> +}
Never ending loops are not really preferred in kernel, with a simple bug
it could cause annoying system-wide problems. Can you add a some sort of
failsafe mechanism, for example bailing out from the loop if it has been
running more than 200 ms or something like that?
--
Kalle Valo