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

Reply via email to