On 01/28/2017 12:55 AM, Kalle Valo wrote:
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?

Certainly.

Larry


Reply via email to